diff --git a/api/ttn/lorawan/v3/api.md b/api/ttn/lorawan/v3/api.md index f4bd7342ab..82623b4f31 100644 --- a/api/ttn/lorawan/v3/api.md +++ b/api/ttn/lorawan/v3/api.md @@ -273,8 +273,14 @@ - [Message `MACState.UplinkMessage`](#ttn.lorawan.v3.MACState.UplinkMessage) - [Message `MACState.UplinkMessage.RxMetadata`](#ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata) - [Message `MACState.UplinkMessage.RxMetadata.PacketBrokerMetadata`](#ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.PacketBrokerMetadata) + - [Message `MACState.UplinkMessage.RxMetadata.RelayMetadata`](#ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.RelayMetadata) - [Message `MACState.UplinkMessage.TxSettings`](#ttn.lorawan.v3.MACState.UplinkMessage.TxSettings) + - [Message `RelayParameters`](#ttn.lorawan.v3.RelayParameters) - [Message `ResetAndGetEndDeviceRequest`](#ttn.lorawan.v3.ResetAndGetEndDeviceRequest) + - [Message `ServedRelayParameters`](#ttn.lorawan.v3.ServedRelayParameters) + - [Message `ServingRelayParameters`](#ttn.lorawan.v3.ServingRelayParameters) + - [Message `ServingRelayParameters.ForwardingLimits`](#ttn.lorawan.v3.ServingRelayParameters.ForwardingLimits) + - [Message `ServingRelayParameters.UplinkForwardingRule`](#ttn.lorawan.v3.ServingRelayParameters.UplinkForwardingRule) - [Message `Session`](#ttn.lorawan.v3.Session) - [Message `SetEndDeviceRequest`](#ttn.lorawan.v3.SetEndDeviceRequest) - [Message `UpdateEndDeviceRequest`](#ttn.lorawan.v3.UpdateEndDeviceRequest) @@ -472,6 +478,19 @@ - [Message `MACCommand.RejoinParamSetupReq`](#ttn.lorawan.v3.MACCommand.RejoinParamSetupReq) - [Message `MACCommand.RekeyConf`](#ttn.lorawan.v3.MACCommand.RekeyConf) - [Message `MACCommand.RekeyInd`](#ttn.lorawan.v3.MACCommand.RekeyInd) + - [Message `MACCommand.RelayConfAns`](#ttn.lorawan.v3.MACCommand.RelayConfAns) + - [Message `MACCommand.RelayConfReq`](#ttn.lorawan.v3.MACCommand.RelayConfReq) + - [Message `MACCommand.RelayConfReq.Configuration`](#ttn.lorawan.v3.MACCommand.RelayConfReq.Configuration) + - [Message `MACCommand.RelayConfigureFwdLimitAns`](#ttn.lorawan.v3.MACCommand.RelayConfigureFwdLimitAns) + - [Message `MACCommand.RelayConfigureFwdLimitReq`](#ttn.lorawan.v3.MACCommand.RelayConfigureFwdLimitReq) + - [Message `MACCommand.RelayCtrlUplinkListAns`](#ttn.lorawan.v3.MACCommand.RelayCtrlUplinkListAns) + - [Message `MACCommand.RelayCtrlUplinkListReq`](#ttn.lorawan.v3.MACCommand.RelayCtrlUplinkListReq) + - [Message `MACCommand.RelayEndDeviceConfAns`](#ttn.lorawan.v3.MACCommand.RelayEndDeviceConfAns) + - [Message `MACCommand.RelayEndDeviceConfReq`](#ttn.lorawan.v3.MACCommand.RelayEndDeviceConfReq) + - [Message `MACCommand.RelayEndDeviceConfReq.Configuration`](#ttn.lorawan.v3.MACCommand.RelayEndDeviceConfReq.Configuration) + - [Message `MACCommand.RelayNotifyNewEndDeviceReq`](#ttn.lorawan.v3.MACCommand.RelayNotifyNewEndDeviceReq) + - [Message `MACCommand.RelayUpdateUplinkListAns`](#ttn.lorawan.v3.MACCommand.RelayUpdateUplinkListAns) + - [Message `MACCommand.RelayUpdateUplinkListReq`](#ttn.lorawan.v3.MACCommand.RelayUpdateUplinkListReq) - [Message `MACCommand.ResetConf`](#ttn.lorawan.v3.MACCommand.ResetConf) - [Message `MACCommand.ResetInd`](#ttn.lorawan.v3.MACCommand.ResetInd) - [Message `MACCommand.RxParamSetupAns`](#ttn.lorawan.v3.MACCommand.RxParamSetupAns) @@ -484,6 +503,15 @@ - [Message `Message`](#ttn.lorawan.v3.Message) - [Message `PingSlotPeriodValue`](#ttn.lorawan.v3.PingSlotPeriodValue) - [Message `RejoinRequestPayload`](#ttn.lorawan.v3.RejoinRequestPayload) + - [Message `RelayEndDeviceAlwaysMode`](#ttn.lorawan.v3.RelayEndDeviceAlwaysMode) + - [Message `RelayEndDeviceControlledMode`](#ttn.lorawan.v3.RelayEndDeviceControlledMode) + - [Message `RelayEndDeviceDynamicMode`](#ttn.lorawan.v3.RelayEndDeviceDynamicMode) + - [Message `RelayForwardDownlinkReq`](#ttn.lorawan.v3.RelayForwardDownlinkReq) + - [Message `RelayForwardLimits`](#ttn.lorawan.v3.RelayForwardLimits) + - [Message `RelayForwardUplinkReq`](#ttn.lorawan.v3.RelayForwardUplinkReq) + - [Message `RelaySecondChannel`](#ttn.lorawan.v3.RelaySecondChannel) + - [Message `RelayUplinkForwardLimits`](#ttn.lorawan.v3.RelayUplinkForwardLimits) + - [Message `RelayUplinkToken`](#ttn.lorawan.v3.RelayUplinkToken) - [Message `RxDelayValue`](#ttn.lorawan.v3.RxDelayValue) - [Message `TxRequest`](#ttn.lorawan.v3.TxRequest) - [Message `TxSettings`](#ttn.lorawan.v3.TxSettings) @@ -510,6 +538,13 @@ - [Enum `RejoinPeriodExponent`](#ttn.lorawan.v3.RejoinPeriodExponent) - [Enum `RejoinRequestType`](#ttn.lorawan.v3.RejoinRequestType) - [Enum `RejoinTimeExponent`](#ttn.lorawan.v3.RejoinTimeExponent) + - [Enum `RelayCADPeriodicity`](#ttn.lorawan.v3.RelayCADPeriodicity) + - [Enum `RelayCtrlUplinkListAction`](#ttn.lorawan.v3.RelayCtrlUplinkListAction) + - [Enum `RelayLimitBucketSize`](#ttn.lorawan.v3.RelayLimitBucketSize) + - [Enum `RelayResetLimitCounter`](#ttn.lorawan.v3.RelayResetLimitCounter) + - [Enum `RelaySecondChAckOffset`](#ttn.lorawan.v3.RelaySecondChAckOffset) + - [Enum `RelaySmartEnableLevel`](#ttn.lorawan.v3.RelaySmartEnableLevel) + - [Enum `RelayWORChannel`](#ttn.lorawan.v3.RelayWORChannel) - [Enum `RxDelay`](#ttn.lorawan.v3.RxDelay) - [Enum `TxSchedulePriority`](#ttn.lorawan.v3.TxSchedulePriority) - [File `ttn/lorawan/v3/messages.proto`](#ttn/lorawan/v3/messages.proto) @@ -542,6 +577,7 @@ - [Message `Location`](#ttn.lorawan.v3.Location) - [Message `PacketBrokerMetadata`](#ttn.lorawan.v3.PacketBrokerMetadata) - [Message `PacketBrokerRouteHop`](#ttn.lorawan.v3.PacketBrokerRouteHop) + - [Message `RelayMetadata`](#ttn.lorawan.v3.RelayMetadata) - [Message `RxMetadata`](#ttn.lorawan.v3.RxMetadata) - [Enum `LocationSource`](#ttn.lorawan.v3.LocationSource) - [File `ttn/lorawan/v3/mqtt.proto`](#ttn/lorawan/v3/mqtt.proto) @@ -4007,11 +4043,12 @@ This is used internally by the Network Server. | `ping_slot_data_rate_index` | [`DataRateIndex`](#ttn.lorawan.v3.DataRateIndex) | | Data rate index of the class B ping slot. This field is deprecated, use ping_slot_data_rate_index_value instead. | | `beacon_frequency` | [`uint64`](#uint64) | | Frequency of the class B beacon (Hz). | | `channels` | [`MACParameters.Channel`](#ttn.lorawan.v3.MACParameters.Channel) | repeated | Configured uplink channels and optionally Rx1 frequency. | -| `uplink_dwell_time` | [`BoolValue`](#ttn.lorawan.v3.BoolValue) | | Whether uplink dwell time is set (400ms). If this field is not set, then the value is either unknown or irrelevant(Network Server cannot modify it). | -| `downlink_dwell_time` | [`BoolValue`](#ttn.lorawan.v3.BoolValue) | | Whether downlink dwell time is set (400ms). If this field is not set, then the value is either unknown or irrelevant(Network Server cannot modify it). | +| `uplink_dwell_time` | [`BoolValue`](#ttn.lorawan.v3.BoolValue) | | Whether uplink dwell time is set (400ms). If unset, then the value is either unknown or irrelevant(Network Server cannot modify it). | +| `downlink_dwell_time` | [`BoolValue`](#ttn.lorawan.v3.BoolValue) | | Whether downlink dwell time is set (400ms). If unset, then the value is either unknown or irrelevant(Network Server cannot modify it). | | `adr_ack_limit_exponent` | [`ADRAckLimitExponentValue`](#ttn.lorawan.v3.ADRAckLimitExponentValue) | | ADR: number of messages to wait before setting ADRAckReq. | | `adr_ack_delay_exponent` | [`ADRAckDelayExponentValue`](#ttn.lorawan.v3.ADRAckDelayExponentValue) | | ADR: number of messages to wait after setting ADRAckReq and before changing TxPower or DataRate. | | `ping_slot_data_rate_index_value` | [`DataRateIndexValue`](#ttn.lorawan.v3.DataRateIndexValue) | | Data rate index of the class B ping slot. | +| `relay` | [`RelayParameters`](#ttn.lorawan.v3.RelayParameters) | | Relay parameters. | #### Field Rules @@ -4088,6 +4125,8 @@ This is used internally by the Network Server. | `downlink_dwell_time` | [`BoolValue`](#ttn.lorawan.v3.BoolValue) | | Whether downlink dwell time is set (400ms). If unset, the default value from Network Server configuration or regional parameters specification will be used. | | `adr` | [`ADRSettings`](#ttn.lorawan.v3.ADRSettings) | | Adaptive Data Rate settings. If unset, the default value from Network Server configuration or regional parameters specification will be used. | | `schedule_downlinks` | [`BoolValue`](#ttn.lorawan.v3.BoolValue) | | Whether or not downlink messages should be scheduled. This option can be used in order to disable any downlink interaction with the end device. It will affect all types of downlink messages: data and MAC downlinks, and join accepts. | +| `relay` | [`RelayParameters`](#ttn.lorawan.v3.RelayParameters) | | The relay parameters the end device is using. If unset, the default value from Network Server configuration or regional parameters specification will be used. | +| `desired_relay` | [`RelayParameters`](#ttn.lorawan.v3.RelayParameters) | | The relay parameters the Network Server should configure device to use via MAC commands. If unset, the default value from Network Server configuration or regional parameters specification will be used. | #### Field Rules @@ -4126,6 +4165,7 @@ This is used internally by the Network Server. | `rejected_data_rate_ranges` | [`MACState.RejectedDataRateRangesEntry`](#ttn.lorawan.v3.MACState.RejectedDataRateRangesEntry) | repeated | Data rate ranges rejected by the device per frequency. | | `last_adr_change_f_cnt_up` | [`uint32`](#uint32) | | Frame counter of uplink, which confirmed the last ADR parameter change. | | `recent_mac_command_identifiers` | [`MACCommandIdentifier`](#ttn.lorawan.v3.MACCommandIdentifier) | repeated | MAC command identifiers sent by the end device in the last received uplink. The Network Server may choose to store only certain types of MAC command identifiers in the underlying implementation. | +| `pending_relay_downlink` | [`RelayForwardDownlinkReq`](#ttn.lorawan.v3.RelayForwardDownlinkReq) | | Pending relay downlink contents. The pending downlink will be scheduled to the relay in either Rx1 or Rx2. The pending downlink will be cleared after the scheduling attempt. | #### Field Rules @@ -4296,6 +4336,7 @@ Used for type safe recent uplink storage. | `downlink_path_constraint` | [`DownlinkPathConstraint`](#ttn.lorawan.v3.DownlinkPathConstraint) | | | | `uplink_token` | [`bytes`](#bytes) | | | | `packet_broker` | [`MACState.UplinkMessage.RxMetadata.PacketBrokerMetadata`](#ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.PacketBrokerMetadata) | | | +| `relay` | [`MACState.UplinkMessage.RxMetadata.RelayMetadata`](#ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.RelayMetadata) | | | #### Field Rules @@ -4306,6 +4347,8 @@ Used for type safe recent uplink storage. ### Message `MACState.UplinkMessage.RxMetadata.PacketBrokerMetadata` +### Message `MACState.UplinkMessage.RxMetadata.RelayMetadata` + ### Message `MACState.UplinkMessage.TxSettings` | Field | Type | Label | Description | @@ -4318,6 +4361,16 @@ Used for type safe recent uplink storage. | ----- | ----------- | | `data_rate` |

`message.required`: `true`

| +### Message `RelayParameters` + +RelayParameters represent the parameters of a relay. +This is used internally by the Network Server. + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `serving` | [`ServingRelayParameters`](#ttn.lorawan.v3.ServingRelayParameters) | | Parameters related to a relay which is serving end devices. | +| `served` | [`ServedRelayParameters`](#ttn.lorawan.v3.ServedRelayParameters) | | Parameters related to an end device served by a relay. | + ### Message `ResetAndGetEndDeviceRequest` | Field | Type | Label | Description | @@ -4331,6 +4384,67 @@ Used for type safe recent uplink storage. | ----- | ----------- | | `end_device_ids` |

`message.required`: `true`

| +### Message `ServedRelayParameters` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `always` | [`RelayEndDeviceAlwaysMode`](#ttn.lorawan.v3.RelayEndDeviceAlwaysMode) | | The end device will always attempt to use the relay mode in order to send uplink messages. | +| `dynamic` | [`RelayEndDeviceDynamicMode`](#ttn.lorawan.v3.RelayEndDeviceDynamicMode) | | The end device will attempt to use relay mode only after a number of uplink messages have been sent without receiving a valid a downlink message. | +| `end_device_controlled` | [`RelayEndDeviceControlledMode`](#ttn.lorawan.v3.RelayEndDeviceControlledMode) | | The end device will control when it uses the relay mode. This is the default mode. | +| `backoff` | [`uint32`](#uint32) | | Number of uplinks to be sent without a wake on radio frame. | +| `second_channel` | [`RelaySecondChannel`](#ttn.lorawan.v3.RelaySecondChannel) | | Second wake on radio channel configuration. | +| `serving_device_id` | [`string`](#string) | | End device identifier of the serving end device. | + +#### Field Rules + +| Field | Validations | +| ----- | ----------- | +| `backoff` |

`uint32.lte`: `63`

| +| `serving_device_id` |

`string.max_len`: `36`

`string.pattern`: `^[a-z0-9](?:[-]?[a-z0-9]){2,}$`

| + +### Message `ServingRelayParameters` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `second_channel` | [`RelaySecondChannel`](#ttn.lorawan.v3.RelaySecondChannel) | | Second wake on radio channel configuration. | +| `default_channel_index` | [`uint32`](#uint32) | | Index of the default wake on radio channel. | +| `cad_periodicity` | [`RelayCADPeriodicity`](#ttn.lorawan.v3.RelayCADPeriodicity) | | Channel activity detection periodicity. | +| `uplink_forwarding_rules` | [`ServingRelayParameters.UplinkForwardingRule`](#ttn.lorawan.v3.ServingRelayParameters.UplinkForwardingRule) | repeated | Configured uplink forwarding rules. | +| `limits` | [`ServingRelayParameters.ForwardingLimits`](#ttn.lorawan.v3.ServingRelayParameters.ForwardingLimits) | | Configured forwarding limits. If unset, the default value from Network Server configuration will be used. | + +#### Field Rules + +| Field | Validations | +| ----- | ----------- | +| `default_channel_index` |

`uint32.lte`: `255`

| +| `cad_periodicity` |

`enum.defined_only`: `true`

| +| `uplink_forwarding_rules` |

`repeated.max_items`: `16`

| + +### Message `ServingRelayParameters.ForwardingLimits` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `reset_behavior` | [`RelayResetLimitCounter`](#ttn.lorawan.v3.RelayResetLimitCounter) | | Reset behavior of the buckets upon limit update. | +| `join_requests` | [`RelayForwardLimits`](#ttn.lorawan.v3.RelayForwardLimits) | | Bucket configuration for join requests. If unset, no individual limits will apply to join requests, but the relay overall limitations will apply. | +| `notifications` | [`RelayForwardLimits`](#ttn.lorawan.v3.RelayForwardLimits) | | Bucket configuration for unknown device notifications. If unset, no individual limits will apply to unknown end device notifications, but the relay overall limitations will still apply. | +| `uplink_messages` | [`RelayForwardLimits`](#ttn.lorawan.v3.RelayForwardLimits) | | Bucket configuration for uplink messages across all served end devices. If unset, no individual limits will apply to uplink messages across all served end devices, but the relay overall limitations will still apply. | +| `overall` | [`RelayForwardLimits`](#ttn.lorawan.v3.RelayForwardLimits) | | Bucket configuration for all relay messages. If unset, no overall limits will apply to the relay, but individual limitations will still apply. | + +### Message `ServingRelayParameters.UplinkForwardingRule` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `limits` | [`RelayUplinkForwardLimits`](#ttn.lorawan.v3.RelayUplinkForwardLimits) | | Bucket configuration for the served end device. If unset, no individual limits will apply to the end device, but the relay global limitations will apply. | +| `last_w_f_cnt` | [`uint32`](#uint32) | | Last wake on radio frame counter used by the served end device. | +| `device_id` | [`string`](#string) | | End device identifier of the served end device. | +| `session_key_id` | [`bytes`](#bytes) | | Session key ID of the session keys used to derive the root relay session key. | + +#### Field Rules + +| Field | Validations | +| ----- | ----------- | +| `device_id` |

`string.max_len`: `36`

`string.pattern`: `^[a-z0-9](?:[-]?[a-z0-9]){2,}$`

| + ### Message `Session` | Field | Type | Label | Description | @@ -6461,6 +6575,17 @@ Only the components for which the keys were meant, will have the key-encryption- | `beacon_freq_ans` | [`MACCommand.BeaconFreqAns`](#ttn.lorawan.v3.MACCommand.BeaconFreqAns) | | | | `device_mode_ind` | [`MACCommand.DeviceModeInd`](#ttn.lorawan.v3.MACCommand.DeviceModeInd) | | | | `device_mode_conf` | [`MACCommand.DeviceModeConf`](#ttn.lorawan.v3.MACCommand.DeviceModeConf) | | | +| `relay_conf_req` | [`MACCommand.RelayConfReq`](#ttn.lorawan.v3.MACCommand.RelayConfReq) | | | +| `relay_conf_ans` | [`MACCommand.RelayConfAns`](#ttn.lorawan.v3.MACCommand.RelayConfAns) | | | +| `relay_end_device_conf_req` | [`MACCommand.RelayEndDeviceConfReq`](#ttn.lorawan.v3.MACCommand.RelayEndDeviceConfReq) | | | +| `relay_end_device_conf_ans` | [`MACCommand.RelayEndDeviceConfAns`](#ttn.lorawan.v3.MACCommand.RelayEndDeviceConfAns) | | | +| `relay_update_uplink_list_req` | [`MACCommand.RelayUpdateUplinkListReq`](#ttn.lorawan.v3.MACCommand.RelayUpdateUplinkListReq) | | | +| `relay_update_uplink_list_ans` | [`MACCommand.RelayUpdateUplinkListAns`](#ttn.lorawan.v3.MACCommand.RelayUpdateUplinkListAns) | | | +| `relay_ctrl_uplink_list_req` | [`MACCommand.RelayCtrlUplinkListReq`](#ttn.lorawan.v3.MACCommand.RelayCtrlUplinkListReq) | | | +| `relay_ctrl_uplink_list_ans` | [`MACCommand.RelayCtrlUplinkListAns`](#ttn.lorawan.v3.MACCommand.RelayCtrlUplinkListAns) | | | +| `relay_configure_fwd_limit_req` | [`MACCommand.RelayConfigureFwdLimitReq`](#ttn.lorawan.v3.MACCommand.RelayConfigureFwdLimitReq) | | | +| `relay_configure_fwd_limit_ans` | [`MACCommand.RelayConfigureFwdLimitAns`](#ttn.lorawan.v3.MACCommand.RelayConfigureFwdLimitAns) | | | +| `relay_notify_new_end_device_req` | [`MACCommand.RelayNotifyNewEndDeviceReq`](#ttn.lorawan.v3.MACCommand.RelayNotifyNewEndDeviceReq) | | | #### Field Rules @@ -6759,6 +6884,142 @@ Only the components for which the keys were meant, will have the key-encryption- | ----- | ----------- | | `minor_version` |

`enum.defined_only`: `true`

| +### Message `MACCommand.RelayConfAns` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `second_channel_frequency_ack` | [`bool`](#bool) | | | +| `second_channel_ack_offset_ack` | [`bool`](#bool) | | | +| `second_channel_data_rate_index_ack` | [`bool`](#bool) | | | +| `second_channel_index_ack` | [`bool`](#bool) | | | +| `default_channel_index_ack` | [`bool`](#bool) | | | +| `cad_periodicity_ack` | [`bool`](#bool) | | | + +### Message `MACCommand.RelayConfReq` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `configuration` | [`MACCommand.RelayConfReq.Configuration`](#ttn.lorawan.v3.MACCommand.RelayConfReq.Configuration) | | | + +### Message `MACCommand.RelayConfReq.Configuration` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `second_channel` | [`RelaySecondChannel`](#ttn.lorawan.v3.RelaySecondChannel) | | | +| `default_channel_index` | [`uint32`](#uint32) | | | +| `cad_periodicity` | [`RelayCADPeriodicity`](#ttn.lorawan.v3.RelayCADPeriodicity) | | | + +#### Field Rules + +| Field | Validations | +| ----- | ----------- | +| `default_channel_index` |

`uint32.lte`: `255`

| +| `cad_periodicity` |

`enum.defined_only`: `true`

| + +### Message `MACCommand.RelayConfigureFwdLimitAns` + +### Message `MACCommand.RelayConfigureFwdLimitReq` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `reset_limit_counter` | [`RelayResetLimitCounter`](#ttn.lorawan.v3.RelayResetLimitCounter) | | | +| `join_request_limits` | [`RelayForwardLimits`](#ttn.lorawan.v3.RelayForwardLimits) | | | +| `notify_limits` | [`RelayForwardLimits`](#ttn.lorawan.v3.RelayForwardLimits) | | | +| `global_uplink_limits` | [`RelayForwardLimits`](#ttn.lorawan.v3.RelayForwardLimits) | | | +| `overall_limits` | [`RelayForwardLimits`](#ttn.lorawan.v3.RelayForwardLimits) | | | + +### Message `MACCommand.RelayCtrlUplinkListAns` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `rule_index_ack` | [`bool`](#bool) | | | +| `w_f_cnt` | [`uint32`](#uint32) | | | + +### Message `MACCommand.RelayCtrlUplinkListReq` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `rule_index` | [`uint32`](#uint32) | | | +| `action` | [`RelayCtrlUplinkListAction`](#ttn.lorawan.v3.RelayCtrlUplinkListAction) | | | + +#### Field Rules + +| Field | Validations | +| ----- | ----------- | +| `rule_index` |

`uint32.lte`: `15`

| + +### Message `MACCommand.RelayEndDeviceConfAns` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `second_channel_frequency_ack` | [`bool`](#bool) | | | +| `second_channel_data_rate_index_ack` | [`bool`](#bool) | | | +| `second_channel_index_ack` | [`bool`](#bool) | | | +| `backoff_ack` | [`bool`](#bool) | | | + +### Message `MACCommand.RelayEndDeviceConfReq` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `configuration` | [`MACCommand.RelayEndDeviceConfReq.Configuration`](#ttn.lorawan.v3.MACCommand.RelayEndDeviceConfReq.Configuration) | | | + +### Message `MACCommand.RelayEndDeviceConfReq.Configuration` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `always` | [`RelayEndDeviceAlwaysMode`](#ttn.lorawan.v3.RelayEndDeviceAlwaysMode) | | | +| `dynamic` | [`RelayEndDeviceDynamicMode`](#ttn.lorawan.v3.RelayEndDeviceDynamicMode) | | | +| `end_device_controlled` | [`RelayEndDeviceControlledMode`](#ttn.lorawan.v3.RelayEndDeviceControlledMode) | | | +| `backoff` | [`uint32`](#uint32) | | | +| `second_channel` | [`RelaySecondChannel`](#ttn.lorawan.v3.RelaySecondChannel) | | | +| `serving_device_id` | [`string`](#string) | | | + +#### Field Rules + +| Field | Validations | +| ----- | ----------- | +| `backoff` |

`uint32.lte`: `63`

| +| `serving_device_id` |

`string.max_len`: `36`

`string.pattern`: `^[a-z0-9](?:[-]?[a-z0-9]){2,}$`

| + +### Message `MACCommand.RelayNotifyNewEndDeviceReq` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `dev_addr` | [`bytes`](#bytes) | | | +| `snr` | [`int32`](#int32) | | | +| `rssi` | [`int32`](#int32) | | | + +#### Field Rules + +| Field | Validations | +| ----- | ----------- | +| `dev_addr` |

`bytes.len`: `4`

| +| `snr` |

`int32.lte`: `11`

`int32.gte`: `-20`

| +| `rssi` |

`int32.lte`: `-15`

`int32.gte`: `-142`

| + +### Message `MACCommand.RelayUpdateUplinkListAns` + +### Message `MACCommand.RelayUpdateUplinkListReq` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `rule_index` | [`uint32`](#uint32) | | | +| `forward_limits` | [`RelayUplinkForwardLimits`](#ttn.lorawan.v3.RelayUplinkForwardLimits) | | | +| `dev_addr` | [`bytes`](#bytes) | | | +| `w_f_cnt` | [`uint32`](#uint32) | | | +| `root_wor_s_key` | [`bytes`](#bytes) | | | +| `device_id` | [`string`](#string) | | | +| `session_key_id` | [`bytes`](#bytes) | | | + +#### Field Rules + +| Field | Validations | +| ----- | ----------- | +| `rule_index` |

`uint32.lte`: `15`

| +| `dev_addr` |

`bytes.len`: `4`

| +| `root_wor_s_key` |

`bytes.len`: `16`

| +| `device_id` |

`string.max_len`: `36`

`string.pattern`: `^[a-z0-9](?:[-]?[a-z0-9]){2,}$`

| + ### Message `MACCommand.ResetConf` | Field | Type | Label | Description | @@ -6921,6 +7182,107 @@ Message represents a LoRaWAN message | `join_eui` |

`bytes.len`: `8`

| | `dev_eui` |

`bytes.len`: `8`

| +### Message `RelayEndDeviceAlwaysMode` + +### Message `RelayEndDeviceControlledMode` + +### Message `RelayEndDeviceDynamicMode` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `smart_enable_level` | [`RelaySmartEnableLevel`](#ttn.lorawan.v3.RelaySmartEnableLevel) | | The number of consecutive uplinks without a valid downlink before the end device attempts to use the relay mode to transmit messages. | + +#### Field Rules + +| Field | Validations | +| ----- | ----------- | +| `smart_enable_level` |

`enum.defined_only`: `true`

| + +### Message `RelayForwardDownlinkReq` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `raw_payload` | [`bytes`](#bytes) | | | + +### Message `RelayForwardLimits` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `bucket_size` | [`RelayLimitBucketSize`](#ttn.lorawan.v3.RelayLimitBucketSize) | | The multiplier used to compute the total bucket size for the limits. The multiplier is multiplied by the reload rate in order to compute the total bucket size. | +| `reload_rate` | [`uint32`](#uint32) | | The number of tokens which are replenished in the bucket every hour. | + +#### Field Rules + +| Field | Validations | +| ----- | ----------- | +| `bucket_size` |

`enum.defined_only`: `true`

| +| `reload_rate` |

`uint32.lte`: `126`

| + +### Message `RelayForwardUplinkReq` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `data_rate` | [`DataRate`](#ttn.lorawan.v3.DataRate) | | | +| `snr` | [`int32`](#int32) | | | +| `rssi` | [`int32`](#int32) | | | +| `wor_channel` | [`RelayWORChannel`](#ttn.lorawan.v3.RelayWORChannel) | | | +| `frequency` | [`uint64`](#uint64) | | Uplink channel frequency (Hz). | +| `raw_payload` | [`bytes`](#bytes) | | | + +#### Field Rules + +| Field | Validations | +| ----- | ----------- | +| `data_rate` |

`message.required`: `true`

| +| `snr` |

`int32.lte`: `11`

`int32.gte`: `-20`

| +| `rssi` |

`int32.lte`: `-15`

`int32.gte`: `-142`

| +| `wor_channel` |

`enum.defined_only`: `true`

| +| `frequency` |

`uint64.gte`: `100000`

| + +### Message `RelaySecondChannel` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `ack_offset` | [`RelaySecondChAckOffset`](#ttn.lorawan.v3.RelaySecondChAckOffset) | | The frequency (Hz) offset used for the WOR acknowledgement. | +| `data_rate_index` | [`DataRateIndex`](#ttn.lorawan.v3.DataRateIndex) | | The data rate index used by the WOR and WOR acknowledgement. | +| `frequency` | [`uint64`](#uint64) | | The frequency (Hz) used by the wake on radio message. | + +#### Field Rules + +| Field | Validations | +| ----- | ----------- | +| `ack_offset` |

`enum.defined_only`: `true`

| +| `data_rate_index` |

`enum.defined_only`: `true`

| +| `frequency` |

`uint64.gte`: `100000`

| + +### Message `RelayUplinkForwardLimits` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `bucket_size` | [`RelayLimitBucketSize`](#ttn.lorawan.v3.RelayLimitBucketSize) | | The multiplier used to compute the total bucket size for the limits. The multiplier is multiplied by the reload rate in order to compute the total bucket size. | +| `reload_rate` | [`uint32`](#uint32) | | The number of tokens which are replenished in the bucket every hour. | + +#### Field Rules + +| Field | Validations | +| ----- | ----------- | +| `bucket_size` |

`enum.defined_only`: `true`

| +| `reload_rate` |

`uint32.lte`: `62`

| + +### Message `RelayUplinkToken` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `ids` | [`EndDeviceIdentifiers`](#ttn.lorawan.v3.EndDeviceIdentifiers) | | | +| `session_key_id` | [`bytes`](#bytes) | | | +| `full_f_cnt` | [`uint32`](#uint32) | | | + +#### Field Rules + +| Field | Validations | +| ----- | ----------- | +| `ids` |

`message.required`: `true`

| + ### Message `RxDelayValue` | Field | Type | Label | Description | @@ -7190,6 +7552,13 @@ Transmission settings for downlink. | `CID_BEACON_TIMING` | 18 | Deprecated | | `CID_BEACON_FREQ` | 19 | | | `CID_DEVICE_MODE` | 32 | | +| `CID_RELAY_CONF` | 64 | | +| `CID_RELAY_END_DEVICE_CONF` | 65 | | +| `CID_RELAY_FILTER_LIST` | 66 | | +| `CID_RELAY_UPDATE_UPLINK_LIST` | 67 | | +| `CID_RELAY_CTRL_UPLINK_LIST` | 68 | | +| `CID_RELAY_CONFIGURE_FWD_LIMIT` | 69 | | +| `CID_RELAY_NOTIFY_NEW_END_DEVICE` | 70 | | ### Enum `MACVersion` @@ -7344,6 +7713,69 @@ Transmission settings for downlink. | `REJOIN_TIME_14` | 14 | Every ~6.4 months. | | `REJOIN_TIME_15` | 15 | Every ~1.1 year. | +### Enum `RelayCADPeriodicity` + +| Name | Number | Description | +| ---- | ------ | ----------- | +| `RELAY_CAD_PERIODICITY_1_SECOND` | 0 | | +| `RELAY_CAD_PERIODICITY_500_MILLISECONDS` | 1 | | +| `RELAY_CAD_PERIODICITY_250_MILLISECONDS` | 2 | | +| `RELAY_CAD_PERIODICITY_100_MILLISECONDS` | 3 | | +| `RELAY_CAD_PERIODICITY_50_MILLISECONDS` | 4 | | +| `RELAY_CAD_PERIODICITY_20_MILLISECONDS` | 5 | sic | + +### Enum `RelayCtrlUplinkListAction` + +| Name | Number | Description | +| ---- | ------ | ----------- | +| `RELAY_CTRL_UPLINK_LIST_ACTION_READ_W_F_CNT` | 0 | | +| `RELAY_CTRL_UPLINK_LIST_ACTION_REMOVE_TRUSTED_END_DEVICE` | 1 | | + +### Enum `RelayLimitBucketSize` + +| Name | Number | Description | +| ---- | ------ | ----------- | +| `RELAY_LIMIT_BUCKET_SIZE_1` | 0 | | +| `RELAY_LIMIT_BUCKET_SIZE_2` | 1 | | +| `RELAY_LIMIT_BUCKET_SIZE_4` | 2 | | +| `RELAY_LIMIT_BUCKET_SIZE_12` | 3 | sic | + +### Enum `RelayResetLimitCounter` + +| Name | Number | Description | +| ---- | ------ | ----------- | +| `RELAY_RESET_LIMIT_COUNTER_ZERO` | 0 | | +| `RELAY_RESET_LIMIT_COUNTER_RELOAD_RATE` | 1 | | +| `RELAY_RESET_LIMIT_COUNTER_MAX_VALUE` | 2 | | +| `RELAY_RESET_LIMIT_COUNTER_NO_RESET` | 3 | | + +### Enum `RelaySecondChAckOffset` + +| Name | Number | Description | +| ---- | ------ | ----------- | +| `RELAY_SECOND_CH_ACK_OFFSET_0` | 0 | 0 kHz | +| `RELAY_SECOND_CH_ACK_OFFSET_200` | 1 | 200 kHz | +| `RELAY_SECOND_CH_ACK_OFFSET_400` | 2 | 400 kHz | +| `RELAY_SECOND_CH_ACK_OFFSET_800` | 3 | 800 kHz | +| `RELAY_SECOND_CH_ACK_OFFSET_1600` | 4 | 1.6 MHz | +| `RELAY_SECOND_CH_ACK_OFFSET_3200` | 5 | 3.2 MHz | + +### Enum `RelaySmartEnableLevel` + +| Name | Number | Description | +| ---- | ------ | ----------- | +| `RELAY_SMART_ENABLE_LEVEL_8` | 0 | | +| `RELAY_SMART_ENABLE_LEVEL_16` | 1 | | +| `RELAY_SMART_ENABLE_LEVEL_32` | 2 | | +| `RELAY_SMART_ENABLE_LEVEL_64` | 3 | | + +### Enum `RelayWORChannel` + +| Name | Number | Description | +| ---- | ------ | ----------- | +| `RELAY_WOR_CHANNEL_DEFAULT` | 0 | | +| `RELAY_WOR_CHANNEL_SECONDARY` | 1 | | + ### Enum `RxDelay` | Name | Number | Description | @@ -7850,6 +8282,20 @@ Mapping from UDP message (other fields can be set in "advanced"): | `receiver_name` | [`string`](#string) | | Receiver of the message. | | `receiver_agent` | [`string`](#string) | | Receiver agent. | +### Message `RelayMetadata` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `device_id` | [`string`](#string) | | End device identifiers of the relay. | +| `wor_channel` | [`RelayWORChannel`](#ttn.lorawan.v3.RelayWORChannel) | | Wake on radio channel. | + +#### Field Rules + +| Field | Validations | +| ----- | ----------- | +| `device_id` |

`string.max_len`: `36`

`string.pattern`: `^[a-z0-9](?:[-]?[a-z0-9]){2,}$`

| +| `wor_channel` |

`enum.defined_only`: `true`

| + ### Message `RxMetadata` Contains metadata for a received message. Each antenna that receives @@ -7859,6 +8305,7 @@ a message corresponds to one RxMetadata. | ----- | ---- | ----- | ----------- | | `gateway_ids` | [`GatewayIdentifiers`](#ttn.lorawan.v3.GatewayIdentifiers) | | | | `packet_broker` | [`PacketBrokerMetadata`](#ttn.lorawan.v3.PacketBrokerMetadata) | | | +| `relay` | [`RelayMetadata`](#ttn.lorawan.v3.RelayMetadata) | | | | `antenna_index` | [`uint32`](#uint32) | | | | `time` | [`google.protobuf.Timestamp`](#google.protobuf.Timestamp) | | Timestamp at the end of the transmission, provided by the gateway. The accuracy is undefined. | | `timestamp` | [`uint32`](#uint32) | | Gateway concentrator timestamp when the Rx finished (microseconds). | diff --git a/api/ttn/lorawan/v3/api.swagger.json b/api/ttn/lorawan/v3/api.swagger.json index 036dda2148..8dd0716fa9 100644 --- a/api/ttn/lorawan/v3/api.swagger.json +++ b/api/ttn/lorawan/v3/api.swagger.json @@ -17919,15 +17919,19 @@ } } }, - "BandDescriptionRelayParameters": { + "BandDescriptionRelayParametersRelayWORChannel": { "type": "object", "properties": { - "wor_channels": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/RelayParametersRelayWORChannel" - } + "frequency": { + "type": "string", + "format": "uint64" + }, + "ack_frequency": { + "type": "string", + "format": "uint64" + }, + "data_rate_index": { + "$ref": "#/definitions/v3DataRateIndex" } } }, @@ -18841,6 +18845,202 @@ } } }, + "MACCommandRelayConfAns": { + "type": "object", + "properties": { + "second_channel_frequency_ack": { + "type": "boolean" + }, + "second_channel_ack_offset_ack": { + "type": "boolean" + }, + "second_channel_data_rate_index_ack": { + "type": "boolean" + }, + "second_channel_index_ack": { + "type": "boolean" + }, + "default_channel_index_ack": { + "type": "boolean" + }, + "cad_periodicity_ack": { + "type": "boolean" + } + } + }, + "MACCommandRelayConfReq": { + "type": "object", + "properties": { + "configuration": { + "$ref": "#/definitions/MACCommandRelayConfReqConfiguration" + } + } + }, + "MACCommandRelayConfReqConfiguration": { + "type": "object", + "properties": { + "second_channel": { + "$ref": "#/definitions/v3RelaySecondChannel" + }, + "default_channel_index": { + "type": "integer", + "format": "int64" + }, + "cad_periodicity": { + "$ref": "#/definitions/v3RelayCADPeriodicity" + } + } + }, + "MACCommandRelayConfigureFwdLimitAns": { + "type": "object" + }, + "MACCommandRelayConfigureFwdLimitReq": { + "type": "object", + "properties": { + "reset_limit_counter": { + "$ref": "#/definitions/v3RelayResetLimitCounter" + }, + "join_request_limits": { + "$ref": "#/definitions/v3RelayForwardLimits" + }, + "notify_limits": { + "$ref": "#/definitions/v3RelayForwardLimits" + }, + "global_uplink_limits": { + "$ref": "#/definitions/v3RelayForwardLimits" + }, + "overall_limits": { + "$ref": "#/definitions/v3RelayForwardLimits" + } + } + }, + "MACCommandRelayCtrlUplinkListAns": { + "type": "object", + "properties": { + "rule_index_ack": { + "type": "boolean" + }, + "w_f_cnt": { + "type": "integer", + "format": "int64" + } + } + }, + "MACCommandRelayCtrlUplinkListReq": { + "type": "object", + "properties": { + "rule_index": { + "type": "integer", + "format": "int64" + }, + "action": { + "$ref": "#/definitions/v3RelayCtrlUplinkListAction" + } + } + }, + "MACCommandRelayEndDeviceConfAns": { + "type": "object", + "properties": { + "second_channel_frequency_ack": { + "type": "boolean" + }, + "second_channel_data_rate_index_ack": { + "type": "boolean" + }, + "second_channel_index_ack": { + "type": "boolean" + }, + "backoff_ack": { + "type": "boolean" + } + } + }, + "MACCommandRelayEndDeviceConfReq": { + "type": "object", + "properties": { + "configuration": { + "$ref": "#/definitions/MACCommandRelayEndDeviceConfReqConfiguration" + } + } + }, + "MACCommandRelayEndDeviceConfReqConfiguration": { + "type": "object", + "properties": { + "always": { + "$ref": "#/definitions/v3RelayEndDeviceAlwaysMode" + }, + "dynamic": { + "$ref": "#/definitions/v3RelayEndDeviceDynamicMode" + }, + "end_device_controlled": { + "$ref": "#/definitions/v3RelayEndDeviceControlledMode" + }, + "backoff": { + "type": "integer", + "format": "int64" + }, + "second_channel": { + "$ref": "#/definitions/v3RelaySecondChannel" + }, + "serving_device_id": { + "type": "string" + } + } + }, + "MACCommandRelayNotifyNewEndDeviceReq": { + "type": "object", + "properties": { + "dev_addr": { + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "snr": { + "type": "integer", + "format": "int32" + }, + "rssi": { + "type": "integer", + "format": "int32" + } + } + }, + "MACCommandRelayUpdateUplinkListAns": { + "type": "object" + }, + "MACCommandRelayUpdateUplinkListReq": { + "type": "object", + "properties": { + "rule_index": { + "type": "integer", + "format": "int64" + }, + "forward_limits": { + "$ref": "#/definitions/v3RelayUplinkForwardLimits" + }, + "dev_addr": { + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "w_f_cnt": { + "type": "integer", + "format": "int64" + }, + "root_wor_s_key": { + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + }, + "device_id": { + "type": "string" + }, + "session_key_id": { + "type": "string", + "format": "byte" + } + } + }, "MACCommandResetConf": { "type": "object", "properties": { @@ -19000,6 +19200,9 @@ }, "packet_broker": { "$ref": "#/definitions/UplinkMessageRxMetadataPacketBrokerMetadata" + }, + "relay": { + "$ref": "#/definitions/UplinkMessageRxMetadataRelayMetadata" } } }, @@ -19113,19 +19316,51 @@ "default": "ENABLED", "description": " - ENABLED: No restrictions are in place.\n - WARNING: Warnings are being emitted that the provider will be deprecated in the future.\n - DISABLED: New integrations cannot be set up, and old ones do not start." }, - "RelayParametersRelayWORChannel": { + "ServingRelayParametersForwardingLimits": { "type": "object", "properties": { - "frequency": { - "type": "string", - "format": "uint64" + "reset_behavior": { + "$ref": "#/definitions/v3RelayResetLimitCounter", + "description": "Reset behavior of the buckets upon limit update." }, - "ack_frequency": { + "join_requests": { + "$ref": "#/definitions/v3RelayForwardLimits", + "description": "Bucket configuration for join requests.\nIf unset, no individual limits will apply to join requests, but the relay overall limitations will apply." + }, + "notifications": { + "$ref": "#/definitions/v3RelayForwardLimits", + "description": "Bucket configuration for unknown device notifications.\nIf unset, no individual limits will apply to unknown end device notifications, but the relay overall\nlimitations will still apply." + }, + "uplink_messages": { + "$ref": "#/definitions/v3RelayForwardLimits", + "description": "Bucket configuration for uplink messages across all served end devices.\nIf unset, no individual limits will apply to uplink messages across all served end devices, but the relay\noverall limitations will still apply." + }, + "overall": { + "$ref": "#/definitions/v3RelayForwardLimits", + "description": "Bucket configuration for all relay messages.\nIf unset, no overall limits will apply to the relay, but individual limitations will still apply." + } + } + }, + "ServingRelayParametersUplinkForwardingRule": { + "type": "object", + "properties": { + "limits": { + "$ref": "#/definitions/v3RelayUplinkForwardLimits", + "description": "Bucket configuration for the served end device.\nIf unset, no individual limits will apply to the end device, but the relay global limitations will apply." + }, + "last_w_f_cnt": { + "type": "integer", + "format": "int64", + "description": "Last wake on radio frame counter used by the served end device." + }, + "device_id": { "type": "string", - "format": "uint64" + "description": "End device identifier of the served end device." }, - "data_rate_index": { - "$ref": "#/definitions/v3DataRateIndex" + "session_key_id": { + "type": "string", + "format": "byte", + "description": "Session key ID of the session keys used to derive the root relay session key." } } }, @@ -19167,6 +19402,9 @@ "UplinkMessageRxMetadataPacketBrokerMetadata": { "type": "object" }, + "UplinkMessageRxMetadataRelayMetadata": { + "type": "object" + }, "UserRegistrationAdminApproval": { "type": "object", "properties": { @@ -19481,6 +19719,41 @@ } } }, + "lorawanv3RelayMetadata": { + "type": "object", + "properties": { + "device_id": { + "type": "string", + "description": "End device identifiers of the relay." + }, + "wor_channel": { + "$ref": "#/definitions/lorawanv3RelayWORChannel", + "description": "Wake on radio channel." + } + } + }, + "lorawanv3RelayParameters": { + "type": "object", + "properties": { + "serving": { + "$ref": "#/definitions/v3ServingRelayParameters", + "description": "Parameters related to a relay which is serving end devices." + }, + "served": { + "$ref": "#/definitions/v3ServedRelayParameters", + "description": "Parameters related to an end device served by a relay." + } + }, + "description": "RelayParameters represent the parameters of a relay.\nThis is used internally by the Network Server." + }, + "lorawanv3RelayWORChannel": { + "type": "string", + "enum": [ + "RELAY_WOR_CHANNEL_DEFAULT", + "RELAY_WOR_CHANNEL_SECONDARY" + ], + "default": "RELAY_WOR_CHANNEL_DEFAULT" + }, "lorawanv3RxMetadata": { "type": "object", "properties": { @@ -19490,6 +19763,9 @@ "packet_broker": { "$ref": "#/definitions/lorawanv3PacketBrokerMetadata" }, + "relay": { + "$ref": "#/definitions/lorawanv3RelayMetadata" + }, "antenna_index": { "type": "integer", "format": "int64" @@ -21078,7 +21354,7 @@ "$ref": "#/definitions/BandDescriptionDwellTime" }, "relay": { - "$ref": "#/definitions/BandDescriptionRelayParameters" + "$ref": "#/definitions/v3BandDescriptionRelayParameters" } } }, @@ -21097,6 +21373,18 @@ } } }, + "v3BandDescriptionRelayParameters": { + "type": "object", + "properties": { + "wor_channels": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/BandDescriptionRelayParametersRelayWORChannel" + } + } + } + }, "v3BatchGetGatewayConnectionStatsRequest": { "type": "object", "properties": { @@ -23644,6 +23932,39 @@ }, "device_mode_conf": { "$ref": "#/definitions/MACCommandDeviceModeConf" + }, + "relay_conf_req": { + "$ref": "#/definitions/MACCommandRelayConfReq" + }, + "relay_conf_ans": { + "$ref": "#/definitions/MACCommandRelayConfAns" + }, + "relay_end_device_conf_req": { + "$ref": "#/definitions/MACCommandRelayEndDeviceConfReq" + }, + "relay_end_device_conf_ans": { + "$ref": "#/definitions/MACCommandRelayEndDeviceConfAns" + }, + "relay_update_uplink_list_req": { + "$ref": "#/definitions/MACCommandRelayUpdateUplinkListReq" + }, + "relay_update_uplink_list_ans": { + "$ref": "#/definitions/MACCommandRelayUpdateUplinkListAns" + }, + "relay_ctrl_uplink_list_req": { + "$ref": "#/definitions/MACCommandRelayCtrlUplinkListReq" + }, + "relay_ctrl_uplink_list_ans": { + "$ref": "#/definitions/MACCommandRelayCtrlUplinkListAns" + }, + "relay_configure_fwd_limit_req": { + "$ref": "#/definitions/MACCommandRelayConfigureFwdLimitReq" + }, + "relay_configure_fwd_limit_ans": { + "$ref": "#/definitions/MACCommandRelayConfigureFwdLimitAns" + }, + "relay_notify_new_end_device_req": { + "$ref": "#/definitions/MACCommandRelayNotifyNewEndDeviceReq" } } }, @@ -23670,7 +23991,14 @@ "CID_PING_SLOT_CHANNEL", "CID_BEACON_TIMING", "CID_BEACON_FREQ", - "CID_DEVICE_MODE" + "CID_DEVICE_MODE", + "CID_RELAY_CONF", + "CID_RELAY_END_DEVICE_CONF", + "CID_RELAY_FILTER_LIST", + "CID_RELAY_UPDATE_UPLINK_LIST", + "CID_RELAY_CTRL_UPLINK_LIST", + "CID_RELAY_CONFIGURE_FWD_LIMIT", + "CID_RELAY_NOTIFY_NEW_END_DEVICE" ], "default": "CID_RFU_0", "title": "- CID_BEACON_TIMING: Deprecated" @@ -23760,11 +24088,11 @@ }, "uplink_dwell_time": { "$ref": "#/definitions/lorawanv3BoolValue", - "description": "Whether uplink dwell time is set (400ms).\nIf this field is not set, then the value is either unknown or irrelevant(Network Server cannot modify it)." + "description": "Whether uplink dwell time is set (400ms).\nIf unset, then the value is either unknown or irrelevant(Network Server cannot modify it)." }, "downlink_dwell_time": { "$ref": "#/definitions/lorawanv3BoolValue", - "description": "Whether downlink dwell time is set (400ms).\nIf this field is not set, then the value is either unknown or irrelevant(Network Server cannot modify it)." + "description": "Whether downlink dwell time is set (400ms).\nIf unset, then the value is either unknown or irrelevant(Network Server cannot modify it)." }, "adr_ack_limit_exponent": { "$ref": "#/definitions/v3ADRAckLimitExponentValue", @@ -23777,6 +24105,10 @@ "ping_slot_data_rate_index_value": { "$ref": "#/definitions/v3DataRateIndexValue", "description": "Data rate index of the class B ping slot." + }, + "relay": { + "$ref": "#/definitions/lorawanv3RelayParameters", + "description": "Relay parameters." } }, "description": "MACParameters represent the parameters of the device's MAC layer (active or desired).\nThis is used internally by the Network Server." @@ -23952,6 +24284,14 @@ "schedule_downlinks": { "$ref": "#/definitions/lorawanv3BoolValue", "description": "Whether or not downlink messages should be scheduled.\nThis option can be used in order to disable any downlink interaction with the end device. It will affect all types\nof downlink messages: data and MAC downlinks, and join accepts." + }, + "relay": { + "$ref": "#/definitions/lorawanv3RelayParameters", + "description": "The relay parameters the end device is using.\nIf unset, the default value from Network Server configuration or regional parameters specification will be used." + }, + "desired_relay": { + "$ref": "#/definitions/lorawanv3RelayParameters", + "description": "The relay parameters the Network Server should configure device to use via MAC commands.\nIf unset, the default value from Network Server configuration or regional parameters specification will be used." } } }, @@ -24087,6 +24427,10 @@ "$ref": "#/definitions/v3MACCommandIdentifier" }, "description": "MAC command identifiers sent by the end device in the last received uplink.\nThe Network Server may choose to store only certain types of MAC\ncommand identifiers in the underlying implementation." + }, + "pending_relay_downlink": { + "$ref": "#/definitions/v3RelayForwardDownlinkReq", + "description": "Pending relay downlink contents.\nThe pending downlink will be scheduled to the relay in either Rx1 or Rx2.\nThe pending downlink will be cleared after the scheduling attempt." } }, "description": "MACState represents the state of MAC layer of the device.\nMACState is reset on each join for OTAA or ResetInd for ABP devices.\nThis is used internally by the Network Server." @@ -25204,6 +25548,141 @@ "default": "REJOIN_TIME_0", "description": " - REJOIN_TIME_0: Every ~17.1 minutes.\n - REJOIN_TIME_1: Every ~34.1 minutes.\n - REJOIN_TIME_2: Every ~1.1 hours.\n - REJOIN_TIME_3: Every ~2.3 hours.\n - REJOIN_TIME_4: Every ~4.6 hours.\n - REJOIN_TIME_5: Every ~9.1 hours.\n - REJOIN_TIME_6: Every ~18.2 hours.\n - REJOIN_TIME_7: Every ~1.5 days.\n - REJOIN_TIME_8: Every ~3.0 days.\n - REJOIN_TIME_9: Every ~6.1 days.\n - REJOIN_TIME_10: Every ~12.1 days.\n - REJOIN_TIME_11: Every ~3.5 weeks.\n - REJOIN_TIME_12: Every ~1.6 months.\n - REJOIN_TIME_13: Every ~3.2 months.\n - REJOIN_TIME_14: Every ~6.4 months.\n - REJOIN_TIME_15: Every ~1.1 year." }, + "v3RelayCADPeriodicity": { + "type": "string", + "enum": [ + "RELAY_CAD_PERIODICITY_1_SECOND", + "RELAY_CAD_PERIODICITY_500_MILLISECONDS", + "RELAY_CAD_PERIODICITY_250_MILLISECONDS", + "RELAY_CAD_PERIODICITY_100_MILLISECONDS", + "RELAY_CAD_PERIODICITY_50_MILLISECONDS", + "RELAY_CAD_PERIODICITY_20_MILLISECONDS" + ], + "default": "RELAY_CAD_PERIODICITY_1_SECOND", + "title": "- RELAY_CAD_PERIODICITY_20_MILLISECONDS: sic" + }, + "v3RelayCtrlUplinkListAction": { + "type": "string", + "enum": [ + "RELAY_CTRL_UPLINK_LIST_ACTION_READ_W_F_CNT", + "RELAY_CTRL_UPLINK_LIST_ACTION_REMOVE_TRUSTED_END_DEVICE" + ], + "default": "RELAY_CTRL_UPLINK_LIST_ACTION_READ_W_F_CNT" + }, + "v3RelayEndDeviceAlwaysMode": { + "type": "object" + }, + "v3RelayEndDeviceControlledMode": { + "type": "object" + }, + "v3RelayEndDeviceDynamicMode": { + "type": "object", + "properties": { + "smart_enable_level": { + "$ref": "#/definitions/v3RelaySmartEnableLevel", + "description": "The number of consecutive uplinks without a valid downlink before the end device attempts\nto use the relay mode to transmit messages." + } + } + }, + "v3RelayForwardDownlinkReq": { + "type": "object", + "properties": { + "raw_payload": { + "type": "string", + "format": "byte" + } + } + }, + "v3RelayForwardLimits": { + "type": "object", + "properties": { + "bucket_size": { + "$ref": "#/definitions/v3RelayLimitBucketSize", + "description": "The multiplier used to compute the total bucket size for the limits.\nThe multiplier is multiplied by the reload rate in order to compute the total bucket size." + }, + "reload_rate": { + "type": "integer", + "format": "int64", + "description": "The number of tokens which are replenished in the bucket every hour." + } + } + }, + "v3RelayLimitBucketSize": { + "type": "string", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ], + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic" + }, + "v3RelayResetLimitCounter": { + "type": "string", + "enum": [ + "RELAY_RESET_LIMIT_COUNTER_ZERO", + "RELAY_RESET_LIMIT_COUNTER_RELOAD_RATE", + "RELAY_RESET_LIMIT_COUNTER_MAX_VALUE", + "RELAY_RESET_LIMIT_COUNTER_NO_RESET" + ], + "default": "RELAY_RESET_LIMIT_COUNTER_ZERO" + }, + "v3RelaySecondChAckOffset": { + "type": "string", + "enum": [ + "RELAY_SECOND_CH_ACK_OFFSET_0", + "RELAY_SECOND_CH_ACK_OFFSET_200", + "RELAY_SECOND_CH_ACK_OFFSET_400", + "RELAY_SECOND_CH_ACK_OFFSET_800", + "RELAY_SECOND_CH_ACK_OFFSET_1600", + "RELAY_SECOND_CH_ACK_OFFSET_3200" + ], + "default": "RELAY_SECOND_CH_ACK_OFFSET_0", + "title": "- RELAY_SECOND_CH_ACK_OFFSET_0: 0 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_200: 200 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_400: 400 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_800: 800 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_1600: 1.6 MHz\n - RELAY_SECOND_CH_ACK_OFFSET_3200: 3.2 MHz" + }, + "v3RelaySecondChannel": { + "type": "object", + "properties": { + "ack_offset": { + "$ref": "#/definitions/v3RelaySecondChAckOffset", + "description": "The frequency (Hz) offset used for the WOR acknowledgement." + }, + "data_rate_index": { + "$ref": "#/definitions/v3DataRateIndex", + "description": "The data rate index used by the WOR and WOR acknowledgement." + }, + "frequency": { + "type": "string", + "format": "uint64", + "description": "The frequency (Hz) used by the wake on radio message." + } + } + }, + "v3RelaySmartEnableLevel": { + "type": "string", + "enum": [ + "RELAY_SMART_ENABLE_LEVEL_8", + "RELAY_SMART_ENABLE_LEVEL_16", + "RELAY_SMART_ENABLE_LEVEL_32", + "RELAY_SMART_ENABLE_LEVEL_64" + ], + "default": "RELAY_SMART_ENABLE_LEVEL_8" + }, + "v3RelayUplinkForwardLimits": { + "type": "object", + "properties": { + "bucket_size": { + "$ref": "#/definitions/v3RelayLimitBucketSize", + "description": "The multiplier used to compute the total bucket size for the limits.\nThe multiplier is multiplied by the reload rate in order to compute the total bucket size." + }, + "reload_rate": { + "type": "integer", + "format": "int64", + "description": "The number of tokens which are replenished in the bucket every hour." + } + } + }, "v3Right": { "type": "string", "enum": [ @@ -25390,6 +25869,66 @@ } } }, + "v3ServedRelayParameters": { + "type": "object", + "properties": { + "always": { + "$ref": "#/definitions/v3RelayEndDeviceAlwaysMode", + "description": "The end device will always attempt to use the relay mode in order to send uplink messages." + }, + "dynamic": { + "$ref": "#/definitions/v3RelayEndDeviceDynamicMode", + "description": "The end device will attempt to use relay mode only after a number of uplink messages have been sent without\nreceiving a valid a downlink message." + }, + "end_device_controlled": { + "$ref": "#/definitions/v3RelayEndDeviceControlledMode", + "description": "The end device will control when it uses the relay mode. This is the default mode." + }, + "backoff": { + "type": "integer", + "format": "int64", + "description": "Number of uplinks to be sent without a wake on radio frame." + }, + "second_channel": { + "$ref": "#/definitions/v3RelaySecondChannel", + "description": "Second wake on radio channel configuration." + }, + "serving_device_id": { + "type": "string", + "description": "End device identifier of the serving end device." + } + } + }, + "v3ServingRelayParameters": { + "type": "object", + "properties": { + "second_channel": { + "$ref": "#/definitions/v3RelaySecondChannel", + "description": "Second wake on radio channel configuration." + }, + "default_channel_index": { + "type": "integer", + "format": "int64", + "description": "Index of the default wake on radio channel." + }, + "cad_periodicity": { + "$ref": "#/definitions/v3RelayCADPeriodicity", + "description": "Channel activity detection periodicity." + }, + "uplink_forwarding_rules": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/ServingRelayParametersUplinkForwardingRule" + }, + "description": "Configured uplink forwarding rules." + }, + "limits": { + "$ref": "#/definitions/ServingRelayParametersForwardingLimits", + "description": "Configured forwarding limits.\nIf unset, the default value from Network Server configuration will be used." + } + } + }, "v3Session": { "type": "object", "properties": { diff --git a/api/ttn/lorawan/v3/end_device.proto b/api/ttn/lorawan/v3/end_device.proto index 0526c46b07..4c20757e0f 100644 --- a/api/ttn/lorawan/v3/end_device.proto +++ b/api/ttn/lorawan/v3/end_device.proto @@ -88,6 +88,108 @@ message BoolValue { bool value = 1; } +message ServingRelayParameters { + option (thethings.flags.message) = { + select: true, + set: true + }; + + // Second wake on radio channel configuration. + RelaySecondChannel second_channel = 1; + // Index of the default wake on radio channel. + uint32 default_channel_index = 2 [(validate.rules).uint32.lte = 255]; + // Channel activity detection periodicity. + RelayCADPeriodicity cad_periodicity = 3 [(validate.rules).enum.defined_only = true]; + message UplinkForwardingRule { + // Bucket configuration for the served end device. + // If unset, no individual limits will apply to the end device, but the relay global limitations will apply. + RelayUplinkForwardLimits limits = 1; + // Last wake on radio frame counter used by the served end device. + uint32 last_w_f_cnt = 2; + + // End device identifier of the served end device. + string device_id = 3 [(validate.rules).string = { + pattern: "^[a-z0-9](?:[-]?[a-z0-9]){2,}$", + max_len: 36, + ignore_empty: true + }]; + // Session key ID of the session keys used to derive the root relay session key. + bytes session_key_id = 4; + } + // Configured uplink forwarding rules. + repeated UplinkForwardingRule uplink_forwarding_rules = 4 [(validate.rules).repeated.max_items = 16]; + message ForwardingLimits { + // Reset behavior of the buckets upon limit update. + RelayResetLimitCounter reset_behavior = 1; + // Bucket configuration for join requests. + // If unset, no individual limits will apply to join requests, but the relay overall limitations will apply. + RelayForwardLimits join_requests = 2; + // Bucket configuration for unknown device notifications. + // If unset, no individual limits will apply to unknown end device notifications, but the relay overall + // limitations will still apply. + RelayForwardLimits notifications = 3; + // Bucket configuration for uplink messages across all served end devices. + // If unset, no individual limits will apply to uplink messages across all served end devices, but the relay + // overall limitations will still apply. + RelayForwardLimits uplink_messages = 4; + // Bucket configuration for all relay messages. + // If unset, no overall limits will apply to the relay, but individual limitations will still apply. + RelayForwardLimits overall = 5; + } + // Configured forwarding limits. + // If unset, the default value from Network Server configuration will be used. + ForwardingLimits limits = 5; +} + +message ServedRelayParameters { + option (thethings.flags.message) = { + select: true, + set: true, + semantical: true + }; + + oneof mode { + option (validate.required) = true; + + // The end device will always attempt to use the relay mode in order to send uplink messages. + RelayEndDeviceAlwaysMode always = 1; + // The end device will attempt to use relay mode only after a number of uplink messages have been sent without + // receiving a valid a downlink message. + RelayEndDeviceDynamicMode dynamic = 2; + // The end device will control when it uses the relay mode. This is the default mode. + RelayEndDeviceControlledMode end_device_controlled = 3; + } + // Number of uplinks to be sent without a wake on radio frame. + uint32 backoff = 4 [(validate.rules).uint32.lte = 63]; + // Second wake on radio channel configuration. + RelaySecondChannel second_channel = 5; + + // End device identifier of the serving end device. + string serving_device_id = 6 [(validate.rules).string = { + pattern: "^[a-z0-9](?:[-]?[a-z0-9]){2,}$", + max_len: 36 + }]; +} + +// RelayParameters represent the parameters of a relay. +// This is used internally by the Network Server. +message RelayParameters { + option (thethings.flags.message) = { + select: true, + set: true, + semantical: true + }; + + oneof mode { + option (validate.required) = true; + + // Parameters related to a relay which is serving end devices. + ServingRelayParameters serving = 25; + // Parameters related to an end device served by a relay. + ServedRelayParameters served = 26; + } +} + // MACParameters represent the parameters of the device's MAC layer (active or desired). // This is used internally by the Network Server. message MACParameters { @@ -162,10 +264,10 @@ message MACParameters { repeated Channel channels = 19 [(validate.rules).repeated.min_items = 1]; // Whether uplink dwell time is set (400ms). - // If this field is not set, then the value is either unknown or irrelevant(Network Server cannot modify it). + // If unset, then the value is either unknown or irrelevant(Network Server cannot modify it). BoolValue uplink_dwell_time = 20; // Whether downlink dwell time is set (400ms). - // If this field is not set, then the value is either unknown or irrelevant(Network Server cannot modify it). + // If unset, then the value is either unknown or irrelevant(Network Server cannot modify it). BoolValue downlink_dwell_time = 21; // ADR: number of messages to wait before setting ADRAckReq. @@ -174,6 +276,9 @@ message MACParameters { ADRAckDelayExponentValue adr_ack_delay_exponent = 23; // Data rate index of the class B ping slot. DataRateIndexValue ping_slot_data_rate_index_value = 24; + + // Relay parameters. + RelayParameters relay = 25; } // Template for creating end devices. @@ -443,6 +548,14 @@ message MACSettings { // This option can be used in order to disable any downlink interaction with the end device. It will affect all types // of downlink messages: data and MAC downlinks, and join accepts. BoolValue schedule_downlinks = 35; + + // The relay parameters the end device is using. + // If unset, the default value from Network Server configuration or regional parameters specification will be used. + RelayParameters relay = 36; + + // The relay parameters the Network Server should configure device to use via MAC commands. + // If unset, the default value from Network Server configuration or regional parameters specification will be used. + RelayParameters desired_relay = 37; } // MACState represents the state of MAC layer of the device. @@ -574,7 +687,11 @@ message MACState { reserved 1 to 10; } PacketBrokerMetadata packet_broker = 18; - reserved 2 to 8, 10, 12, 13, 16, 17, 19, 20, 99; + message RelayMetadata { + reserved 1 to 3; + } + RelayMetadata relay = 23; + reserved 2 to 8, 10, 12, 13, 16, 17, 19, 20, 21, 22, 99; } repeated RxMetadata rx_metadata = 5; google.protobuf.Timestamp received_at = 6; @@ -665,6 +782,11 @@ message MACState { // The Network Server may choose to store only certain types of MAC // command identifiers in the underlying implementation. repeated MACCommandIdentifier recent_mac_command_identifiers = 23; + + // Pending relay downlink contents. + // The pending downlink will be scheduled to the relay in either Rx1 or Rx2. + // The pending downlink will be cleared after the scheduling attempt. + RelayForwardDownlinkReq pending_relay_downlink = 24; } // Power state of the device. diff --git a/api/ttn/lorawan/v3/lorawan.proto b/api/ttn/lorawan/v3/lorawan.proto index 0f50e376cd..b5fd0824cd 100644 --- a/api/ttn/lorawan/v3/lorawan.proto +++ b/api/ttn/lorawan/v3/lorawan.proto @@ -720,6 +720,161 @@ enum MACCommandIdentifier { CID_BEACON_TIMING = 18; // Deprecated CID_BEACON_FREQ = 19; CID_DEVICE_MODE = 32; + + CID_RELAY_CONF = 64; + CID_RELAY_END_DEVICE_CONF = 65; + CID_RELAY_FILTER_LIST = 66; + CID_RELAY_UPDATE_UPLINK_LIST = 67; + CID_RELAY_CTRL_UPLINK_LIST = 68; + CID_RELAY_CONFIGURE_FWD_LIMIT = 69; + CID_RELAY_NOTIFY_NEW_END_DEVICE = 70; +} + +enum RelayCADPeriodicity { + option (thethings.json.enum) = { + marshal_as_string: true, + prefix: "RELAY_CAD_PERIODICITY" + }; + + RELAY_CAD_PERIODICITY_1_SECOND = 0; + RELAY_CAD_PERIODICITY_500_MILLISECONDS = 1; + RELAY_CAD_PERIODICITY_250_MILLISECONDS = 2; + RELAY_CAD_PERIODICITY_100_MILLISECONDS = 3; + RELAY_CAD_PERIODICITY_50_MILLISECONDS = 4; + RELAY_CAD_PERIODICITY_20_MILLISECONDS = 5; // sic +} + +enum RelaySecondChAckOffset { + option (thethings.json.enum) = { + marshal_as_string: true, + prefix: "RELAY_SECOND_CH_ACK_OFFSET" + }; + + RELAY_SECOND_CH_ACK_OFFSET_0 = 0; // 0 kHz + RELAY_SECOND_CH_ACK_OFFSET_200 = 1; // 200 kHz + RELAY_SECOND_CH_ACK_OFFSET_400 = 2; // 400 kHz + RELAY_SECOND_CH_ACK_OFFSET_800 = 3; // 800 kHz + RELAY_SECOND_CH_ACK_OFFSET_1600 = 4; // 1.6 MHz + RELAY_SECOND_CH_ACK_OFFSET_3200 = 5; // 3.2 MHz +} + +enum RelayLimitBucketSize { + option (thethings.json.enum) = { + marshal_as_string: true, + prefix: "RELAY_LIMIT_BUCKET_SIZE" + }; + + RELAY_LIMIT_BUCKET_SIZE_1 = 0; + RELAY_LIMIT_BUCKET_SIZE_2 = 1; + RELAY_LIMIT_BUCKET_SIZE_4 = 2; + RELAY_LIMIT_BUCKET_SIZE_12 = 3; // sic +} + +enum RelaySmartEnableLevel { + option (thethings.json.enum) = { + marshal_as_string: true, + prefix: "RELAY_SMART_ENABLE_LEVEL" + }; + + RELAY_SMART_ENABLE_LEVEL_8 = 0; + RELAY_SMART_ENABLE_LEVEL_16 = 1; + RELAY_SMART_ENABLE_LEVEL_32 = 2; + RELAY_SMART_ENABLE_LEVEL_64 = 3; +} + +enum RelayWORChannel { + option (thethings.json.enum) = { + marshal_as_string: true, + prefix: "RELAY_WOR_CHANNEL" + }; + + RELAY_WOR_CHANNEL_DEFAULT = 0; + RELAY_WOR_CHANNEL_SECONDARY = 1; +} + +enum RelayResetLimitCounter { + option (thethings.json.enum) = { + marshal_as_string: true, + prefix: "RELAY_RESET_LIMIT_COUNTER" + }; + + RELAY_RESET_LIMIT_COUNTER_ZERO = 0; + RELAY_RESET_LIMIT_COUNTER_RELOAD_RATE = 1; + RELAY_RESET_LIMIT_COUNTER_MAX_VALUE = 2; + RELAY_RESET_LIMIT_COUNTER_NO_RESET = 3; +} + +enum RelayCtrlUplinkListAction { + option (thethings.json.enum) = { + marshal_as_string: true, + prefix: "RELAY_CTRL_UPLINK_LIST_ACTION" + }; + + RELAY_CTRL_UPLINK_LIST_ACTION_READ_W_F_CNT = 0; + RELAY_CTRL_UPLINK_LIST_ACTION_REMOVE_TRUSTED_END_DEVICE = 1; +} + +message RelaySecondChannel { + option (thethings.flags.message) = { + select: true, + set: true + }; + + // The frequency (Hz) offset used for the WOR acknowledgement. + RelaySecondChAckOffset ack_offset = 1 [(validate.rules).enum.defined_only = true]; + // The data rate index used by the WOR and WOR acknowledgement. + DataRateIndex data_rate_index = 2 [(validate.rules).enum.defined_only = true]; + // The frequency (Hz) used by the wake on radio message. + uint64 frequency = 3 [(validate.rules).uint64.gte = 100000]; +} + +message RelayUplinkForwardLimits { + option (thethings.flags.message) = { + select: true, + set: true + }; + + // The multiplier used to compute the total bucket size for the limits. + // The multiplier is multiplied by the reload rate in order to compute the total bucket size. + RelayLimitBucketSize bucket_size = 1 [(validate.rules).enum.defined_only = true]; + // The number of tokens which are replenished in the bucket every hour. + uint32 reload_rate = 2 [(validate.rules).uint32.lte = 62]; +} + +message RelayForwardLimits { + option (thethings.flags.message) = { + select: true, + set: true + }; + + // The multiplier used to compute the total bucket size for the limits. + // The multiplier is multiplied by the reload rate in order to compute the total bucket size. + RelayLimitBucketSize bucket_size = 1 [(validate.rules).enum.defined_only = true]; + // The number of tokens which are replenished in the bucket every hour. + uint32 reload_rate = 2 [(validate.rules).uint32.lte = 126]; +} + +message RelayEndDeviceAlwaysMode { + option (thethings.flags.message) = { + select: true, + set: true + }; +} +message RelayEndDeviceDynamicMode { + option (thethings.flags.message) = { + select: true, + set: true + }; + + // The number of consecutive uplinks without a valid downlink before the end device attempts + // to use the relay mode to transmit messages. + RelaySmartEnableLevel smart_enable_level = 1 [(validate.rules).enum.defined_only = true]; +} +message RelayEndDeviceControlledMode { + option (thethings.flags.message) = { + select: true, + set: true + }; } message MACCommand { @@ -760,8 +915,25 @@ message MACCommand { BeaconFreqAns beacon_freq_ans = 30; DeviceModeInd device_mode_ind = 31; DeviceModeConf device_mode_conf = 32; + + RelayConfReq relay_conf_req = 33; + RelayConfAns relay_conf_ans = 34; + RelayEndDeviceConfReq relay_end_device_conf_req = 35; + RelayEndDeviceConfAns relay_end_device_conf_ans = 36; + RelayUpdateUplinkListReq relay_update_uplink_list_req = 39; + RelayUpdateUplinkListAns relay_update_uplink_list_ans = 40; + RelayCtrlUplinkListReq relay_ctrl_uplink_list_req = 41; + RelayCtrlUplinkListAns relay_ctrl_uplink_list_ans = 42; + RelayConfigureFwdLimitReq relay_configure_fwd_limit_req = 43; + RelayConfigureFwdLimitAns relay_configure_fwd_limit_ans = 44; + RelayNotifyNewEndDeviceReq relay_notify_new_end_device_req = 45; } + reserved 37; + reserved "relay_filter_list_req"; + reserved 38; + reserved "relay_filter_list_ans"; + message ResetInd { Minor minor_version = 1 [(validate.rules).enum = { defined_only: true, @@ -912,6 +1084,145 @@ message MACCommand { message DeviceModeConf { Class class = 1 [(validate.rules).enum.defined_only = true]; } + + message RelayConfReq { + message Configuration { + RelaySecondChannel second_channel = 1; + uint32 default_channel_index = 2 [(validate.rules).uint32.lte = 255]; + RelayCADPeriodicity cad_periodicity = 3 [(validate.rules).enum.defined_only = true]; + } + Configuration configuration = 1; + } + message RelayConfAns { + bool second_channel_frequency_ack = 1; + bool second_channel_ack_offset_ack = 2; + bool second_channel_data_rate_index_ack = 3; + bool second_channel_index_ack = 4; + bool default_channel_index_ack = 5; + bool cad_periodicity_ack = 6; + } + message RelayEndDeviceConfReq { + message Configuration { + oneof mode { + option (validate.required) = true; + + RelayEndDeviceAlwaysMode always = 1; + RelayEndDeviceDynamicMode dynamic = 2; + RelayEndDeviceControlledMode end_device_controlled = 3; + } + uint32 backoff = 4 [(validate.rules).uint32.lte = 63]; + RelaySecondChannel second_channel = 5; + + string serving_device_id = 6 [(validate.rules).string = { + pattern: "^[a-z0-9](?:[-]?[a-z0-9]){2,}$", + max_len: 36 + }]; + } + Configuration configuration = 1; + } + message RelayEndDeviceConfAns { + bool second_channel_frequency_ack = 1; + reserved 2; // second_channel_ack_offset_ack does not exist in the relay specification. + reserved "second_channel_ack_offset_ack"; + bool second_channel_data_rate_index_ack = 3; + bool second_channel_index_ack = 4; + bool backoff_ack = 5; + } + message RelayUpdateUplinkListReq { + uint32 rule_index = 1 [(validate.rules).uint32.lte = 15]; + RelayUplinkForwardLimits forward_limits = 2; + bytes dev_addr = 3 [ + (validate.rules).bytes = { + len: 4, + ignore_empty: true + }, + (thethings.json.field) = { + marshaler_func: "go.thethings.network/lorawan-stack/v3/pkg/types.MarshalHEXBytes", + unmarshaler_func: "go.thethings.network/lorawan-stack/v3/pkg/types.Unmarshal4Bytes" + }, + (thethings.flags.field) = { + set_flag_new_func: "go.thethings.network/lorawan-stack/v3/cmd/ttn-lw-cli/customflags.New4BytesFlag", + set_flag_getter_func: "go.thethings.network/lorawan-stack/v3/cmd/ttn-lw-cli/customflags.GetExactBytes" + }, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + type: STRING, + format: "string", + example: "\"2600ABCD\"" + } + ]; + uint32 w_f_cnt = 4; + bytes root_wor_s_key = 5 [ + (validate.rules).bytes = { + len: 16, + ignore_empty: true + }, + (thethings.json.field) = { + marshaler_func: "go.thethings.network/lorawan-stack/v3/pkg/types.MarshalHEXBytes", + unmarshaler_func: "go.thethings.network/lorawan-stack/v3/pkg/types.Unmarshal16Bytes" + }, + (thethings.flags.field) = { + set_flag_new_func: "go.thethings.network/lorawan-stack/v3/cmd/ttn-lw-cli/customflags.New16BytesFlag", + set_flag_getter_func: "go.thethings.network/lorawan-stack/v3/cmd/ttn-lw-cli/customflags.GetExactBytes" + }, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + type: STRING, + format: "string", + example: "\"0123456789ABCDEF0123456789ABCDEF\"" + } + ]; + + string device_id = 6 [(validate.rules).string = { + pattern: "^[a-z0-9](?:[-]?[a-z0-9]){2,}$", + max_len: 36 + }]; + bytes session_key_id = 7; + } + message RelayUpdateUplinkListAns {} + message RelayCtrlUplinkListReq { + uint32 rule_index = 1 [(validate.rules).uint32.lte = 15]; + RelayCtrlUplinkListAction action = 2; + } + message RelayCtrlUplinkListAns { + bool rule_index_ack = 1; + uint32 w_f_cnt = 2; + } + message RelayConfigureFwdLimitReq { + RelayResetLimitCounter reset_limit_counter = 1; + RelayForwardLimits join_request_limits = 2; + RelayForwardLimits notify_limits = 3; + RelayForwardLimits global_uplink_limits = 4; + RelayForwardLimits overall_limits = 5; + } + message RelayConfigureFwdLimitAns {} + message RelayNotifyNewEndDeviceReq { + bytes dev_addr = 1 [ + (validate.rules).bytes = { + len: 4, + ignore_empty: true + }, + (thethings.json.field) = { + marshaler_func: "go.thethings.network/lorawan-stack/v3/pkg/types.MarshalHEXBytes", + unmarshaler_func: "go.thethings.network/lorawan-stack/v3/pkg/types.Unmarshal4Bytes" + }, + (thethings.flags.field) = { + set_flag_new_func: "go.thethings.network/lorawan-stack/v3/cmd/ttn-lw-cli/customflags.New4BytesFlag", + set_flag_getter_func: "go.thethings.network/lorawan-stack/v3/cmd/ttn-lw-cli/customflags.GetExactBytes" + }, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + type: STRING, + format: "string", + example: "\"2600ABCD\"" + } + ]; + int32 snr = 2 [(validate.rules).int32 = { + lte: 11, + gte: -20 + }]; + int32 rssi = 3 [(validate.rules).int32 = { + lte: -15, + gte: -142 + }]; + } } message MACCommands { @@ -1240,3 +1551,38 @@ message DeviceEIRPValue { option (thethings.json.message) = {wrapper: true}; DeviceEIRP value = 1 [(validate.rules).enum.defined_only = true]; } + +message RelayForwardUplinkReq { + option (thethings.flags.message) = { + select: true, + set: true + }; + + DataRate data_rate = 1 [(validate.rules).message.required = true]; + int32 snr = 2 [(validate.rules).int32 = { + lte: 11, + gte: -20 + }]; + int32 rssi = 3 [(validate.rules).int32 = { + lte: -15, + gte: -142 + }]; + RelayWORChannel wor_channel = 4 [(validate.rules).enum.defined_only = true]; + uint64 frequency = 5 [(validate.rules).uint64.gte = 100000]; // Uplink channel frequency (Hz). + bytes raw_payload = 6; +} + +message RelayForwardDownlinkReq { + option (thethings.flags.message) = { + select: true, + set: true + }; + + bytes raw_payload = 1; +} + +message RelayUplinkToken { + EndDeviceIdentifiers ids = 1 [(validate.rules).message.required = true]; + bytes session_key_id = 2; + uint32 full_f_cnt = 3; +} diff --git a/api/ttn/lorawan/v3/metadata.proto b/api/ttn/lorawan/v3/metadata.proto index 141fab453a..fd9f16e9a8 100644 --- a/api/ttn/lorawan/v3/metadata.proto +++ b/api/ttn/lorawan/v3/metadata.proto @@ -24,6 +24,7 @@ import "thethings/flags/annotations.proto"; import "thethings/json/annotations.proto"; import "ttn/lorawan/v3/enums.proto"; import "ttn/lorawan/v3/identifiers.proto"; +import "ttn/lorawan/v3/lorawan.proto"; import "validate/validate.proto"; option go_package = "go.thethings.network/lorawan-stack/v3/pkg/ttnpb"; @@ -33,6 +34,7 @@ option go_package = "go.thethings.network/lorawan-stack/v3/pkg/ttnpb"; message RxMetadata { GatewayIdentifiers gateway_ids = 1 [(validate.rules).message.required = true]; PacketBrokerMetadata packet_broker = 18; + RelayMetadata relay = 23; uint32 antenna_index = 2; // Timestamp at the end of the transmission, provided by the gateway. The accuracy is undefined. @@ -79,7 +81,7 @@ message RxMetadata { // - field names are written in snake_case google.protobuf.Struct advanced = 99; - // next: 23 + // next: 24 } message Location { @@ -213,3 +215,13 @@ message PacketBrokerRouteHop { // Receiver agent. string receiver_agent = 5; } + +message RelayMetadata { + // End device identifiers of the relay. + string device_id = 1 [(validate.rules).string = { + pattern: "^[a-z0-9](?:[-]?[a-z0-9]){2,}$", + max_len: 36 + }]; + // Wake on radio channel. + RelayWORChannel wor_channel = 2 [(validate.rules).enum.defined_only = true]; +} diff --git a/config/messages.json b/config/messages.json index 4557d5b256..7e578d2124 100644 --- a/config/messages.json +++ b/config/messages.json @@ -152,6 +152,69 @@ "file": "i18n.go" } }, + "enum:CID_RELAY_CONF": { + "translations": { + "en": "relay configuration" + }, + "description": { + "package": "pkg/ttnpb", + "file": "i18n.go" + } + }, + "enum:CID_RELAY_CONFIGURE_FWD_LIMIT": { + "translations": { + "en": "manage uplink forwarding limits" + }, + "description": { + "package": "pkg/ttnpb", + "file": "i18n.go" + } + }, + "enum:CID_RELAY_CTRL_UPLINK_LIST": { + "translations": { + "en": "manage uplink forwarding rules" + }, + "description": { + "package": "pkg/ttnpb", + "file": "i18n.go" + } + }, + "enum:CID_RELAY_END_DEVICE_CONF": { + "translations": { + "en": "end device relay configuration" + }, + "description": { + "package": "pkg/ttnpb", + "file": "i18n.go" + } + }, + "enum:CID_RELAY_FILTER_LIST": { + "translations": { + "en": "manage join request forwarding rules" + }, + "description": { + "package": "pkg/ttnpb", + "file": "i18n.go" + } + }, + "enum:CID_RELAY_NOTIFY_NEW_END_DEVICE": { + "translations": { + "en": "new end device under relay" + }, + "description": { + "package": "pkg/ttnpb", + "file": "i18n.go" + } + }, + "enum:CID_RELAY_UPDATE_UPLINK_LIST": { + "translations": { + "en": "update uplink forwarding rules" + }, + "description": { + "package": "pkg/ttnpb", + "file": "i18n.go" + } + }, "enum:CID_RESET": { "translations": { "en": "reset" @@ -7487,6 +7550,15 @@ "file": "registry.go" } }, + "error:pkg/networkserver/redis:relay_served": { + "translations": { + "en": "`{served}` is already served by `{serving}`" + }, + "description": { + "package": "pkg/networkserver/redis", + "file": "registry.go" + } + }, "error:pkg/networkserver:abp_join_request": { "translations": { "en": "received a join-request from ABP device" @@ -7802,6 +7874,87 @@ "file": "grpc_gsns.go" } }, + "error:pkg/networkserver:relay_full_f_cnt": { + "translations": { + "en": "invalid full FCnt" + }, + "description": { + "package": "pkg/networkserver", + "file": "relay.go" + } + }, + "error:pkg/networkserver:relay_m_type": { + "translations": { + "en": "invalid MType" + }, + "description": { + "package": "pkg/networkserver", + "file": "relay.go" + } + }, + "error:pkg/networkserver:relay_recent_uplinks": { + "translations": { + "en": "recent uplinks not found" + }, + "description": { + "package": "pkg/networkserver", + "file": "relay.go" + } + }, + "error:pkg/networkserver:relay_rx_windows_available": { + "translations": { + "en": "no RX windows available" + }, + "description": { + "package": "pkg/networkserver", + "file": "relay.go" + } + }, + "error:pkg/networkserver:relay_schedule": { + "translations": { + "en": "relay schedule" + }, + "description": { + "package": "pkg/networkserver", + "file": "relay.go" + } + }, + "error:pkg/networkserver:relay_serving": { + "translations": { + "en": "relay not serving" + }, + "description": { + "package": "pkg/networkserver", + "file": "relay.go" + } + }, + "error:pkg/networkserver:relay_session": { + "translations": { + "en": "relay session not found" + }, + "description": { + "package": "pkg/networkserver", + "file": "relay.go" + } + }, + "error:pkg/networkserver:relay_session_key_id": { + "translations": { + "en": "relay session key ID not found" + }, + "description": { + "package": "pkg/networkserver", + "file": "relay.go" + } + }, + "error:pkg/networkserver:relay_uplink_token": { + "translations": { + "en": "invalid relay uplink token" + }, + "description": { + "package": "pkg/networkserver", + "file": "relay.go" + } + }, "error:pkg/networkserver:schedule": { "translations": { "en": "all downlink scheduling attempts failed" @@ -10682,6 +10835,132 @@ "file": "rekey.go" } }, + "event:ns.mac.relay_conf.answer.accept": { + "translations": { + "en": "relay configuration accept received" + }, + "description": { + "package": "pkg/networkserver/mac", + "file": "relay_conf.go" + } + }, + "event:ns.mac.relay_conf.answer.reject": { + "translations": { + "en": "relay configuration rejection received" + }, + "description": { + "package": "pkg/networkserver/mac", + "file": "relay_conf.go" + } + }, + "event:ns.mac.relay_conf.request": { + "translations": { + "en": "relay configuration request enqueued" + }, + "description": { + "package": "pkg/networkserver/mac", + "file": "relay_conf.go" + } + }, + "event:ns.mac.relay_configure_fwd_limit.answer": { + "translations": { + "en": "relay configure forward limit answer received" + }, + "description": { + "package": "pkg/networkserver/mac", + "file": "relay_configure_fwd_limit.go" + } + }, + "event:ns.mac.relay_configure_fwd_limit.request": { + "translations": { + "en": "relay configure forward limit request enqueued" + }, + "description": { + "package": "pkg/networkserver/mac", + "file": "relay_configure_fwd_limit.go" + } + }, + "event:ns.mac.relay_ctrl_uplink_list.answer.accept": { + "translations": { + "en": "relay control uplink list accept received" + }, + "description": { + "package": "pkg/networkserver/mac", + "file": "relay_ctrl_uplink_list.go" + } + }, + "event:ns.mac.relay_ctrl_uplink_list.answer.reject": { + "translations": { + "en": "relay control uplink list rejection received" + }, + "description": { + "package": "pkg/networkserver/mac", + "file": "relay_ctrl_uplink_list.go" + } + }, + "event:ns.mac.relay_ctrl_uplink_list.request": { + "translations": { + "en": "relay control uplink list request enqueued" + }, + "description": { + "package": "pkg/networkserver/mac", + "file": "relay_ctrl_uplink_list.go" + } + }, + "event:ns.mac.relay_end_device_conf.answer.accept": { + "translations": { + "en": "relay end device configuration accept received" + }, + "description": { + "package": "pkg/networkserver/mac", + "file": "relay_end_device_conf.go" + } + }, + "event:ns.mac.relay_end_device_conf.answer.reject": { + "translations": { + "en": "relay end device configuration rejection received" + }, + "description": { + "package": "pkg/networkserver/mac", + "file": "relay_end_device_conf.go" + } + }, + "event:ns.mac.relay_end_device_conf.request": { + "translations": { + "en": "relay end device configuration request enqueued" + }, + "description": { + "package": "pkg/networkserver/mac", + "file": "relay_end_device_conf.go" + } + }, + "event:ns.mac.relay_notify_new_end_device.indication": { + "translations": { + "en": "relay notify new end device indication received" + }, + "description": { + "package": "pkg/networkserver/mac", + "file": "relay_notify_new_end_device.go" + } + }, + "event:ns.mac.relay_update_uplink_list.answer": { + "translations": { + "en": "relay update uplink list answer received" + }, + "description": { + "package": "pkg/networkserver/mac", + "file": "relay_update_uplink_list.go" + } + }, + "event:ns.mac.relay_update_uplink_list.request": { + "translations": { + "en": "relay update uplink list request enqueued" + }, + "description": { + "package": "pkg/networkserver/mac", + "file": "relay_update_uplink_list.go" + } + }, "event:ns.mac.reset.confirmation": { "translations": { "en": "device reset confirmation enqueued" @@ -10889,6 +11168,24 @@ "file": "observability.go" } }, + "event:ns.up.relay.drop": { + "translations": { + "en": "drop relay message" + }, + "description": { + "package": "pkg/networkserver", + "file": "observability.go" + } + }, + "event:ns.up.relay.process": { + "translations": { + "en": "successfully processed relay message" + }, + "description": { + "package": "pkg/networkserver", + "file": "observability.go" + } + }, "event:oauth.authorize": { "translations": { "en": "authorize OAuth client" diff --git a/pkg/crypto/relay.go b/pkg/crypto/relay.go new file mode 100644 index 0000000000..c64481809c --- /dev/null +++ b/pkg/crypto/relay.go @@ -0,0 +1,31 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package crypto + +import ( + "crypto/aes" + + "go.thethings.network/lorawan-stack/v3/pkg/types" +) + +// DeriveRootWorSKey derives the root relay session key. +func DeriveRootWorSKey(nwkSEncKey types.AES128Key) types.AES128Key { + var key types.AES128Key + var plain [16]byte + plain[0] = 0x01 + block, _ := aes.NewCipher(nwkSEncKey[:]) + block.Encrypt(key[:], plain[:]) + return key +} diff --git a/pkg/crypto/relay_test.go b/pkg/crypto/relay_test.go new file mode 100644 index 0000000000..992267bbf4 --- /dev/null +++ b/pkg/crypto/relay_test.go @@ -0,0 +1,35 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package crypto_test + +import ( + "testing" + + "github.com/smarty/assertions" + "go.thethings.network/lorawan-stack/v3/pkg/crypto" + "go.thethings.network/lorawan-stack/v3/pkg/types" + "go.thethings.network/lorawan-stack/v3/pkg/util/test/assertions/should" +) + +func TestDeriveRootWorSKey(t *testing.T) { + t.Parallel() + a := assertions.New(t) + nwkSEncKey := types.AES128Key{ + 0xCE, 0x07, 0xA0, 0x09, 0xA3, 0x97, 0x0A, 0xC0, 0x51, 0x9A, 0x09, 0x9E, 0xD5, 0x3E, 0x55, 0x0B, + } + a.So(crypto.DeriveRootWorSKey(nwkSEncKey), should.Equal, types.AES128Key{ + 0xEE, 0x91, 0xDC, 0x1A, 0x66, 0x66, 0xC0, 0x6E, 0x82, 0x77, 0xDE, 0x6D, 0xB4, 0xDB, 0x94, 0x5F, + }) +} diff --git a/pkg/encoding/lorawan/mac.go b/pkg/encoding/lorawan/mac.go index 2c7ae3152c..ece8e44004 100644 --- a/pkg/encoding/lorawan/mac.go +++ b/pkg/encoding/lorawan/mac.go @@ -904,6 +904,568 @@ var DefaultMACCommands = MACCommandSpec{ return nil }), }, + + ttnpb.MACCommandIdentifier_CID_RELAY_CONF: &MACCommandDescriptor{ + InitiatedByDevice: false, + + UplinkLength: 1, + AppendUplink: func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) ([]byte, error) { + pld := cmd.GetRelayConfAns() + var status byte + if pld.SecondChannelFrequencyAck { + status |= 1 + } + if pld.SecondChannelAckOffsetAck { + status |= (1 << 1) + } + if pld.SecondChannelDataRateIndexAck { + status |= (1 << 2) + } + if pld.SecondChannelIndexAck { + status |= (1 << 3) + } + if pld.DefaultChannelIndexAck { + status |= (1 << 4) + } + if pld.CadPeriodicityAck { + status |= (1 << 5) + } + b = append(b, status) + return b, nil + }, + UnmarshalUplink: newMACUnmarshaler( + ttnpb.MACCommandIdentifier_CID_RELAY_CONF, + "RelayConfAns", + 1, + func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) error { + cmd.Payload = &ttnpb.MACCommand_RelayConfAns_{ + RelayConfAns: &ttnpb.MACCommand_RelayConfAns{ + SecondChannelFrequencyAck: b[0]&1 == 1, + SecondChannelAckOffsetAck: (b[0]>>1)&1 == 1, + SecondChannelDataRateIndexAck: (b[0]>>2)&1 == 1, + SecondChannelIndexAck: (b[0]>>3)&1 == 1, + DefaultChannelIndexAck: (b[0]>>4)&1 == 1, + CadPeriodicityAck: (b[0]>>5)&1 == 1, + }, + } + return nil + }, + ), + + DownlinkLength: 5, + AppendDownlink: func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) ([]byte, error) { + pld := cmd.GetRelayConfReq() + conf := pld.GetConfiguration() + if conf == nil { + b = append(b, 0x00, 0x00, 0x00, 0x00, 0x00) + return b, nil + } + var chSettings uint16 + chSettings |= 1 << 13 // StartStop + if conf.CadPeriodicity > 5 { + return nil, errExpectedLowerOrEqual("CADPeriodicity", 5)(conf.CadPeriodicity) + } + chSettings |= uint16(conf.CadPeriodicity&0x7) << 10 + if conf.DefaultChannelIndex > 1 { + return nil, errExpectedLowerOrEqual("DefaultChannelIndex", 1)(conf.DefaultChannelIndex) + } + chSettings |= uint16(conf.DefaultChannelIndex&0x1) << 9 + var secondChFrequency uint64 + if secondCh := conf.SecondChannel; secondCh != nil { + chSettings |= 1 << 7 // SecondChannelIndex + if secondCh.DataRateIndex > 15 { + return nil, errExpectedLowerOrEqual("SecondChannelDataRateIndex", 15)(secondCh.DataRateIndex) + } + chSettings |= uint16(secondCh.DataRateIndex&0xf) << 3 + if secondCh.AckOffset > 5 { + return nil, errExpectedLowerOrEqual("SecondChannelAckOffset", 5)(secondCh.AckOffset) + } + chSettings |= uint16(secondCh.AckOffset & 0x7) + if secondCh.Frequency < 100000 || secondCh.Frequency > byteutil.MaxUint24*phy.FreqMultiplier { + return nil, errExpectedBetween( + "SecondChannelFrequency", 100000, byteutil.MaxUint24*phy.FreqMultiplier, + )(secondCh.Frequency) + } + secondChFrequency = secondCh.Frequency + } + b = byteutil.AppendUint16(b, chSettings, 2) + b = byteutil.AppendUint64(b, secondChFrequency/phy.FreqMultiplier, 3) + return b, nil + }, + UnmarshalDownlink: newMACUnmarshaler( + ttnpb.MACCommandIdentifier_CID_RELAY_CONF, + "RelayConfReq", + 5, + func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) error { + payload := &ttnpb.MACCommand_RelayConfReq_{ + RelayConfReq: &ttnpb.MACCommand_RelayConfReq{}, + } + cmd.Payload = payload + chSettings := byteutil.ParseUint16(b[0:2]) + if chSettings&(1<<13) == 0 { + return nil + } + conf := &ttnpb.MACCommand_RelayConfReq_Configuration{ + SecondChannel: nil, + DefaultChannelIndex: uint32(chSettings>>9) & 0x1, + CadPeriodicity: ttnpb.RelayCADPeriodicity(chSettings>>10) & 0x7, + } + if chSettings&(1<<7) != 0 { + conf.SecondChannel = &ttnpb.RelaySecondChannel{ + Frequency: byteutil.ParseUint64(b[2:5]) * phy.FreqMultiplier, + AckOffset: ttnpb.RelaySecondChAckOffset(chSettings) & 0x7, + DataRateIndex: ttnpb.DataRateIndex(chSettings>>3) & 0xf, + } + } + payload.RelayConfReq.Configuration = conf + return nil + }, + ), + }, + ttnpb.MACCommandIdentifier_CID_RELAY_END_DEVICE_CONF: &MACCommandDescriptor{ + InitiatedByDevice: false, + + UplinkLength: 1, + AppendUplink: func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) ([]byte, error) { + pld := cmd.GetRelayEndDeviceConfAns() + var status byte + if pld.SecondChannelFrequencyAck { + status |= 1 + } + if pld.SecondChannelDataRateIndexAck { + status |= (1 << 1) + } + if pld.SecondChannelIndexAck { + status |= (1 << 2) + } + if pld.BackoffAck { + status |= (1 << 3) + } + b = append(b, status) + return b, nil + }, + UnmarshalUplink: newMACUnmarshaler( + ttnpb.MACCommandIdentifier_CID_RELAY_END_DEVICE_CONF, + "RelayEndDeviceConfAns", + 1, + func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) error { + cmd.Payload = &ttnpb.MACCommand_RelayEndDeviceConfAns_{ + RelayEndDeviceConfAns: &ttnpb.MACCommand_RelayEndDeviceConfAns{ + SecondChannelFrequencyAck: b[0]&1 == 1, + SecondChannelDataRateIndexAck: (b[0]>>1)&1 == 1, + SecondChannelIndexAck: (b[0]>>2)&1 == 1, + BackoffAck: (b[0]>>3)&1 == 1, + }, + } + return nil + }, + ), + + DownlinkLength: 6, + AppendDownlink: func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) ([]byte, error) { + pld := cmd.GetRelayEndDeviceConfReq() + conf := pld.GetConfiguration() + if conf == nil { + b = append(b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) + return b, nil + } + var mode byte + switch conf.Mode.(type) { + case *ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration_Always: + mode |= 1 << 2 + case *ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration_Dynamic: + mode |= 2 << 2 + smartEnableLevel := conf.GetDynamic().GetSmartEnableLevel() + if smartEnableLevel > 3 { + return nil, errExpectedLowerOrEqual("SmartEnableLevel", 3)(smartEnableLevel) + } + mode |= byte(conf.GetDynamic().GetSmartEnableLevel() & 0x3) + case *ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration_EndDeviceControlled: + mode |= 3 << 2 + default: + return nil, errExpectedLengthLowerOrEqual("mode", 3)(conf.Mode) + } + b = append(b, mode) + var chSettings uint16 + if conf.Backoff > 63 { + return nil, errExpectedLowerOrEqual("Backoff", 63)(conf.Backoff) + } + chSettings |= uint16(conf.Backoff&0x3f) << 9 + var secondChFrequency uint64 + if secondCh := conf.SecondChannel; secondCh != nil { + chSettings |= 1 << 7 // SecondChannelIndex + if secondCh.DataRateIndex > 15 { + return nil, errExpectedLowerOrEqual("SecondChannelDataRateIndex", 15)(secondCh.DataRateIndex) + } + chSettings |= uint16(secondCh.DataRateIndex&0xf) << 3 + if secondCh.Frequency < 100000 || secondCh.Frequency > byteutil.MaxUint24*phy.FreqMultiplier { + return nil, errExpectedBetween( + "SecondChannelFrequency", 100000, byteutil.MaxUint24*phy.FreqMultiplier, + )(secondCh.Frequency) + } + if secondCh.AckOffset > 5 { + return nil, errExpectedLowerOrEqual("SecondChannelAckOffset", 5)(secondCh.AckOffset) + } + chSettings |= uint16(secondCh.AckOffset & 0x7) + secondChFrequency = secondCh.Frequency + } + b = byteutil.AppendUint16(b, chSettings, 2) + b = byteutil.AppendUint64(b, secondChFrequency/phy.FreqMultiplier, 3) + return b, nil + }, + UnmarshalDownlink: newMACUnmarshaler( + ttnpb.MACCommandIdentifier_CID_RELAY_END_DEVICE_CONF, + "RelayEndDeviceConfReq", + 6, + func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) error { + payload := &ttnpb.MACCommand_RelayEndDeviceConfReq_{ + RelayEndDeviceConfReq: &ttnpb.MACCommand_RelayEndDeviceConfReq{}, + } + cmd.Payload = payload + var conf *ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration + switch mode := b[0] >> 2; mode { + case 0: + return nil + case 1: + conf = &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration{ + Mode: &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration_Always{}, + } + case 2: + conf = &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration{ + Mode: &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration_Dynamic{ + Dynamic: &ttnpb.RelayEndDeviceDynamicMode{ + SmartEnableLevel: ttnpb.RelaySmartEnableLevel(b[0] & 0x3), + }, + }, + } + case 3: + conf = &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration{ + Mode: &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration_EndDeviceControlled{}, + } + default: + return errExpectedLengthLowerOrEqual("mode", 3)(mode) + } + payload.RelayEndDeviceConfReq.Configuration = conf + chSettings := byteutil.ParseUint16(b[1:3]) + conf.Backoff = uint32(chSettings>>9) & 0x3f + if chSettings&(1<<7) != 0 { + conf.SecondChannel = &ttnpb.RelaySecondChannel{ + Frequency: byteutil.ParseUint64(b[3:6]) * phy.FreqMultiplier, + AckOffset: ttnpb.RelaySecondChAckOffset(chSettings) & 0x7, + DataRateIndex: ttnpb.DataRateIndex(chSettings>>3) & 0xf, + } + } + return nil + }), + }, + ttnpb.MACCommandIdentifier_CID_RELAY_UPDATE_UPLINK_LIST: &MACCommandDescriptor{ + InitiatedByDevice: false, + + UplinkLength: 0, + AppendUplink: func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) ([]byte, error) { + return b, nil + }, + UnmarshalUplink: newMACUnmarshaler( + ttnpb.MACCommandIdentifier_CID_RELAY_UPDATE_UPLINK_LIST, + "RelayUpdateUplinkListAns", + 0, + func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) error { + cmd.Payload = &ttnpb.MACCommand_RelayUpdateUplinkListAns_{ + RelayUpdateUplinkListAns: &ttnpb.MACCommand_RelayUpdateUplinkListAns{}, + } + return nil + }, + ), + + DownlinkLength: 26, + AppendDownlink: func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) ([]byte, error) { + pld := cmd.GetRelayUpdateUplinkListReq() + if pld.RuleIndex > 15 { + return nil, errExpectedLowerOrEqual("RuleIndex", 15)(pld.RuleIndex) + } + b = append(b, byte(pld.RuleIndex)) + var uplinkLimit byte = 0x3f + if limits := pld.ForwardLimits; limits != nil { + if limits.BucketSize > 3 { + return nil, errExpectedLowerOrEqual("BucketSize", 3)(limits.BucketSize) + } + uplinkLimit = byte(limits.BucketSize&0x3) << 6 + if limits.ReloadRate > 62 { + return nil, errExpectedLowerOrEqual("ReloadRate", 62)(limits.ReloadRate) + } + uplinkLimit |= byte(limits.ReloadRate) + } + b = append(b, uplinkLimit) + if n := len(pld.DevAddr); n != 4 { + return nil, errExpectedLengthEncodedEqual("DevAddr", 4)(n) + } + devAddr := make([]byte, 4) + copyReverse(devAddr, pld.DevAddr) + b = append(b, devAddr...) + b = byteutil.AppendUint32(b, pld.WFCnt, 4) + if n := len(pld.RootWorSKey); n != 16 { + return nil, errExpectedLengthEncodedEqual("RootWorSKey", 16)(n) + } + b = append(b, pld.RootWorSKey...) + return b, nil + }, + UnmarshalDownlink: newMACUnmarshaler( + ttnpb.MACCommandIdentifier_CID_RELAY_UPDATE_UPLINK_LIST, + "RelayUpdateUplinkListReq", + 26, + func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) error { + req := &ttnpb.MACCommand_RelayUpdateUplinkListReq{ + DevAddr: make([]byte, 4), + } + cmd.Payload = &ttnpb.MACCommand_RelayUpdateUplinkListReq_{ + RelayUpdateUplinkListReq: req, + } + req.RuleIndex = uint32(b[0]) + if req.RuleIndex > 7 { + return errExpectedLowerOrEqual("RuleIndex", 7)(req.RuleIndex) + } + uplinkLimit := b[1] + if (uplinkLimit & 0x3f) != 0x3f { + req.ForwardLimits = &ttnpb.RelayUplinkForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize(uplinkLimit >> 6), + ReloadRate: uint32(uplinkLimit & 0x3f), + } + } + copyReverse(req.DevAddr[:], b[2:6]) + req.WFCnt = byteutil.ParseUint32(b[6:10]) + req.RootWorSKey = b[10:26] + return nil + }, + ), + }, + ttnpb.MACCommandIdentifier_CID_RELAY_CTRL_UPLINK_LIST: &MACCommandDescriptor{ + InitiatedByDevice: false, + + UplinkLength: 5, + AppendUplink: func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) ([]byte, error) { + pld := cmd.GetRelayCtrlUplinkListAns() + var status byte + if pld.RuleIndexAck { + status |= 1 + } + b = append(b, status) + b = byteutil.AppendUint32(b, pld.WFCnt, 4) + return b, nil + }, + UnmarshalUplink: newMACUnmarshaler( + ttnpb.MACCommandIdentifier_CID_RELAY_CTRL_UPLINK_LIST, + "RelayCtrlUplinkListAns", + 5, + func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) error { + cmd.Payload = &ttnpb.MACCommand_RelayCtrlUplinkListAns_{ + RelayCtrlUplinkListAns: &ttnpb.MACCommand_RelayCtrlUplinkListAns{ + RuleIndexAck: b[0]&1 == 1, + WFCnt: byteutil.ParseUint32(b[1:5]), + }, + } + return nil + }, + ), + + DownlinkLength: 1, + AppendDownlink: func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) ([]byte, error) { + req := cmd.GetRelayCtrlUplinkListReq() + if req.RuleIndex > 15 { + return nil, errExpectedLowerOrEqual("RuleIndex", 7)(req.RuleIndex) + } + var action byte + action |= byte(req.RuleIndex) & 0xf + if req.Action > 1 { + return nil, errExpectedLowerOrEqual("Action", 1)(req.Action) + } + action |= byte(req.Action&0x1) << 4 + b = append(b, action) + return b, nil + }, + UnmarshalDownlink: newMACUnmarshaler( + ttnpb.MACCommandIdentifier_CID_RELAY_CTRL_UPLINK_LIST, + "RelayCtrlUplinkListReq", + 1, + func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) error { + cmd.Payload = &ttnpb.MACCommand_RelayCtrlUplinkListReq_{ + RelayCtrlUplinkListReq: &ttnpb.MACCommand_RelayCtrlUplinkListReq{ + RuleIndex: uint32(b[0] & 0xf), + Action: ttnpb.RelayCtrlUplinkListAction(b[0] >> 4), + }, + } + return nil + }, + ), + }, + ttnpb.MACCommandIdentifier_CID_RELAY_CONFIGURE_FWD_LIMIT: &MACCommandDescriptor{ + InitiatedByDevice: false, + + UplinkLength: 0, + AppendUplink: func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) ([]byte, error) { + return b, nil + }, + UnmarshalUplink: newMACUnmarshaler( + ttnpb.MACCommandIdentifier_CID_RELAY_CONFIGURE_FWD_LIMIT, + "RelayConfigureFwdLimitAns", + 0, + func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) error { + cmd.Payload = &ttnpb.MACCommand_RelayConfigureFwdLimitAns_{ + RelayConfigureFwdLimitAns: &ttnpb.MACCommand_RelayConfigureFwdLimitAns{}, + } + return nil + }, + ), + + DownlinkLength: 5, + AppendDownlink: func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) ([]byte, error) { + pld := cmd.GetRelayConfigureFwdLimitReq() + if pld.ResetLimitCounter > 3 { + return nil, errExpectedLowerOrEqual("ResetLimitCounter", 3)(pld.ResetLimitCounter) + } + var overallReloadRate byte = 0x7f + var overallBucketSize byte + if overall := pld.OverallLimits; overall != nil { + if overall.ReloadRate > 126 { + return nil, errExpectedLowerOrEqual("ReloadRate", 126)(overall.ReloadRate) + } + overallReloadRate = byte(overall.ReloadRate & 0x7f) + if overall.BucketSize > 3 { + return nil, errExpectedLowerOrEqual("BucketSize", 3)(overall.BucketSize) + } + overallBucketSize = byte(overall.BucketSize & 0x3) + } + var globalUplinkReloadRate byte = 0x7f + var globalUplinkBucketSize byte + if global := pld.GlobalUplinkLimits; global != nil { + if global.ReloadRate > 126 { + return nil, errExpectedLowerOrEqual("ReloadRate", 126)(global.ReloadRate) + } + globalUplinkReloadRate = byte(global.ReloadRate & 0x7f) + if global.BucketSize > 3 { + return nil, errExpectedLowerOrEqual("BucketSize", 3)(global.BucketSize) + } + globalUplinkBucketSize = byte(global.BucketSize & 0x3) + } + var notifyReloadRate byte = 0x7f + var notifyBucketSize byte + if notify := pld.NotifyLimits; notify != nil { + if notify.ReloadRate > 126 { + return nil, errExpectedLowerOrEqual("ReloadRate", 126)(notify.ReloadRate) + } + notifyReloadRate = byte(notify.ReloadRate & 0x7f) + if notify.BucketSize > 3 { + return nil, errExpectedLowerOrEqual("BucketSize", 3)(notify.BucketSize) + } + notifyBucketSize = byte(notify.BucketSize & 0x3) + } + var joinRequestLimits byte = 0x7f + var joinRequestBucketSize byte + if joinReq := pld.JoinRequestLimits; joinReq != nil { + if joinReq.ReloadRate > 126 { + return nil, errExpectedLowerOrEqual("ReloadRate", 126)(joinReq.ReloadRate) + } + joinRequestLimits = byte(joinReq.ReloadRate & 0x7f) + if joinReq.BucketSize > 3 { + return nil, errExpectedLowerOrEqual("BucketSize", 3)(joinReq.BucketSize) + } + joinRequestBucketSize = byte(joinReq.BucketSize & 0x3) + } + var reloadRate uint32 + reloadRate |= uint32(overallReloadRate) + reloadRate |= uint32(globalUplinkReloadRate) << 7 + reloadRate |= uint32(notifyReloadRate) << 14 + reloadRate |= uint32(joinRequestLimits) << 21 + reloadRate |= uint32(pld.ResetLimitCounter&0x3) << 28 + b = byteutil.AppendUint32(b, reloadRate, 4) + var bucketSize byte + bucketSize |= overallBucketSize + bucketSize |= globalUplinkBucketSize << 2 + bucketSize |= notifyBucketSize << 4 + bucketSize |= joinRequestBucketSize << 6 + b = append(b, bucketSize) + return b, nil + }, + UnmarshalDownlink: newMACUnmarshaler( + ttnpb.MACCommandIdentifier_CID_RELAY_CONFIGURE_FWD_LIMIT, + "RelayConfigureFwdLimitReq", + 5, + func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) error { + req := &ttnpb.MACCommand_RelayConfigureFwdLimitReq{} + cmd.Payload = &ttnpb.MACCommand_RelayConfigureFwdLimitReq_{ + RelayConfigureFwdLimitReq: req, + } + bucketSize, reloadRate := b[4], byteutil.ParseUint32(b[0:4]) + req.ResetLimitCounter = ttnpb.RelayResetLimitCounter((reloadRate >> 28) & 0x3) + if reloadRate := reloadRate & 0x7f; reloadRate != 0x7f { + req.OverallLimits = &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize(bucketSize & 0x3), + ReloadRate: reloadRate, + } + } + if reloadRate := (reloadRate >> 7) & 0x7f; reloadRate != 0x7f { + req.GlobalUplinkLimits = &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize((bucketSize >> 2) & 0x3), + ReloadRate: reloadRate, + } + } + if reloadRate := (reloadRate >> 14) & 0x7f; reloadRate != 0x7f { + req.NotifyLimits = &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize((bucketSize >> 4) & 0x3), + ReloadRate: reloadRate, + } + } + if reloadRate := (reloadRate >> 21) & 0x7f; reloadRate != 0x7f { + req.JoinRequestLimits = &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize((bucketSize >> 6) & 0x3), + ReloadRate: reloadRate, + } + } + return nil + }, + ), + }, + ttnpb.MACCommandIdentifier_CID_RELAY_NOTIFY_NEW_END_DEVICE: &MACCommandDescriptor{ + InitiatedByDevice: true, + + UplinkLength: 6, + AppendUplink: func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) ([]byte, error) { + pld := cmd.GetRelayNotifyNewEndDeviceReq() + var powerLevel uint16 + if pld.Snr < -20 || pld.Snr > 11 { + return nil, errExpectedBetween("SNR", -20, 11)(pld.Snr) + } + powerLevel |= uint16(pld.Snr+20) & 0x1f + if pld.Rssi < -142 || pld.Rssi > -15 { + return nil, errExpectedBetween("RSSI", -142, -15)(pld.Rssi) + } + powerLevel |= uint16(-pld.Rssi-15) & 0x7f << 5 + b = byteutil.AppendUint16(b, powerLevel, 2) + if n := len(pld.DevAddr); n != 4 { + return nil, errExpectedLengthEncodedEqual("DevAddr", 4)(n) + } + devAddr := make([]byte, 4) + copyReverse(devAddr, pld.DevAddr) + b = append(b, devAddr...) + return b, nil + }, + UnmarshalUplink: newMACUnmarshaler( + ttnpb.MACCommandIdentifier_CID_RELAY_NOTIFY_NEW_END_DEVICE, + "RelayNotifyNewEndDeviceReq", + 6, + func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) error { + req := &ttnpb.MACCommand_RelayNotifyNewEndDeviceReq{} + cmd.Payload = &ttnpb.MACCommand_RelayNotifyNewEndDeviceReq_{ + RelayNotifyNewEndDeviceReq: req, + } + powerLevel := byteutil.ParseUint16(b[0:2]) + req.Snr = int32(powerLevel&0x1f) - 20 + req.Rssi = -int32(powerLevel>>5&0x7f) - 15 + req.DevAddr = make([]byte, 4) + copyReverse(req.DevAddr, b[2:6]) + return nil + }, + ), + }, } var ( diff --git a/pkg/encoding/lorawan/mac_test.go b/pkg/encoding/lorawan/mac_test.go index 4aa93b00fb..189fd73fc9 100644 --- a/pkg/encoding/lorawan/mac_test.go +++ b/pkg/encoding/lorawan/mac_test.go @@ -372,6 +372,234 @@ func TestLoRaWANEncodingMAC(t *testing.T) { []byte{0x20, 0x02}, false, }, + + { + "RelayConfReqDisabled", + &ttnpb.MACCommand_RelayConfReq{}, + []byte{0x40, 0x00, 0x00, 0x00, 0x00, 0x00}, + false, + }, + { + "RelayConfReqNoSecondCh", + &ttnpb.MACCommand_RelayConfReq{ + Configuration: &ttnpb.MACCommand_RelayConfReq_Configuration{ + SecondChannel: nil, + DefaultChannelIndex: 0x01, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + }, + []byte{0x40, 0x00, 0x2e, 0x00, 0x00, 0x00}, + false, + }, + { + "RelayConfReqSecondCh", + &ttnpb.MACCommand_RelayConfReq{ + Configuration: &ttnpb.MACCommand_RelayConfReq_Configuration{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_200, + Frequency: 868100000, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + }, + DefaultChannelIndex: 0x01, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + }, + []byte{0x40, 0x89, 0x2e, 0x28, 0x76, 0x84}, + false, + }, + { + "RelayConfAns", + &ttnpb.MACCommand_RelayConfAns{ + SecondChannelFrequencyAck: true, + SecondChannelAckOffsetAck: false, + SecondChannelDataRateIndexAck: true, + SecondChannelIndexAck: false, + DefaultChannelIndexAck: true, + CadPeriodicityAck: true, + }, + []byte{0x40, 0x35}, + true, + }, + { + "EndDeviceConfReqDisabled", + &ttnpb.MACCommand_RelayEndDeviceConfReq{}, + []byte{0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + false, + }, + { + "EndDeviceConfReqNoSecondCh", + &ttnpb.MACCommand_RelayEndDeviceConfReq{ + Configuration: &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration{ + Mode: &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration_Dynamic{ + Dynamic: &ttnpb.RelayEndDeviceDynamicMode{ + SmartEnableLevel: ttnpb.RelaySmartEnableLevel_RELAY_SMART_ENABLE_LEVEL_64, + }, + }, + Backoff: 48, + }, + }, + []byte{0x41, 0x0b, 0x00, 0x60, 0x00, 0x00, 0x00}, + false, + }, + { + "EndDeviceConfReqSecondCh", + &ttnpb.MACCommand_RelayEndDeviceConfReq{ + Configuration: &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration{ + Mode: &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration_EndDeviceControlled{}, + Backoff: 48, + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_200, + Frequency: 868100000, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + }, + }, + }, + []byte{0x41, 0x0c, 0x89, 0x60, 0x28, 0x76, 0x84}, + false, + }, + { + "EndDeviceConfAns", + &ttnpb.MACCommand_RelayEndDeviceConfAns{ + SecondChannelFrequencyAck: true, + SecondChannelDataRateIndexAck: true, + SecondChannelIndexAck: false, + BackoffAck: true, + }, + []byte{0x41, 0x0b}, + true, + }, + { + "UpdateUplinkListReqNoForwardLimits", + &ttnpb.MACCommand_RelayUpdateUplinkListReq{ + RuleIndex: 1, + DevAddr: []byte{0x41, 0x42, 0x43, 0x44}, + WFCnt: 0x00be00ef, + RootWorSKey: []byte{ + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, + }, + }, + []byte{ + 0x43, // CID + 0x01, // RuleIndex + 0x3f, // No limits + 0x44, 0x43, 0x42, 0x41, // DevAddr + 0xef, 0x00, 0xbe, 0x00, // WFCnt + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, // RootWorSKey + }, + false, + }, + { + "UpdateUplinkListReqForwardLimits", + &ttnpb.MACCommand_RelayUpdateUplinkListReq{ + RuleIndex: 1, + ForwardLimits: &ttnpb.RelayUplinkForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_2, + ReloadRate: 48, + }, + DevAddr: []byte{0x41, 0x42, 0x43, 0x44}, + WFCnt: 0x00be00ef, + RootWorSKey: []byte{ + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, + }, + }, + []byte{ + 0x43, // CID + 0x01, // RuleIndex + 0x70, // BucketSize = 2, ReloadRate = 48 + 0x44, 0x43, 0x42, 0x41, // DevAddr + 0xef, 0x00, 0xbe, 0x00, // WFCnt + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, // RootWorSKey + }, + false, + }, + { + "UpdateUplinkListAns", + &ttnpb.MACCommand_RelayUpdateUplinkListAns{}, + []byte{0x43}, + true, + }, + { + "RelayCtrlUplinkListReqRemoveTrustedEndDevice", + &ttnpb.MACCommand_RelayCtrlUplinkListReq{ + RuleIndex: 2, + Action: ttnpb.RelayCtrlUplinkListAction_RELAY_CTRL_UPLINK_LIST_ACTION_REMOVE_TRUSTED_END_DEVICE, + }, + []byte{0x44, 0x12}, + false, + }, + { + "RelayCtrlUplinkListReqReadWFCnt", + &ttnpb.MACCommand_RelayCtrlUplinkListReq{ + RuleIndex: 3, + Action: ttnpb.RelayCtrlUplinkListAction_RELAY_CTRL_UPLINK_LIST_ACTION_READ_W_F_CNT, + }, + []byte{0x44, 0x03}, + false, + }, + { + "RelayCtrlUplinkListAnsAccept", + &ttnpb.MACCommand_RelayCtrlUplinkListAns{ + RuleIndexAck: true, + WFCnt: 0x11223344, + }, + []byte{0x44, 0x01, 0x44, 0x33, 0x22, 0x11}, + true, + }, + { + "RelayCtrlUplinkListAnsReject", + &ttnpb.MACCommand_RelayCtrlUplinkListAns{ + RuleIndexAck: false, + WFCnt: 0, + }, + []byte{0x44, 0x00, 0x00, 0x00, 0x00, 0x00}, + true, + }, + { + "ConfigureFwdLimitReqNoLimits", + &ttnpb.MACCommand_RelayConfigureFwdLimitReq{}, + []byte{0x45, 0xff, 0xff, 0xff, 0x0f, 0x00}, + false, + }, + { + "ConfigureFwdLimitReqLimits", + &ttnpb.MACCommand_RelayConfigureFwdLimitReq{ + ResetLimitCounter: ttnpb.RelayResetLimitCounter_RELAY_RESET_LIMIT_COUNTER_NO_RESET, + JoinRequestLimits: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_1, + ReloadRate: 12, + }, + NotifyLimits: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_2, + ReloadRate: 23, + }, + GlobalUplinkLimits: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_4, + ReloadRate: 34, + }, + OverallLimits: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_12, + ReloadRate: 45, + }, + }, + []byte{0x45, 0x2d, 0xd1, 0x85, 0x31, 0x1b}, + false, + }, + { + "ConfigureFwdLimitAns", + &ttnpb.MACCommand_RelayConfigureFwdLimitAns{}, + []byte{0x45}, + true, + }, + { + "NotifyNewEndDeviceReq", + &ttnpb.MACCommand_RelayNotifyNewEndDeviceReq{ + DevAddr: []byte{0x41, 0x42, 0x43, 0x44}, + Snr: 6, + Rssi: -64, + }, + []byte{0x46, 0x3a, 0x06, 0x44, 0x43, 0x42, 0x41}, + true, + }, } { t.Run(tc.Name, func(t *testing.T) { a := assertions.New(t) diff --git a/pkg/encoding/lorawan/relay.go b/pkg/encoding/lorawan/relay.go new file mode 100644 index 0000000000..b6620652dd --- /dev/null +++ b/pkg/encoding/lorawan/relay.go @@ -0,0 +1,91 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package lorawan + +import ( + "go.thethings.network/lorawan-stack/v3/pkg/band" + "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" + "go.thethings.network/lorawan-stack/v3/pkg/util/byteutil" +) + +// MarshalRelayForwardDownlinkReq marshals a RelayForwardDownlinkReq. +func MarshalRelayForwardDownlinkReq(req *ttnpb.RelayForwardDownlinkReq) ([]byte, error) { + if len(req.RawPayload) == 0 { + return nil, errMissing("RawPayload") + } + return req.RawPayload, nil +} + +// UnmarshalRelayForwardDownlinkReq unmarshals b into req. +func UnmarshalRelayForwardDownlinkReq(b []byte, req *ttnpb.RelayForwardDownlinkReq) error { + if len(b) == 0 { + return errMissing("RawPayload") + } + req.RawPayload = b + return nil +} + +// MarshalRelayForwardUplinkReq marshals a RelayForwardUplinkReq. +func MarshalRelayForwardUplinkReq(phy *band.Band, req *ttnpb.RelayForwardUplinkReq) ([]byte, error) { + if len(req.RawPayload) == 0 { + return nil, errMissing("RawPayload") + } + var uplinkMetadata uint32 + if req.WorChannel > 1 { + return nil, errExpectedLowerOrEqual("WORChannel", 1)(req.WorChannel) + } + uplinkMetadata |= uint32(req.WorChannel&0x3) << 16 + if req.Rssi < -142 || req.Rssi > -15 { + return nil, errExpectedBetween("RSSI", -142, -15)(req.Rssi) + } + uplinkMetadata |= uint32(-(req.Rssi+15)&0x7f) << 9 + if req.Snr < -20 || req.Snr > 11 { + return nil, errExpectedBetween("SNR", -20, 11)(req.Snr) + } + uplinkMetadata |= uint32((req.Snr+20)&0x1f) << 4 + drIdx, _, found := phy.FindUplinkDataRate(req.DataRate) + if !found { + return nil, errMissing("DataRate") + } + uplinkMetadata |= uint32(drIdx & 0xf) + b := make([]byte, 0, 6+len(req.RawPayload)) + b = byteutil.AppendUint32(b, uplinkMetadata, 3) + b = byteutil.AppendUint64(b, req.Frequency/phy.FreqMultiplier, 3) + if n := len(req.RawPayload); n == 0 { + return nil, errExpectedLengthHigherOrEqual("RawPayload", 1)(n) + } + b = append(b, req.RawPayload...) + return b, nil +} + +// UnmarshalRelayForwardUplinkReq unmarshals b into req. +func UnmarshalRelayForwardUplinkReq(phy *band.Band, b []byte, req *ttnpb.RelayForwardUplinkReq) error { + if n := len(b); n < 6 { + return errExpectedLengthHigherOrEqual("RawPayload", 6)(n) + } + uplinkMetadata := byteutil.ParseUint32(b[:3]) + req.WorChannel = ttnpb.RelayWORChannel(uplinkMetadata>>16) & 0x3 + req.Rssi = -int32(uplinkMetadata>>9&0x7f) - 15 + req.Snr = int32(uplinkMetadata>>4&0x1f) - 20 + drIdx := ttnpb.DataRateIndex(uplinkMetadata & 0xf) + dataRate, ok := phy.DataRates[drIdx] + if !ok { + return errMissing("DataRate") + } + req.DataRate = dataRate.Rate + req.Frequency = byteutil.ParseUint64(b[3:6]) * phy.FreqMultiplier + req.RawPayload = b[6:] + return nil +} diff --git a/pkg/encoding/lorawan/relay_test.go b/pkg/encoding/lorawan/relay_test.go new file mode 100644 index 0000000000..ce9af13ced --- /dev/null +++ b/pkg/encoding/lorawan/relay_test.go @@ -0,0 +1,148 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package lorawan_test + +import ( + "testing" + + "github.com/smarty/assertions" + "go.thethings.network/lorawan-stack/v3/pkg/band" + "go.thethings.network/lorawan-stack/v3/pkg/encoding/lorawan" + "go.thethings.network/lorawan-stack/v3/pkg/errors" + "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" + "go.thethings.network/lorawan-stack/v3/pkg/util/test/assertions/should" +) + +func TestMarshalRelayForwardDownlinkReq(t *testing.T) { + t.Parallel() + + a := assertions.New(t) + + _, err := lorawan.MarshalRelayForwardDownlinkReq(&ttnpb.RelayForwardDownlinkReq{}) + a.So(err, should.NotBeNil) + + b, err := lorawan.MarshalRelayForwardDownlinkReq(&ttnpb.RelayForwardDownlinkReq{ + RawPayload: []byte{0x01, 0x02, 0x03}, + }) + if a.So(err, should.BeNil) { + a.So(b, should.Resemble, []byte{0x01, 0x02, 0x03}) + } +} + +func TestUnmarshalRelayForwardDownlinkReq(t *testing.T) { + t.Parallel() + + a := assertions.New(t) + + err := lorawan.UnmarshalRelayForwardDownlinkReq(nil, &ttnpb.RelayForwardDownlinkReq{}) + a.So(err, should.NotBeNil) + + var req ttnpb.RelayForwardDownlinkReq + err = lorawan.UnmarshalRelayForwardDownlinkReq([]byte{0x01, 0x02, 0x03}, &req) + if a.So(err, should.BeNil) { + a.So(req.RawPayload, should.Resemble, []byte{0x01, 0x02, 0x03}) + } +} + +func TestMarshalRelayForwardUplinkReq(t *testing.T) { + t.Parallel() + + a, phy := assertions.New(t), &band.EU_863_870_RP2_V1_0_4 + for _, tc := range []struct { + Name string + Request *ttnpb.RelayForwardUplinkReq + }{ + { + Name: "InvalidWORChannel", + Request: &ttnpb.RelayForwardUplinkReq{ + WorChannel: 2, + }, + }, + { + Name: "InvalidRSSI", + Request: &ttnpb.RelayForwardUplinkReq{ + WorChannel: ttnpb.RelayWORChannel_RELAY_WOR_CHANNEL_DEFAULT, + Rssi: -143, + }, + }, + { + Name: "InvalidSNR", + Request: &ttnpb.RelayForwardUplinkReq{ + WorChannel: ttnpb.RelayWORChannel_RELAY_WOR_CHANNEL_DEFAULT, + Rssi: -64, + Snr: -21, + }, + }, + { + Name: "InvalidDataRateIndex", + Request: &ttnpb.RelayForwardUplinkReq{ + WorChannel: ttnpb.RelayWORChannel_RELAY_WOR_CHANNEL_DEFAULT, + Rssi: -64, + Snr: 5, + DataRate: &ttnpb.DataRate{}, + }, + }, + { + Name: "InvalidRawPayload", + Request: &ttnpb.RelayForwardUplinkReq{ + WorChannel: ttnpb.RelayWORChannel_RELAY_WOR_CHANNEL_DEFAULT, + Rssi: -64, + Snr: 5, + DataRate: phy.DataRates[ttnpb.DataRateIndex_DATA_RATE_1].Rate, + }, + }, + } { + tc := tc + t.Run(tc.Name, func(t *testing.T) { + t.Parallel() + + a := assertions.New(t) + _, err := lorawan.MarshalRelayForwardUplinkReq(phy, tc.Request) + a.So(errors.IsInvalidArgument(err), should.BeTrue) + }) + } + + b, err := lorawan.MarshalRelayForwardUplinkReq(phy, &ttnpb.RelayForwardUplinkReq{ + WorChannel: ttnpb.RelayWORChannel_RELAY_WOR_CHANNEL_SECONDARY, + Rssi: -64, + Snr: 5, + DataRate: phy.DataRates[ttnpb.DataRateIndex_DATA_RATE_1].Rate, + Frequency: 868100000, + RawPayload: []byte{0x01, 0x02, 0x03}, + }) + if a.So(err, should.BeNil) { + a.So(b, should.Resemble, []byte{0x91, 0x63, 0x01, 0x28, 0x76, 0x84, 0x01, 0x02, 0x03}) + } +} + +func TestUnmarshalRelayForwardUplinkReq(t *testing.T) { + t.Parallel() + + a, phy := assertions.New(t), &band.EU_863_870_RP2_V1_0_4 + + err := lorawan.UnmarshalRelayForwardUplinkReq(phy, nil, &ttnpb.RelayForwardUplinkReq{}) + a.So(err, should.NotBeNil) + + var req ttnpb.RelayForwardUplinkReq + err = lorawan.UnmarshalRelayForwardUplinkReq(phy, []byte{0x91, 0x63, 0x01, 0x28, 0x76, 0x84, 0x01, 0x02, 0x03}, &req) + if a.So(err, should.BeNil) { + a.So(req.WorChannel, should.Equal, ttnpb.RelayWORChannel_RELAY_WOR_CHANNEL_SECONDARY) + a.So(req.Rssi, should.Equal, -64) + a.So(req.Snr, should.Equal, 5) + a.So(req.DataRate, should.Resemble, phy.DataRates[ttnpb.DataRateIndex_DATA_RATE_1].Rate) + a.So(req.Frequency, should.Equal, 868100000) + a.So(req.RawPayload, should.Resemble, []byte{0x01, 0x02, 0x03}) + } +} diff --git a/pkg/networkserver/downlink.go b/pkg/networkserver/downlink.go index a2379869dc..686e6a23c4 100644 --- a/pkg/networkserver/downlink.go +++ b/pkg/networkserver/downlink.go @@ -35,6 +35,7 @@ import ( "go.thethings.network/lorawan-stack/v3/pkg/networkserver/mac" "go.thethings.network/lorawan-stack/v3/pkg/packetbroker" "go.thethings.network/lorawan-stack/v3/pkg/specification/macspec" + "go.thethings.network/lorawan-stack/v3/pkg/specification/relayspec" "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" "go.thethings.network/lorawan-stack/v3/pkg/types" "go.thethings.network/lorawan-stack/v3/pkg/unique" @@ -204,9 +205,10 @@ func (ns *NetworkServer) generateDataDownlink(ctx context.Context, dev *ttnpb.En maxDownPayloadLen := maxDownLen var ( - fPending bool - genState generateDownlinkState - cmdBuf []byte + fPending bool + genState generateDownlinkState + cmdBuf []byte + relayPayload []byte ) if class == ttnpb.Class_CLASS_A { spec := lorawan.DefaultMACCommands @@ -238,6 +240,18 @@ func (ns *NetworkServer) generateDataDownlink(ctx context.Context, dev *ttnpb.En dev.MacState.QueuedResponses = nil dev.MacState.PendingRequests = dev.MacState.PendingRequests[:0] + if relayDownlink := dev.MacState.PendingRelayDownlink; relayDownlink != nil { + // NOTE: We attempt to enqueue the pending relay downlink if the already + // enqueued MAC command responses fit into FOpts and the relay payload + // is smaller than the remaining space. + queuedResponsesLen := maxDownPayloadLen - maxDownLen + relayPayloadLen := uint16(len(relayDownlink.RawPayload)) + if queuedResponsesLen <= fOptsCapacity && relayPayloadLen <= maxDownLen { + relayPayload = relayDownlink.RawPayload + maxDownLen = fOptsCapacity - queuedResponsesLen + } + } + enqueuers := []func(context.Context, *ttnpb.EndDevice, uint16, uint16) mac.EnqueueState{ mac.EnqueueDutyCycleReq, func(ctx context.Context, dev *ttnpb.EndDevice, maxDownLen uint16, maxUpLen uint16) mac.EnqueueState { @@ -273,6 +287,13 @@ func (ns *NetworkServer) generateDataDownlink(ctx context.Context, dev *ttnpb.En func(ctx context.Context, dev *ttnpb.EndDevice, maxDownLen uint16, maxUpLen uint16) mac.EnqueueState { return mac.EnqueueDevStatusReq(ctx, dev, maxDownLen, maxUpLen, ns.defaultMACSettings, transmitAt) }, + mac.EnqueueRelayConfReq, + mac.EnqueueRelayEndDeviceConfReq, + func(ctx context.Context, dev *ttnpb.EndDevice, maxDownLen uint16, maxUpLen uint16) mac.EnqueueState { + return mac.EnqueueRelayUpdateUplinkListReq(ctx, dev, maxDownLen, maxUpLen, ns.relayKeyService()) + }, + mac.EnqueueRelayCtrlUplinkListReq, + mac.EnqueueRelayConfigureFwdLimitReq, } for _, f := range enqueuers { @@ -302,6 +323,10 @@ func (ns *NetworkServer) generateDataDownlink(ctx context.Context, dev *ttnpb.En cmdBuf = b } ctx = log.NewContext(ctx, logger) + + for i, req := range dev.MacState.PendingRequests { + dev.MacState.PendingRequests[i] = req.Sanitized() + } } var needsDownlink bool @@ -347,7 +372,7 @@ func (ns *NetworkServer) generateDataDownlink(ctx context.Context, dev *ttnpb.En ctx = log.NewContext(ctx, logger) cmdsInFOpts := len(cmdBuf) <= fOptsCapacity - if cmdsInFOpts { + if cmdsInFOpts && len(relayPayload) == 0 { appDowns := dev.Session.QueuedApplicationDownlinks[:0:0] outer: for i, down := range dev.Session.QueuedApplicationDownlinks { @@ -465,7 +490,7 @@ func (ns *NetworkServer) generateDataDownlink(ctx context.Context, dev *ttnpb.En mType = ttnpb.MType_CONFIRMED_DOWN } - case len(cmdBuf) > 0, needsDownlink: + case len(cmdBuf) > 0, len(relayPayload) > 0, needsDownlink: pld.FullFCnt = func() uint32 { for i := len(dev.MacState.RecentDownlinks) - 1; i >= 0; i-- { down := dev.MacState.RecentDownlinks[i] @@ -495,6 +520,25 @@ func (ns *NetworkServer) generateDataDownlink(ctx context.Context, dev *ttnpb.En } return 0 }() + if len(relayPayload) > 0 { + logger.Debug("Add relay downlink to buffer") + if dev.GetSession().GetKeys().GetNwkSEncKey() == nil { + return nil, genState, errUnknownNwkSEncKey.New() + } + key, err := cryptoutil.UnwrapAES128Key(ctx, dev.Session.Keys.NwkSEncKey, ns.KeyService()) + if err != nil { + logger.WithField("kek_label", dev.Session.Keys.NwkSEncKey.KekLabel).WithError(err).Warn("Failed to unwrap NwkSEncKey") + return nil, genState, err + } + encPayload, err := crypto.EncryptDownlink( + key, types.MustDevAddr(dev.Session.DevAddr).OrZero(), pld.FullFCnt, relayPayload, + ) + if err != nil { + return nil, genState, errEncryptMAC.WithCause(err) + } + pld.FPort = relayspec.FPort + pld.FrmPayload = encPayload + } default: return nil, genState, errNoDownlink.New() @@ -694,6 +738,9 @@ func downlinkPathsFromMetadata( case md.PacketBroker != nil: path.GatewayIdentifiers = packetbroker.GatewayIdentifiers tail = append(tail, path) + case md.Relay != nil: + path.GatewayIdentifiers = relayspec.GatewayIdentifiers + tail = append(tail, path) default: path.GatewayIdentifiers = md.GatewayIds switch md.DownlinkPathConstraint { @@ -891,6 +938,12 @@ func (ns *NetworkServer) scheduleDownlinkByPaths( continue } target = &packetBrokerDownlinkTarget{peer: peer} + case proto.Equal(path.GatewayIdentifiers, relayspec.GatewayIdentifiers): + target = &relayDownlinkTarget{ + servedEndDeviceIDs: req.EndDeviceIdentifiers, + servedSessionKeyID: req.SessionKeyID, + patchServingDevice: ns.relayPatchServingDevice, + } default: logger := logger.WithFields(log.Fields( "target", "gateway_server", @@ -1398,10 +1451,12 @@ func (ns *NetworkServer) attemptClassADataDownlink(ctx context.Context, dev *ttn ctx = events.ContextWithCorrelationID(ctx, slot.Uplink.CorrelationIds...) if !dev.MacState.RxWindowsAvailable { log.FromContext(ctx).Error("RX windows not available, skip class A downlink slot") + dev.MacState.PendingRelayDownlink = nil dev.MacState.QueuedResponses = nil dev.MacState.RxWindowsAvailable = false return downlinkAttemptResult{ SetPaths: []string{ + "mac_state.pending_relay_downlink", "mac_state.queued_responses", "mac_state.rx_windows_available", }, @@ -1432,10 +1487,12 @@ func (ns *NetworkServer) attemptClassADataDownlink(ctx context.Context, dev *ttn ) queuedEvents = append(queuedEvents, rxParametersEvents...) if err != nil { + dev.MacState.PendingRelayDownlink = nil dev.MacState.QueuedResponses = nil dev.MacState.RxWindowsAvailable = false return downlinkAttemptResult{ SetPaths: []string{ + "mac_state.pending_relay_downlink", "mac_state.queued_responses", "mac_state.rx_windows_available", }, @@ -1448,10 +1505,12 @@ func (ns *NetworkServer) attemptClassADataDownlink(ctx context.Context, dev *ttn attemptRX2 = rxParameters.attemptRX2 ) if !attemptRX1 && !attemptRX2 { + dev.MacState.PendingRelayDownlink = nil dev.MacState.QueuedResponses = nil dev.MacState.RxWindowsAvailable = false return downlinkAttemptResult{ SetPaths: []string{ + "mac_state.pending_relay_downlink", "mac_state.queued_responses", "mac_state.rx_windows_available", }, @@ -1496,11 +1555,13 @@ func (ns *NetworkServer) attemptClassADataDownlink(ctx context.Context, dev *ttn attemptRX2 = len(genDown.RawPayload) <= int(rxParameters.rx2MaxMACPayloadSize)+5 if !attemptRX1 && !attemptRX2 { log.FromContext(ctx).Error("Generated downlink payload size does not fit neither RX1, nor RX2, skip class A downlink slot") + dev.MacState.PendingRelayDownlink = nil dev.MacState.QueuedResponses = nil dev.MacState.RxWindowsAvailable = false return downlinkAttemptResult{ DownlinkTaskUpdateStrategy: nextDownlinkTask, SetPaths: ttnpb.AddFields(sets, + "mac_state.pending_relay_downlink", "mac_state.queued_responses", "mac_state.rx_windows_available", ), @@ -1554,10 +1615,12 @@ func (ns *NetworkServer) attemptClassADataDownlink(ctx context.Context, dev *ttn if genState.ApplicationDownlink != nil { dev.Session.QueuedApplicationDownlinks = append([]*ttnpb.ApplicationDownlink{genState.ApplicationDownlink}, dev.Session.QueuedApplicationDownlinks...) } + dev.MacState.PendingRelayDownlink = nil dev.MacState.QueuedResponses = nil dev.MacState.RxWindowsAvailable = false return downlinkAttemptResult{ SetPaths: ttnpb.AddFields(sets, + "mac_state.pending_relay_downlink", "mac_state.queued_responses", "mac_state.rx_windows_available", ), @@ -1572,11 +1635,13 @@ func (ns *NetworkServer) attemptClassADataDownlink(ctx context.Context, dev *ttn dev.Session.QueuedApplicationDownlinks = dev.Session.QueuedApplicationDownlinks[:0:0] } recordDataDownlink(dev, genState, genDown.NeedsMACAnswer, down, ns.defaultMACSettings) + dev.MacState.PendingRelayDownlink = nil return downlinkAttemptResult{ SetPaths: ttnpb.AddFields(sets, "mac_state.last_confirmed_downlink_at", "mac_state.last_downlink_at", "mac_state.pending_application_downlink", + "mac_state.pending_relay_downlink", "mac_state.pending_requests", "mac_state.queued_responses", "mac_state.recent_downlinks", @@ -1979,6 +2044,7 @@ func (ns *NetworkServer) processDownlinkTask(ctx context.Context, consumerID str &scheduleRequest{ TxRequest: req, EndDeviceIdentifiers: dev.Ids, + SessionKeyID: dev.PendingMacState.QueuedJoinAccept.Keys.SessionKeyId, RawPayload: dev.PendingMacState.QueuedJoinAccept.Payload, Payload: &ttnpb.Message{ MHdr: &ttnpb.MHDR{ diff --git a/pkg/networkserver/grpc.go b/pkg/networkserver/grpc.go index dac4c4d99c..e49535dfed 100644 --- a/pkg/networkserver/grpc.go +++ b/pkg/networkserver/grpc.go @@ -79,6 +79,8 @@ func (ns *NetworkServer) GetDefaultMACSettings(ctx context.Context, req *ttnpb.G UplinkDwellTime: mac.DeviceUplinkDwellTime(nil, phy, ns.defaultMACSettings), DownlinkDwellTime: mac.DeviceDownlinkDwellTime(nil, phy, ns.defaultMACSettings), ScheduleDownlinks: &ttnpb.BoolValue{Value: mac.DeviceScheduleDownlinks(nil, ns.defaultMACSettings)}, + Relay: mac.DeviceDefaultRelayParameters(nil, ns.defaultMACSettings), + DesiredRelay: mac.DeviceDesiredRelayParameters(nil, ns.defaultMACSettings), } return settings, nil } diff --git a/pkg/networkserver/grpc_deviceregistry.go b/pkg/networkserver/grpc_deviceregistry.go index 2ef6b5748d..7861882413 100644 --- a/pkg/networkserver/grpc_deviceregistry.go +++ b/pkg/networkserver/grpc_deviceregistry.go @@ -613,6 +613,29 @@ var ( "pending_mac_state.current_parameters.ping_slot_frequency", "pending_mac_state.current_parameters.rejoin_count_periodicity", "pending_mac_state.current_parameters.rejoin_time_periodicity", + "pending_mac_state.current_parameters.relay.mode.served.backoff", + "pending_mac_state.current_parameters.relay.mode.served.mode.always", + "pending_mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "pending_mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "pending_mac_state.current_parameters.relay.mode.served.serving_device_id", + "pending_mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "pending_mac_state.current_parameters.relay.mode.serving.default_channel_index", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "pending_mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "pending_mac_state.current_parameters.rx1_data_rate_offset", "pending_mac_state.current_parameters.rx1_delay", "pending_mac_state.current_parameters.rx2_data_rate_index", @@ -632,6 +655,29 @@ var ( "pending_mac_state.desired_parameters.ping_slot_frequency", "pending_mac_state.desired_parameters.rejoin_count_periodicity", "pending_mac_state.desired_parameters.rejoin_time_periodicity", + "pending_mac_state.desired_parameters.relay.mode.served.backoff", + "pending_mac_state.desired_parameters.relay.mode.served.mode.always", + "pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "pending_mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "pending_mac_state.desired_parameters.relay.mode.served.serving_device_id", + "pending_mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "pending_mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "pending_mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "pending_mac_state.desired_parameters.rx1_data_rate_offset", "pending_mac_state.desired_parameters.rx1_delay", "pending_mac_state.desired_parameters.rx2_data_rate_index", @@ -697,7 +743,99 @@ var ( ifNotZeroThenZeroFields = map[string][]string{ "multicast": { + "mac_settings.desired_relay.mode.served.backoff", + "mac_settings.desired_relay.mode.served.mode.always", + "mac_settings.desired_relay.mode.served.mode.dynamic.smart_enable_level", + "mac_settings.desired_relay.mode.served.mode.end_device_controlled", + "mac_settings.desired_relay.mode.served.second_channel.ack_offset", + "mac_settings.desired_relay.mode.served.second_channel.data_rate_index", + "mac_settings.desired_relay.mode.served.second_channel.frequency", + "mac_settings.desired_relay.mode.served.serving_device_id", + "mac_settings.desired_relay.mode.serving.cad_periodicity", + "mac_settings.desired_relay.mode.serving.default_channel_index", + "mac_settings.desired_relay.mode.serving.limits.join_requests.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.join_requests.reload_rate", + "mac_settings.desired_relay.mode.serving.limits.notifications.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.notifications.reload_rate", + "mac_settings.desired_relay.mode.serving.limits.overall.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.overall.reload_rate", + "mac_settings.desired_relay.mode.serving.limits.reset_behavior", + "mac_settings.desired_relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_settings.desired_relay.mode.serving.second_channel.ack_offset", + "mac_settings.desired_relay.mode.serving.second_channel.data_rate_index", + "mac_settings.desired_relay.mode.serving.second_channel.frequency", + "mac_settings.desired_relay.mode.serving.uplink_forwarding_rules", + "mac_settings.relay.mode.served.backoff", + "mac_settings.relay.mode.served.mode.always", + "mac_settings.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_settings.relay.mode.served.mode.end_device_controlled", + "mac_settings.relay.mode.served.second_channel.ack_offset", + "mac_settings.relay.mode.served.second_channel.data_rate_index", + "mac_settings.relay.mode.served.second_channel.frequency", + "mac_settings.relay.mode.served.serving_device_id", + "mac_settings.relay.mode.serving.cad_periodicity", + "mac_settings.relay.mode.serving.default_channel_index", + "mac_settings.relay.mode.serving.limits.join_requests.bucket_size", + "mac_settings.relay.mode.serving.limits.join_requests.reload_rate", + "mac_settings.relay.mode.serving.limits.notifications.bucket_size", + "mac_settings.relay.mode.serving.limits.notifications.reload_rate", + "mac_settings.relay.mode.serving.limits.overall.bucket_size", + "mac_settings.relay.mode.serving.limits.overall.reload_rate", + "mac_settings.relay.mode.serving.limits.reset_behavior", + "mac_settings.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_settings.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_settings.relay.mode.serving.second_channel.ack_offset", + "mac_settings.relay.mode.serving.second_channel.data_rate_index", + "mac_settings.relay.mode.serving.second_channel.frequency", + "mac_settings.relay.mode.serving.uplink_forwarding_rules", "mac_settings.schedule_downlinks.value", + "mac_state.current_parameters.relay.mode.served.backoff", + "mac_state.current_parameters.relay.mode.served.mode.always", + "mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "mac_state.current_parameters.relay.mode.served.serving_device_id", + "mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "mac_state.current_parameters.relay.mode.serving.default_channel_index", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", + "mac_state.desired_parameters.relay.mode.served.backoff", + "mac_state.desired_parameters.relay.mode.served.mode.always", + "mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "mac_state.desired_parameters.relay.mode.served.serving_device_id", + "mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "mac_state.last_adr_change_f_cnt_up", "mac_state.last_confirmed_downlink_at", "mac_state.last_dev_status_f_cnt_up", @@ -905,6 +1043,28 @@ var ( "mac_state.current_parameters.ping_slot_frequency", "mac_state.current_parameters.rejoin_count_periodicity", "mac_state.current_parameters.rejoin_time_periodicity", + "mac_state.current_parameters.relay.mode.served.backoff", + "mac_state.current_parameters.relay.mode.served.mode.always", + "mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "mac_state.current_parameters.relay.mode.serving.default_channel_index", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "mac_state.current_parameters.rx1_data_rate_offset", "mac_state.current_parameters.rx1_delay", "mac_state.current_parameters.rx2_data_rate_index", @@ -924,6 +1084,28 @@ var ( "mac_state.desired_parameters.ping_slot_frequency", "mac_state.desired_parameters.rejoin_count_periodicity", "mac_state.desired_parameters.rejoin_time_periodicity", + "mac_state.desired_parameters.relay.mode.served.backoff", + "mac_state.desired_parameters.relay.mode.served.mode.always", + "mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "mac_state.desired_parameters.rx1_data_rate_offset", "mac_state.desired_parameters.rx1_delay", "mac_state.desired_parameters.rx2_data_rate_index", @@ -1266,11 +1448,17 @@ func (ns *NetworkServer) Set(ctx context.Context, req *ttnpb.SetEndDeviceRequest "mac_settings.adr.mode", "mac_settings.adr", "mac_settings.desired_ping_slot_data_rate_index.value", + "mac_settings.desired_relay.mode.served.second_channel.data_rate_index", + "mac_settings.desired_relay.mode.serving.default_channel_index", + "mac_settings.desired_relay.mode.serving.second_channel.data_rate_index", "mac_settings.desired_rx2_data_rate_index.value", "mac_settings.downlink_dwell_time.value", "mac_settings.factory_preset_frequencies", "mac_settings.ping_slot_data_rate_index.value", "mac_settings.ping_slot_frequency.value", + "mac_settings.relay.mode.served.second_channel.data_rate_index", + "mac_settings.relay.mode.serving.default_channel_index", + "mac_settings.relay.mode.serving.second_channel.data_rate_index", "mac_settings.rx2_data_rate_index.value", "mac_settings.uplink_dwell_time.value", "mac_settings.use_adr.value", @@ -1278,21 +1466,33 @@ func (ns *NetworkServer) Set(ctx context.Context, req *ttnpb.SetEndDeviceRequest "mac_state.current_parameters.adr_tx_power_index", "mac_state.current_parameters.channels", "mac_state.current_parameters.ping_slot_data_rate_index_value.value", + "mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.current_parameters.relay.mode.serving.default_channel_index", + "mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", "mac_state.current_parameters.rx2_data_rate_index", "mac_state.desired_parameters.adr_data_rate_index", "mac_state.desired_parameters.adr_tx_power_index", "mac_state.desired_parameters.channels", "mac_state.desired_parameters.ping_slot_data_rate_index_value.value", + "mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", "mac_state.desired_parameters.rx2_data_rate_index", "pending_mac_state.current_parameters.adr_data_rate_index", "pending_mac_state.current_parameters.adr_tx_power_index", "pending_mac_state.current_parameters.channels", "pending_mac_state.current_parameters.ping_slot_data_rate_index_value.value", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "pending_mac_state.current_parameters.relay.mode.serving.default_channel_index", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", "pending_mac_state.current_parameters.rx2_data_rate_index", "pending_mac_state.desired_parameters.adr_data_rate_index", "pending_mac_state.desired_parameters.adr_tx_power_index", "pending_mac_state.desired_parameters.channels", "pending_mac_state.desired_parameters.ping_slot_data_rate_index_value.value", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "pending_mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", "pending_mac_state.desired_parameters.rx2_data_rate_index", "supports_class_b", ) { @@ -1439,6 +1639,60 @@ func (ns *NetworkServer) Set(ctx context.Context, req *ttnpb.SetEndDeviceRequest return nil, err } } + if field, validate := hasSetField("mac_settings.desired_relay.mode.served.second_channel.data_rate_index"); validate { + if err := st.WithField(func(dev *ttnpb.EndDevice) error { + return withPHY(func(phy *band.Band, _ *frequencyplans.FrequencyPlan) error { + if dev.GetMacSettings().GetDesiredRelay().GetServed().GetSecondChannel() == nil { + return nil + } + _, ok := phy.DataRates[dev.MacSettings.DesiredRelay.GetServed().SecondChannel.DataRateIndex] + if !ok { + return newInvalidFieldValueError(field) + } + return nil + }) + }, + field, + ); err != nil { + return nil, err + } + } + if field, validate := hasSetField("mac_settings.desired_relay.mode.serving.default_channel_index"); validate { + if err := st.WithField(func(dev *ttnpb.EndDevice) error { + return withPHY(func(phy *band.Band, _ *frequencyplans.FrequencyPlan) error { + if dev.GetMacSettings().GetDesiredRelay().GetServing() == nil { + return nil + } + chIdx := dev.MacSettings.DesiredRelay.GetServing().DefaultChannelIndex + if chIdx >= uint32(len(phy.Relay.WORChannels)) { + return newInvalidFieldValueError(field) + } + return nil + }) + }, + field, + ); err != nil { + return nil, err + } + } + if field, validate := hasSetField("mac_settings.desired_relay.mode.serving.second_channel.data_rate_index"); validate { + if err := st.WithField(func(dev *ttnpb.EndDevice) error { + return withPHY(func(phy *band.Band, _ *frequencyplans.FrequencyPlan) error { + if dev.GetMacSettings().GetDesiredRelay().GetServing().GetSecondChannel() == nil { + return nil + } + _, ok := phy.DataRates[dev.MacSettings.DesiredRelay.GetServing().SecondChannel.DataRateIndex] + if !ok { + return newInvalidFieldValueError(field) + } + return nil + }) + }, + field, + ); err != nil { + return nil, err + } + } if field, validate := hasSetField("mac_settings.adr.mode.dynamic.max_data_rate_index.value"); validate { if err := st.WithField(func(dev *ttnpb.EndDevice) error { return withPHY(func(phy *band.Band, _ *frequencyplans.FrequencyPlan) error { @@ -1603,6 +1857,60 @@ func (ns *NetworkServer) Set(ctx context.Context, req *ttnpb.SetEndDeviceRequest return nil, err } } + if field, validate := hasSetField("mac_settings.relay.mode.served.second_channel.data_rate_index"); validate { + if err := st.WithField(func(dev *ttnpb.EndDevice) error { + return withPHY(func(phy *band.Band, _ *frequencyplans.FrequencyPlan) error { + if dev.GetMacSettings().GetRelay().GetServed().GetSecondChannel() == nil { + return nil + } + _, ok := phy.DataRates[dev.MacSettings.Relay.GetServed().SecondChannel.DataRateIndex] + if !ok { + return newInvalidFieldValueError(field) + } + return nil + }) + }, + field, + ); err != nil { + return nil, err + } + } + if field, validate := hasSetField("mac_settings.relay.mode.serving.default_channel_index"); validate { + if err := st.WithField(func(dev *ttnpb.EndDevice) error { + return withPHY(func(phy *band.Band, _ *frequencyplans.FrequencyPlan) error { + if dev.GetMacSettings().GetRelay().GetServing() == nil { + return nil + } + chIdx := dev.MacSettings.Relay.GetServing().DefaultChannelIndex + if chIdx >= uint32(len(phy.Relay.WORChannels)) { + return newInvalidFieldValueError(field) + } + return nil + }) + }, + field, + ); err != nil { + return nil, err + } + } + if field, validate := hasSetField("mac_settings.relay.mode.serving.second_channel.data_rate_index"); validate { + if err := st.WithField(func(dev *ttnpb.EndDevice) error { + return withPHY(func(phy *band.Band, _ *frequencyplans.FrequencyPlan) error { + if dev.GetMacSettings().GetRelay().GetServing().GetSecondChannel() == nil { + return nil + } + _, ok := phy.DataRates[dev.MacSettings.Relay.GetServing().SecondChannel.DataRateIndex] + if !ok { + return newInvalidFieldValueError(field) + } + return nil + }) + }, + field, + ); err != nil { + return nil, err + } + } if field, validate := hasSetField("mac_state.current_parameters.rx2_data_rate_index"); validate { if err := st.WithField(func(dev *ttnpb.EndDevice) error { if dev.GetMacState() == nil { @@ -1639,6 +1947,60 @@ func (ns *NetworkServer) Set(ctx context.Context, req *ttnpb.SetEndDeviceRequest return nil, err } } + if field, validate := hasSetField("pending_mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index"); validate { + if err := st.WithField(func(dev *ttnpb.EndDevice) error { + return withPHY(func(phy *band.Band, _ *frequencyplans.FrequencyPlan) error { + if dev.GetPendingMacState().GetCurrentParameters().GetRelay().GetServed().GetSecondChannel() == nil { + return nil + } + _, ok := phy.DataRates[dev.PendingMacState.CurrentParameters.Relay.GetServed().SecondChannel.DataRateIndex] + if !ok { + return newInvalidFieldValueError(field) + } + return nil + }) + }, + field, + ); err != nil { + return nil, err + } + } + if field, validate := hasSetField("pending_mac_state.current_parameters.relay.mode.serving.default_channel_index"); validate { + if err := st.WithField(func(dev *ttnpb.EndDevice) error { + return withPHY(func(phy *band.Band, _ *frequencyplans.FrequencyPlan) error { + if dev.GetPendingMacState().GetCurrentParameters().GetRelay().GetServing() == nil { + return nil + } + chIdx := dev.PendingMacState.CurrentParameters.Relay.GetServing().DefaultChannelIndex + if chIdx >= uint32(len(phy.Relay.WORChannels)) { + return newInvalidFieldValueError(field) + } + return nil + }) + }, + field, + ); err != nil { + return nil, err + } + } + if field, validate := hasSetField("pending_mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index"); validate { + if err := st.WithField(func(dev *ttnpb.EndDevice) error { + return withPHY(func(phy *band.Band, _ *frequencyplans.FrequencyPlan) error { + if dev.GetPendingMacState().GetCurrentParameters().GetRelay().GetServing().GetSecondChannel() == nil { + return nil + } + _, ok := phy.DataRates[dev.PendingMacState.CurrentParameters.Relay.GetServing().SecondChannel.DataRateIndex] + if !ok { + return newInvalidFieldValueError(field) + } + return nil + }) + }, + field, + ); err != nil { + return nil, err + } + } if field, validate := hasSetField("pending_mac_state.current_parameters.rx2_data_rate_index"); validate { if err := st.WithField(func(dev *ttnpb.EndDevice) error { if dev.GetPendingMacState() == nil { @@ -1657,6 +2019,60 @@ func (ns *NetworkServer) Set(ctx context.Context, req *ttnpb.SetEndDeviceRequest return nil, err } } + if field, validate := hasSetField("pending_mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index"); validate { + if err := st.WithField(func(dev *ttnpb.EndDevice) error { + return withPHY(func(phy *band.Band, _ *frequencyplans.FrequencyPlan) error { + if dev.GetPendingMacState().GetDesiredParameters().GetRelay().GetServed().GetSecondChannel() == nil { + return nil + } + _, ok := phy.DataRates[dev.PendingMacState.DesiredParameters.Relay.GetServed().SecondChannel.DataRateIndex] + if !ok { + return newInvalidFieldValueError(field) + } + return nil + }) + }, + field, + ); err != nil { + return nil, err + } + } + if field, validate := hasSetField("pending_mac_state.desired_parameters.relay.mode.serving.default_channel_index"); validate { + if err := st.WithField(func(dev *ttnpb.EndDevice) error { + return withPHY(func(phy *band.Band, _ *frequencyplans.FrequencyPlan) error { + if dev.GetPendingMacState().GetDesiredParameters().GetRelay().GetServing() == nil { + return nil + } + chIdx := dev.PendingMacState.DesiredParameters.Relay.GetServing().DefaultChannelIndex + if chIdx >= uint32(len(phy.Relay.WORChannels)) { + return newInvalidFieldValueError(field) + } + return nil + }) + }, + field, + ); err != nil { + return nil, err + } + } + if field, validate := hasSetField("pending_mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index"); validate { + if err := st.WithField(func(dev *ttnpb.EndDevice) error { + return withPHY(func(phy *band.Band, _ *frequencyplans.FrequencyPlan) error { + if dev.GetPendingMacState().GetDesiredParameters().GetRelay().GetServing().GetSecondChannel() == nil { + return nil + } + _, ok := phy.DataRates[dev.PendingMacState.DesiredParameters.Relay.GetServing().SecondChannel.DataRateIndex] + if !ok { + return newInvalidFieldValueError(field) + } + return nil + }) + }, + field, + ); err != nil { + return nil, err + } + } if field, validate := hasSetField("pending_mac_state.desired_parameters.rx2_data_rate_index"); validate { if err := st.WithField(func(dev *ttnpb.EndDevice) error { if dev.GetPendingMacState() == nil { @@ -1693,6 +2109,60 @@ func (ns *NetworkServer) Set(ctx context.Context, req *ttnpb.SetEndDeviceRequest return nil, err } } + if field, validate := hasSetField("mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index"); validate { + if err := st.WithField(func(dev *ttnpb.EndDevice) error { + return withPHY(func(phy *band.Band, _ *frequencyplans.FrequencyPlan) error { + if dev.GetMacState().GetCurrentParameters().GetRelay().GetServed().GetSecondChannel() == nil { + return nil + } + _, ok := phy.DataRates[dev.MacState.CurrentParameters.Relay.GetServed().SecondChannel.DataRateIndex] + if !ok { + return newInvalidFieldValueError(field) + } + return nil + }) + }, + field, + ); err != nil { + return nil, err + } + } + if field, validate := hasSetField("mac_state.current_parameters.relay.mode.serving.default_channel_index"); validate { + if err := st.WithField(func(dev *ttnpb.EndDevice) error { + return withPHY(func(phy *band.Band, _ *frequencyplans.FrequencyPlan) error { + if dev.GetMacState().GetCurrentParameters().GetRelay().GetServing() == nil { + return nil + } + chIdx := dev.MacState.CurrentParameters.Relay.GetServing().DefaultChannelIndex + if chIdx >= uint32(len(phy.Relay.WORChannels)) { + return newInvalidFieldValueError(field) + } + return nil + }) + }, + field, + ); err != nil { + return nil, err + } + } + if field, validate := hasSetField("mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index"); validate { + if err := st.WithField(func(dev *ttnpb.EndDevice) error { + return withPHY(func(phy *band.Band, _ *frequencyplans.FrequencyPlan) error { + if dev.GetMacState().GetCurrentParameters().GetRelay().GetServing().GetSecondChannel() == nil { + return nil + } + _, ok := phy.DataRates[dev.MacState.CurrentParameters.Relay.GetServing().SecondChannel.DataRateIndex] + if !ok { + return newInvalidFieldValueError(field) + } + return nil + }) + }, + field, + ); err != nil { + return nil, err + } + } if field, validate := hasSetField("mac_state.desired_parameters.ping_slot_data_rate_index_value.value"); validate { if err := st.WithField(func(dev *ttnpb.EndDevice) error { if dev.GetMacState() == nil || dev.MacState.DesiredParameters.PingSlotDataRateIndexValue == nil { @@ -1711,6 +2181,60 @@ func (ns *NetworkServer) Set(ctx context.Context, req *ttnpb.SetEndDeviceRequest return nil, err } } + if field, validate := hasSetField("mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index"); validate { + if err := st.WithField(func(dev *ttnpb.EndDevice) error { + return withPHY(func(phy *band.Band, _ *frequencyplans.FrequencyPlan) error { + if dev.GetMacState().GetDesiredParameters().GetRelay().GetServed().GetSecondChannel() == nil { + return nil + } + _, ok := phy.DataRates[dev.MacState.DesiredParameters.Relay.GetServed().SecondChannel.DataRateIndex] + if !ok { + return newInvalidFieldValueError(field) + } + return nil + }) + }, + field, + ); err != nil { + return nil, err + } + } + if field, validate := hasSetField("mac_state.desired_parameters.relay.mode.serving.default_channel_index"); validate { + if err := st.WithField(func(dev *ttnpb.EndDevice) error { + return withPHY(func(phy *band.Band, _ *frequencyplans.FrequencyPlan) error { + if dev.GetMacState().GetDesiredParameters().GetRelay().GetServing() == nil { + return nil + } + chIdx := dev.MacState.DesiredParameters.Relay.GetServing().DefaultChannelIndex + if chIdx >= uint32(len(phy.Relay.WORChannels)) { + return newInvalidFieldValueError(field) + } + return nil + }) + }, + field, + ); err != nil { + return nil, err + } + } + if field, validate := hasSetField("mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index"); validate { + if err := st.WithField(func(dev *ttnpb.EndDevice) error { + return withPHY(func(phy *band.Band, _ *frequencyplans.FrequencyPlan) error { + if dev.GetMacState().GetDesiredParameters().GetRelay().GetServing().GetSecondChannel() == nil { + return nil + } + _, ok := phy.DataRates[dev.MacState.DesiredParameters.Relay.GetServing().SecondChannel.DataRateIndex] + if !ok { + return newInvalidFieldValueError(field) + } + return nil + }) + }, + field, + ); err != nil { + return nil, err + } + } if field, validate := hasSetField("pending_mac_state.current_parameters.ping_slot_data_rate_index_value.value"); validate { if err := st.WithField(func(dev *ttnpb.EndDevice) error { @@ -2306,6 +2830,29 @@ func (ns *NetworkServer) Set(ctx context.Context, req *ttnpb.SetEndDeviceRequest "mac_state.current_parameters.ping_slot_frequency", "mac_state.current_parameters.rejoin_count_periodicity", "mac_state.current_parameters.rejoin_time_periodicity", + "mac_state.current_parameters.relay.mode.served.backoff", + "mac_state.current_parameters.relay.mode.served.mode.always", + "mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "mac_state.current_parameters.relay.mode.served.serving_device_id", + "mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "mac_state.current_parameters.relay.mode.serving.default_channel_index", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "mac_state.current_parameters.rx1_data_rate_offset", "mac_state.current_parameters.rx1_delay", "mac_state.current_parameters.rx2_data_rate_index", @@ -2325,6 +2872,29 @@ func (ns *NetworkServer) Set(ctx context.Context, req *ttnpb.SetEndDeviceRequest "mac_state.desired_parameters.ping_slot_frequency", "mac_state.desired_parameters.rejoin_count_periodicity", "mac_state.desired_parameters.rejoin_time_periodicity", + "mac_state.desired_parameters.relay.mode.served.backoff", + "mac_state.desired_parameters.relay.mode.served.mode.always", + "mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "mac_state.desired_parameters.relay.mode.served.serving_device_id", + "mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "mac_state.desired_parameters.rx1_data_rate_offset", "mac_state.desired_parameters.rx1_delay", "mac_state.desired_parameters.rx2_data_rate_index", @@ -2346,6 +2916,8 @@ func (ns *NetworkServer) Set(ctx context.Context, req *ttnpb.SetEndDeviceRequest "mac_state.pending_application_downlink.frm_payload", "mac_state.pending_application_downlink.priority", "mac_state.pending_application_downlink.session_key_id", + "mac_state.pending_relay_downlink.raw_payload", + "mac_state.pending_relay_downlink", "mac_state.pending_requests", "mac_state.ping_slot_periodicity.value", "mac_state.queued_responses", @@ -2520,6 +3092,29 @@ func (ns *NetworkServer) Set(ctx context.Context, req *ttnpb.SetEndDeviceRequest "pending_mac_state.current_parameters.ping_slot_frequency", "pending_mac_state.current_parameters.rejoin_count_periodicity", "pending_mac_state.current_parameters.rejoin_time_periodicity", + "pending_mac_state.current_parameters.relay.mode.served.backoff", + "pending_mac_state.current_parameters.relay.mode.served.mode.always", + "pending_mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "pending_mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "pending_mac_state.current_parameters.relay.mode.served.serving_device_id", + "pending_mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "pending_mac_state.current_parameters.relay.mode.serving.default_channel_index", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "pending_mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "pending_mac_state.current_parameters.rx1_data_rate_offset", "pending_mac_state.current_parameters.rx1_delay", "pending_mac_state.current_parameters.rx2_data_rate_index", @@ -2539,6 +3134,29 @@ func (ns *NetworkServer) Set(ctx context.Context, req *ttnpb.SetEndDeviceRequest "pending_mac_state.desired_parameters.ping_slot_frequency", "pending_mac_state.desired_parameters.rejoin_count_periodicity", "pending_mac_state.desired_parameters.rejoin_time_periodicity", + "pending_mac_state.desired_parameters.relay.mode.served.backoff", + "pending_mac_state.desired_parameters.relay.mode.served.mode.always", + "pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "pending_mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "pending_mac_state.desired_parameters.relay.mode.served.serving_device_id", + "pending_mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "pending_mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "pending_mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "pending_mac_state.desired_parameters.rx1_data_rate_offset", "pending_mac_state.desired_parameters.rx1_delay", "pending_mac_state.desired_parameters.rx2_data_rate_index", @@ -2622,6 +3240,29 @@ func (ns *NetworkServer) Set(ctx context.Context, req *ttnpb.SetEndDeviceRequest "mac_state.current_parameters.ping_slot_frequency", "mac_state.current_parameters.rejoin_count_periodicity", "mac_state.current_parameters.rejoin_time_periodicity", + "mac_state.current_parameters.relay.mode.served.backoff", + "mac_state.current_parameters.relay.mode.served.mode.always", + "mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "mac_state.current_parameters.relay.mode.served.serving_device_id", + "mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "mac_state.current_parameters.relay.mode.serving.default_channel_index", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "mac_state.current_parameters.rx1_data_rate_offset", "mac_state.current_parameters.rx1_delay", "mac_state.current_parameters.rx2_data_rate_index", @@ -2641,6 +3282,29 @@ func (ns *NetworkServer) Set(ctx context.Context, req *ttnpb.SetEndDeviceRequest "mac_state.desired_parameters.ping_slot_frequency", "mac_state.desired_parameters.rejoin_count_periodicity", "mac_state.desired_parameters.rejoin_time_periodicity", + "mac_state.desired_parameters.relay.mode.served.backoff", + "mac_state.desired_parameters.relay.mode.served.mode.always", + "mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "mac_state.desired_parameters.relay.mode.served.serving_device_id", + "mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "mac_state.desired_parameters.rx1_data_rate_offset", "mac_state.desired_parameters.rx1_delay", "mac_state.desired_parameters.rx2_data_rate_index", diff --git a/pkg/networkserver/grpc_gsns.go b/pkg/networkserver/grpc_gsns.go index cce31eb588..548266c5fd 100644 --- a/pkg/networkserver/grpc_gsns.go +++ b/pkg/networkserver/grpc_gsns.go @@ -32,6 +32,8 @@ import ( "go.thethings.network/lorawan-stack/v3/pkg/networkserver/internal/time" "go.thethings.network/lorawan-stack/v3/pkg/networkserver/mac" "go.thethings.network/lorawan-stack/v3/pkg/specification/macspec" + "go.thethings.network/lorawan-stack/v3/pkg/specification/relayspec" + "go.thethings.network/lorawan-stack/v3/pkg/task" "go.thethings.network/lorawan-stack/v3/pkg/toa" "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" "go.thethings.network/lorawan-stack/v3/pkg/types" @@ -612,6 +614,18 @@ macLoop: evs, err = mac.HandleBeaconFreqAns(ctx, dev, cmd.GetBeaconFreqAns()) case ttnpb.MACCommandIdentifier_CID_DEVICE_MODE: evs, err = mac.HandleDeviceModeInd(ctx, dev, cmd.GetDeviceModeInd()) + case ttnpb.MACCommandIdentifier_CID_RELAY_CONF: + evs, err = mac.HandleRelayConfAns(ctx, dev, cmd.GetRelayConfAns()) + case ttnpb.MACCommandIdentifier_CID_RELAY_END_DEVICE_CONF: + evs, err = mac.HandleRelayEndDeviceConfAns(ctx, dev, cmd.GetRelayEndDeviceConfAns()) + case ttnpb.MACCommandIdentifier_CID_RELAY_UPDATE_UPLINK_LIST: + evs, err = mac.HandleRelayUpdateUplinkListAns(ctx, dev, cmd.GetRelayUpdateUplinkListAns()) + case ttnpb.MACCommandIdentifier_CID_RELAY_CTRL_UPLINK_LIST: + evs, err = mac.HandleRelayCtrlUplinkListAns(ctx, dev, cmd.GetRelayCtrlUplinkListAns()) + case ttnpb.MACCommandIdentifier_CID_RELAY_CONFIGURE_FWD_LIMIT: + evs, err = mac.HandleRelayConfigureFwdLimitAns(ctx, dev, cmd.GetRelayConfigureFwdLimitAns()) + case ttnpb.MACCommandIdentifier_CID_RELAY_NOTIFY_NEW_END_DEVICE: + evs, err = mac.HandleRelayNotifyNewEndDeviceReq(ctx, dev, cmd.GetRelayNotifyNewEndDeviceReq()) default: _, known := lorawan.DefaultMACCommands[cmd.Cid] logger.WithField("known", known).Debug("Unknown MAC command received") @@ -648,6 +662,7 @@ macLoop: // TODO: Notify AS of session recovery(https://github.com/TheThingsNetwork/lorawan-stack/issues/594) } dev.MacState.PendingJoinRequest = nil + dev.MacState.PendingRelayDownlink = nil dev.PendingMacState = nil dev.PendingSession = nil @@ -753,9 +768,14 @@ func toMACStateRxMetadata(mds []*ttnpb.RxMetadata) []*ttnpb.MACState_UplinkMessa if md.PacketBroker != nil { pbMD = &ttnpb.MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata{} } + var relayMD *ttnpb.MACState_UplinkMessage_RxMetadata_RelayMetadata + if md.Relay != nil { + relayMD = &ttnpb.MACState_UplinkMessage_RxMetadata_RelayMetadata{} + } recentMDs = append(recentMDs, &ttnpb.MACState_UplinkMessage_RxMetadata{ GatewayIds: md.GatewayIds, PacketBroker: pbMD, + Relay: relayMD, ChannelRssi: md.ChannelRssi, Snr: md.Snr, DownlinkPathConstraint: md.DownlinkPathConstraint, @@ -1095,7 +1115,25 @@ func (ns *NetworkServer) handleDataUplink(ctx context.Context, up *ttnpb.UplinkM } if !matched.IsRetransmission { var frmPayload []byte - if pld.FPort != 0 { + switch pld.FPort { + case 0: + case relayspec.FPort: + relayUp, relayEvents, err := handleRelayForwardingProtocol( + ctx, matched.Device, matched.FullFCnt, matched.phy, up, ns.KeyService(), + ) + queuedEvents = append(queuedEvents, relayEvents...) + if err != nil { + log.FromContext(ctx).WithError(err).Warn("Failed to handle relay forwarding protocol") + } else { + ns.StartTask(&task.Config{ + Context: ns.FromRequestContext(ctx), + ID: "loopback_relay_uplink", + Func: relayLoopbackFunc(ns.LoopbackConn(), relayUp, ns.WithClusterAuth()), + Restart: task.RestartNever, + Backoff: task.DefaultBackoffConfig, + }) + } + default: frmPayload = pld.FrmPayload } queuedApplicationUplinks = append(queuedApplicationUplinks, &ttnpb.ApplicationUp{ @@ -1351,6 +1389,10 @@ func (ns *NetworkServer) handleJoinRequest(ctx context.Context, up *ttnpb.Uplink macState.RxWindowsAvailable = true ctx = events.ContextWithCorrelationID(ctx, resp.CorrelationIds...) + if err := ns.deliverRelaySessionKeys(ctx, matched, keys.SessionKeyId); err != nil { + return err + } + publishEvents(ctx, queuedEvents...) queuedEvents = nil up = ttnpb.Clone(up) diff --git a/pkg/networkserver/internal/test/shared/device_registry.go b/pkg/networkserver/internal/test/shared/device_registry.go index bc99b37aac..558778ef9f 100644 --- a/pkg/networkserver/internal/test/shared/device_registry.go +++ b/pkg/networkserver/internal/test/shared/device_registry.go @@ -150,6 +150,16 @@ func handleDeviceRegistryTest(ctx context.Context, reg DeviceRegistry) { return false } + batchStored, err := reg.BatchGetByID( + ctx, pb.Ids.ApplicationIds, []string{pb.Ids.DeviceId}, ttnpb.EndDeviceFieldPathsTopLevel, + ) + if !test.AllTrue( + a.So(err, should.BeNil) || a.So(errors.Stack(err), should.BeEmpty), + a.So(batchStored, should.HaveLength, 1) && a.So(batchStored[0], should.BeNil), + ) { + t.Error("BatchGetByID assertion failed with empty registry") + } + stored, storedCtx, err = reg.GetByEUI( ctx, types.MustEUI64(pb.Ids.JoinEui).OrZero(), @@ -222,6 +232,17 @@ func handleDeviceRegistryTest(ctx context.Context, reg DeviceRegistry) { } ctx = storedCtx + batchStored, err := reg.BatchGetByID( + ctx, pb.Ids.ApplicationIds, []string{pb.Ids.DeviceId}, ttnpb.EndDeviceFieldPathsTopLevel, + ) + if !test.AllTrue( + a.So(err, should.BeNil) || a.So(errors.Stack(err), should.BeEmpty), + a.So(batchStored, should.HaveLength, 1) && a.So(batchStored[0], should.Resemble, pb), + ) { + t.Error("BatchGetByID assertion failed with non-empty registry") + return false + } + stored, storedCtx, err = reg.GetByEUI( ctx, types.MustEUI64(pb.Ids.JoinEui).OrZero(), diff --git a/pkg/networkserver/internal/utils.go b/pkg/networkserver/internal/utils.go index 90fcde3c5b..3d09fd1f1e 100644 --- a/pkg/networkserver/internal/utils.go +++ b/pkg/networkserver/internal/utils.go @@ -109,10 +109,12 @@ func RXMetadataStats(ctx context.Context, mds []*ttnpb.RxMetadata) (gateways int md.PacketBroker.ForwarderNetId, md.PacketBroker.ForwarderTenantId, )] = struct{}{} + case md.Relay != nil: + gtws[fmt.Sprintf("relay:%s", md.Relay.DeviceId)] = struct{}{} case md.GatewayIds != nil: gtws[unique.ID(ctx, md.GatewayIds)] = struct{}{} default: - continue // Metadata without PB or Gateway IDs should be invalid so skipping. + continue // Metadata without PB, Relay or Gateway IDs should be invalid so skipping. } if md.Snr > maxSNR { maxSNR = md.Snr diff --git a/pkg/networkserver/mac/relay.go b/pkg/networkserver/mac/relay.go new file mode 100644 index 0000000000..278c35cdce --- /dev/null +++ b/pkg/networkserver/mac/relay.go @@ -0,0 +1,152 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mac + +import ( + "context" + "fmt" + + "go.thethings.network/lorawan-stack/v3/pkg/log" + "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" + "go.thethings.network/lorawan-stack/v3/pkg/types" +) + +// RelayKeyService provides common relay related cryptographic operations. +type RelayKeyService interface { + // BatchDeriveRootWorSKey derives the RootWorSKey for the provided end devices. + // For devices with a pending session, the derived RootWorSKey is derived rom the + // pending NwkSEncKey. For devices with an active session, the derived RootWorSKey + // is derived from the active NwkSEncKey. + BatchDeriveRootWorSKey( + ctx context.Context, appID *ttnpb.ApplicationIdentifiers, deviceIDs []string, sessionKeyIDs [][]byte, + ) (devAddrs []*types.DevAddr, keys []*types.AES128Key, err error) +} + +func secondChFields(secondCh *ttnpb.RelaySecondChannel) []any { + if secondCh == nil { + return nil + } + return []any{ + "relay_second_ch_ack_offset", secondCh.AckOffset, + "relay_second_ch_data_rate_index", secondCh.DataRateIndex, + "relay_second_ch_frequency", secondCh.Frequency, + } +} + +func servingRelayFields(serving *ttnpb.ServingRelayParameters) log.Fielder { + if serving == nil { + return log.Fields() + } + return log.Fields( + append( + secondChFields(serving.SecondChannel), + "relay_default_ch_index", serving.DefaultChannelIndex, + "relay_cad_periodicity", serving.CadPeriodicity, + )..., + ) +} + +func relayForwardLimitsFields(limits *ttnpb.RelayForwardLimits, prefix string) []any { + if limits == nil { + return nil + } + return []any{ + fmt.Sprintf("relay_%v_limit_bucket_size", prefix), limits.BucketSize, + fmt.Sprintf("relay_%v_limit_reload_rate", prefix), limits.ReloadRate, + } +} + +func relayConfigureForwardLimitsFields(limits *ttnpb.ServingRelayParameters_ForwardingLimits) log.Fielder { + if limits == nil { + return log.Fields() + } + fields := []any{"relay_limit_reset_behavior", limits.ResetBehavior} + fields = append(fields, relayForwardLimitsFields(limits.JoinRequests, "join_requests")...) + fields = append(fields, relayForwardLimitsFields(limits.Notifications, "notifications")...) + fields = append(fields, relayForwardLimitsFields(limits.UplinkMessages, "uplink_messages")...) + fields = append(fields, relayForwardLimitsFields(limits.Overall, "overall")...) + return log.Fields(fields...) +} + +func servedRelayFields(served *ttnpb.ServedRelayParameters) log.Fielder { + if served == nil { + return log.Fields() + } + fields := []any{} + switch { + case served.GetAlways() != nil: + fields = append(fields, "relay_mode", "always") + case served.GetDynamic() != nil: + fields = append( + fields, + "relay_mode", "dynamic", + "relay_smart_enable_level", served.GetDynamic().SmartEnableLevel, + ) + case served.GetEndDeviceControlled() != nil: + fields = append(fields, "relay_mode", "end_device_controlled") + default: + panic("unreachable") + } + fields = append(fields, "relay_backoff", served.Backoff) + fields = append(fields, secondChFields(served.SecondChannel)...) + return log.Fields(fields...) +} + +func relayUpdateUplinkListReqFields(req *ttnpb.MACCommand_RelayUpdateUplinkListReq) log.Fielder { + fields := []any{ + "relay_rule_index", req.RuleIndex, + "relay_served_dev_addr", types.MustDevAddr(req.DevAddr), + "relay_served_w_f_cnt", req.WFCnt, + "relay_served_session_key_id", req.SessionKeyId, + } + if limits := req.ForwardLimits; limits != nil { + fields = append(fields, + "relay_served_bucket_size", limits.BucketSize, + "relay_served_reload_rate", limits.ReloadRate, + ) + } + return log.Fields(fields...) +} + +func relayCtrlUplinkListReqFields(req *ttnpb.MACCommand_RelayCtrlUplinkListReq) log.Fielder { + return log.Fields( + "relay_rule_index", req.RuleIndex, + "relay_ctrl_action", req.Action, + ) +} + +// DeviceDefaultRelayParameters returns the default relay parameters for the given device. +func DeviceDefaultRelayParameters(dev *ttnpb.EndDevice, defaults *ttnpb.MACSettings) *ttnpb.RelayParameters { + switch { + case dev.GetMacSettings().GetRelay() != nil: + return dev.MacSettings.Relay + case defaults.Relay != nil: + return defaults.Relay + default: + return nil + } +} + +// DeviceDesiredRelayParameters returns the desired relay parameters for the given device. +func DeviceDesiredRelayParameters(dev *ttnpb.EndDevice, defaults *ttnpb.MACSettings) *ttnpb.RelayParameters { + switch { + case dev.GetMacSettings().GetDesiredRelay() != nil: + return dev.MacSettings.DesiredRelay + case defaults.DesiredRelay != nil: + return defaults.DesiredRelay + default: + return DeviceDefaultRelayParameters(dev, defaults) + } +} diff --git a/pkg/networkserver/mac/relay_conf.go b/pkg/networkserver/mac/relay_conf.go new file mode 100644 index 0000000000..73ad57f131 --- /dev/null +++ b/pkg/networkserver/mac/relay_conf.go @@ -0,0 +1,164 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mac + +import ( + "context" + + "go.thethings.network/lorawan-stack/v3/pkg/events" + "go.thethings.network/lorawan-stack/v3/pkg/log" + "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" + "google.golang.org/protobuf/proto" +) + +var ( + // EvtEnqueueRelayConfRequest is emitted when a relay configuration request is enqueued. + EvtEnqueueRelayConfRequest = defineEnqueueMACRequestEvent( + "relay_conf", "relay configuration", + events.WithDataType(&ttnpb.MACCommand_RelayConfReq{}), + )() + // EvtReceiveRelayConfAccept is emitted when a relay configuration request is accepted. + EvtReceiveRelayConfAccept = defineReceiveMACAcceptEvent( + "relay_conf", "relay configuration", + events.WithDataType(&ttnpb.MACCommand_RelayConfAns{}), + )() + // EvtReceiveRelayConfReject is emitted when a relay configuration request is rejected. + EvtReceiveRelayConfReject = defineReceiveMACRejectEvent( + "relay_conf", "relay configuration", + events.WithDataType(&ttnpb.MACCommand_RelayConfAns{}), + )() +) + +// DeviceNeedsRelayConfReq returns true iff the device needs a relay configuration request. +func DeviceNeedsRelayConfReq(dev *ttnpb.EndDevice) bool { + if dev.GetMulticast() || dev.GetMacState() == nil { + return false + } + currentServing := dev.MacState.GetCurrentParameters().GetRelay().GetServing() + desiredServing := dev.MacState.GetDesiredParameters().GetRelay().GetServing() + if desiredServing == nil && currentServing == nil { + return false + } + if (desiredServing == nil) != (currentServing == nil) { + return true + } + // NOTE: The forwarding rules are handled by UpdateUplinkListReq, not RelayConfReq. + // NOTE: The limits are handled by ConfigureFwdLimitReq, not RelayConfReq. + return !proto.Equal(&ttnpb.ServingRelayParameters{ + SecondChannel: desiredServing.SecondChannel, + DefaultChannelIndex: desiredServing.DefaultChannelIndex, + CadPeriodicity: desiredServing.CadPeriodicity, + }, &ttnpb.ServingRelayParameters{ + SecondChannel: currentServing.SecondChannel, + DefaultChannelIndex: currentServing.DefaultChannelIndex, + CadPeriodicity: currentServing.CadPeriodicity, + }) +} + +// EnqueueRelayConfReq enqueues a relay configuration request if needed. +func EnqueueRelayConfReq(ctx context.Context, dev *ttnpb.EndDevice, maxDownLen, maxUpLen uint16) EnqueueState { + if !DeviceNeedsRelayConfReq(dev) { + return EnqueueState{ + MaxDownLen: maxDownLen, + MaxUpLen: maxUpLen, + Ok: true, + } + } + var st EnqueueState + dev.MacState.PendingRequests, st = enqueueMACCommand( + ttnpb.MACCommandIdentifier_CID_RELAY_CONF, + maxDownLen, maxUpLen, + func(nDown, nUp uint16) ([]*ttnpb.MACCommand, uint16, events.Builders, bool) { + if nDown < 1 || nUp < 1 { + return nil, 0, nil, false + } + desiredServing := dev.MacState.GetDesiredParameters().GetRelay().GetServing() + req := &ttnpb.MACCommand_RelayConfReq{} + if desiredServing != nil { + req.Configuration = &ttnpb.MACCommand_RelayConfReq_Configuration{ + CadPeriodicity: desiredServing.CadPeriodicity, + DefaultChannelIndex: desiredServing.DefaultChannelIndex, + SecondChannel: desiredServing.SecondChannel, + } + } + log.FromContext(ctx).WithFields(servingRelayFields(desiredServing)).Debug("Enqueued RelayConfReq") + return []*ttnpb.MACCommand{ + req.MACCommand(), + }, + 1, + events.Builders{ + EvtEnqueueRelayConfRequest.With(events.WithData(req)), + }, + true + }, + dev.MacState.PendingRequests..., + ) + return st +} + +// HandleRelayConfAns handles a relay configuration answer. +func HandleRelayConfAns( + _ context.Context, dev *ttnpb.EndDevice, pld *ttnpb.MACCommand_RelayConfAns, +) (events.Builders, error) { + if pld == nil { + return nil, ErrNoPayload.New() + } + rejected := !pld.SecondChannelFrequencyAck || + !pld.SecondChannelAckOffsetAck || + !pld.SecondChannelDataRateIndexAck || + !pld.SecondChannelIndexAck || + !pld.DefaultChannelIndexAck || + !pld.CadPeriodicityAck + var err error + dev.MacState.PendingRequests, err = handleMACResponse( + ttnpb.MACCommandIdentifier_CID_RELAY_CONF, + false, + func(cmd *ttnpb.MACCommand) error { + if rejected { + return nil + } + req := cmd.GetRelayConfReq() + currentParameters := dev.MacState.CurrentParameters + if req.Configuration == nil { + currentParameters.Relay = nil + return nil + } + relay := currentParameters.Relay + if relay == nil { + relay = &ttnpb.RelayParameters{} + currentParameters.Relay = relay + } + serving := relay.GetServing() + if serving == nil { + serving = &ttnpb.ServingRelayParameters{} + relay.Mode = &ttnpb.RelayParameters_Serving{ + Serving: serving, + } + } + serving.CadPeriodicity = req.Configuration.CadPeriodicity + serving.DefaultChannelIndex = req.Configuration.DefaultChannelIndex + serving.SecondChannel = req.Configuration.SecondChannel + return nil + }, + dev.MacState.PendingRequests..., + ) + ev := EvtReceiveRelayConfAccept + if rejected { + ev = EvtReceiveRelayConfReject + } + return events.Builders{ + ev.With(events.WithData(pld)), + }, err +} diff --git a/pkg/networkserver/mac/relay_conf_test.go b/pkg/networkserver/mac/relay_conf_test.go new file mode 100644 index 0000000000..898c32b134 --- /dev/null +++ b/pkg/networkserver/mac/relay_conf_test.go @@ -0,0 +1,911 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mac_test + +import ( + "context" + "testing" + + "github.com/smarty/assertions" + "go.thethings.network/lorawan-stack/v3/pkg/events" + "go.thethings.network/lorawan-stack/v3/pkg/networkserver/mac" + "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" + "go.thethings.network/lorawan-stack/v3/pkg/util/test" + "go.thethings.network/lorawan-stack/v3/pkg/util/test/assertions/should" +) + +func TestDeviceNeedsRelayConfReq(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + Name string + InputDevice *ttnpb.EndDevice + Needs bool + }{ + { + Name: "no MAC state", + InputDevice: &ttnpb.EndDevice{}, + }, + { + Name: "no relay", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{}, + }, + }, + }, + { + Name: "disable serving", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{}, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{}, + }, + }, + Needs: true, + }, + { + Name: "enable serving", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{}, + }, + }, + }, + }, + }, + Needs: true, + }, + { + Name: "enable second channel", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{}, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_1600, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + }, + }, + }, + }, + }, + }, + Needs: true, + }, + { + Name: "no change", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_1600, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_1600, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + }, + }, + }, + }, + }, + }, + } { + tc := tc + test.RunSubtest(t, test.SubtestConfig{ + Name: tc.Name, + Parallel: true, + Func: func(ctx context.Context, t *testing.T, a *assertions.Assertion) { + t.Helper() + dev := ttnpb.Clone(tc.InputDevice) + res := mac.DeviceNeedsRelayConfReq(dev) + if tc.Needs { + a.So(res, should.BeTrue) + } else { + a.So(res, should.BeFalse) + } + a.So(dev, should.Resemble, tc.InputDevice) + }, + }) + } +} + +func TestEnqueueRelayConfReq(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + Name string + InputDevice, ExpectedDevice *ttnpb.EndDevice + MaxDownlinkLength uint16 + MaxUplinkLength uint16 + State mac.EnqueueState + }{ + { + Name: "enable serving", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_1600, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + }, + }, + }, + }, + }, + ExpectedDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_1600, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + }, + }, + }, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayConfReq{ + Configuration: &ttnpb.MACCommand_RelayConfReq_Configuration{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_1600, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + }).MACCommand(), + }, + }, + }, + MaxDownlinkLength: 50, + MaxUplinkLength: 50, + State: mac.EnqueueState{ + MaxDownLen: 44, + MaxUpLen: 48, + QueuedEvents: events.Builders{ + mac.EvtEnqueueRelayConfRequest.With(events.WithData(&ttnpb.MACCommand_RelayConfReq{ + Configuration: &ttnpb.MACCommand_RelayConfReq_Configuration{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_1600, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + })), + }, + Ok: true, + }, + }, + { + Name: "disable serving", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_1600, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{}, + }, + }, + ExpectedDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_1600, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{}, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayConfReq{ + Configuration: nil, + }).MACCommand(), + }, + }, + }, + MaxDownlinkLength: 50, + MaxUplinkLength: 50, + State: mac.EnqueueState{ + MaxDownLen: 44, + MaxUpLen: 48, + QueuedEvents: events.Builders{ + mac.EvtEnqueueRelayConfRequest.With(events.WithData(&ttnpb.MACCommand_RelayConfReq{ + Configuration: nil, + })), + }, + Ok: true, + }, + }, + { + Name: "disable second channel", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_1600, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + }, + }, + }, + }, + }, + ExpectedDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_1600, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + }, + }, + }, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayConfReq{ + Configuration: &ttnpb.MACCommand_RelayConfReq_Configuration{ + SecondChannel: nil, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + }).MACCommand(), + }, + }, + }, + MaxDownlinkLength: 50, + MaxUplinkLength: 50, + State: mac.EnqueueState{ + MaxDownLen: 44, + MaxUpLen: 48, + QueuedEvents: events.Builders{ + mac.EvtEnqueueRelayConfRequest.With(events.WithData(&ttnpb.MACCommand_RelayConfReq{ + Configuration: &ttnpb.MACCommand_RelayConfReq_Configuration{ + SecondChannel: nil, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + })), + }, + Ok: true, + }, + }, + { + Name: "enable second channel", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_1600, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + }, + }, + }, + }, + }, + ExpectedDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_1600, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + }, + }, + }, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayConfReq{ + Configuration: &ttnpb.MACCommand_RelayConfReq_Configuration{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_1600, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + }).MACCommand(), + }, + }, + }, + MaxDownlinkLength: 50, + MaxUplinkLength: 50, + State: mac.EnqueueState{ + MaxDownLen: 44, + MaxUpLen: 48, + QueuedEvents: events.Builders{ + mac.EvtEnqueueRelayConfRequest.With(events.WithData(&ttnpb.MACCommand_RelayConfReq{ + Configuration: &ttnpb.MACCommand_RelayConfReq_Configuration{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_1600, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS, + }, + })), + }, + Ok: true, + }, + }, + } { + tc := tc + test.RunSubtest(t, test.SubtestConfig{ + Name: tc.Name, + Parallel: true, + Func: func(ctx context.Context, t *testing.T, a *assertions.Assertion) { + t.Helper() + dev := ttnpb.Clone(tc.InputDevice) + st := mac.EnqueueRelayConfReq(ctx, dev, tc.MaxDownlinkLength, tc.MaxUplinkLength) + a.So(dev, should.Resemble, tc.ExpectedDevice) + a.So(st.QueuedEvents, should.ResembleEventBuilders, tc.State.QueuedEvents) + st.QueuedEvents = tc.State.QueuedEvents + a.So(st, should.Resemble, tc.State) + }, + }) + } +} + +func TestHandleRelayConfAns(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + Name string + Device, Expected *ttnpb.EndDevice + Payload *ttnpb.MACCommand_RelayConfAns + Events events.Builders + Error error + }{ + { + Name: "reject serving", + Device: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_3200, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_1_SECOND, + }, + }, + }, + }, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayConfReq{ + Configuration: &ttnpb.MACCommand_RelayConfReq_Configuration{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_3200, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_1_SECOND, + }, + }).MACCommand(), + }, + }, + }, + Expected: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_3200, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_1_SECOND, + }, + }, + }, + }, + }, + }, + Payload: &ttnpb.MACCommand_RelayConfAns{}, + Events: events.Builders{ + mac.EvtReceiveRelayConfReject.With(events.WithData(&ttnpb.MACCommand_RelayConfAns{})), + }, + }, + { + Name: "enable serving", + Device: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_3200, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_1_SECOND, + }, + }, + }, + }, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayConfReq{ + Configuration: &ttnpb.MACCommand_RelayConfReq_Configuration{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_3200, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_1_SECOND, + }, + }).MACCommand(), + }, + }, + }, + Expected: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_3200, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_1_SECOND, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_3200, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_1_SECOND, + }, + }, + }, + }, + }, + }, + Payload: &ttnpb.MACCommand_RelayConfAns{ + SecondChannelFrequencyAck: true, + SecondChannelAckOffsetAck: true, + SecondChannelDataRateIndexAck: true, + SecondChannelIndexAck: true, + DefaultChannelIndexAck: true, + CadPeriodicityAck: true, + }, + Events: events.Builders{ + mac.EvtReceiveRelayConfAccept.With(events.WithData(&ttnpb.MACCommand_RelayConfAns{ + SecondChannelFrequencyAck: true, + SecondChannelAckOffsetAck: true, + SecondChannelDataRateIndexAck: true, + SecondChannelIndexAck: true, + DefaultChannelIndexAck: true, + CadPeriodicityAck: true, + })), + }, + }, + { + Name: "disable serving", + Device: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_3200, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_1_SECOND, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{}, + PendingRequests: []*ttnpb.MACCommand{(&ttnpb.MACCommand_RelayConfReq{}).MACCommand()}, + }, + }, + Expected: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{}, + }, + }, + Payload: &ttnpb.MACCommand_RelayConfAns{ + SecondChannelFrequencyAck: true, + SecondChannelAckOffsetAck: true, + SecondChannelDataRateIndexAck: true, + SecondChannelIndexAck: true, + DefaultChannelIndexAck: true, + CadPeriodicityAck: true, + }, + Events: events.Builders{ + mac.EvtReceiveRelayConfAccept.With(events.WithData(&ttnpb.MACCommand_RelayConfAns{ + SecondChannelFrequencyAck: true, + SecondChannelAckOffsetAck: true, + SecondChannelDataRateIndexAck: true, + SecondChannelIndexAck: true, + DefaultChannelIndexAck: true, + CadPeriodicityAck: true, + })), + }, + }, + { + Name: "enable second channel", + Device: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_1_SECOND, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_3200, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_1_SECOND, + }, + }, + }, + }, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayConfReq{ + Configuration: &ttnpb.MACCommand_RelayConfReq_Configuration{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_3200, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_1_SECOND, + }, + }).MACCommand(), + }, + }, + }, + Expected: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_3200, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_1_SECOND, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_3200, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_1_SECOND, + }, + }, + }, + }, + }, + }, + Payload: &ttnpb.MACCommand_RelayConfAns{ + SecondChannelFrequencyAck: true, + SecondChannelAckOffsetAck: true, + SecondChannelDataRateIndexAck: true, + SecondChannelIndexAck: true, + DefaultChannelIndexAck: true, + CadPeriodicityAck: true, + }, + Events: events.Builders{ + mac.EvtReceiveRelayConfAccept.With(events.WithData(&ttnpb.MACCommand_RelayConfAns{ + SecondChannelFrequencyAck: true, + SecondChannelAckOffsetAck: true, + SecondChannelDataRateIndexAck: true, + SecondChannelIndexAck: true, + DefaultChannelIndexAck: true, + CadPeriodicityAck: true, + })), + }, + }, + { + Name: "disable second channel", + Device: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + SecondChannel: &ttnpb.RelaySecondChannel{ + AckOffset: ttnpb.RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_3200, + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_1, + Frequency: 123, + }, + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_1_SECOND, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_1_SECOND, + }, + }, + }, + }, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayConfReq{ + Configuration: &ttnpb.MACCommand_RelayConfReq_Configuration{ + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_1_SECOND, + }, + }).MACCommand(), + }, + }, + }, + Expected: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_1_SECOND, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + DefaultChannelIndex: 1, + CadPeriodicity: ttnpb.RelayCADPeriodicity_RELAY_CAD_PERIODICITY_1_SECOND, + }, + }, + }, + }, + }, + }, + Payload: &ttnpb.MACCommand_RelayConfAns{ + SecondChannelFrequencyAck: true, + SecondChannelAckOffsetAck: true, + SecondChannelDataRateIndexAck: true, + SecondChannelIndexAck: true, + DefaultChannelIndexAck: true, + CadPeriodicityAck: true, + }, + Events: events.Builders{ + mac.EvtReceiveRelayConfAccept.With(events.WithData(&ttnpb.MACCommand_RelayConfAns{ + SecondChannelFrequencyAck: true, + SecondChannelAckOffsetAck: true, + SecondChannelDataRateIndexAck: true, + SecondChannelIndexAck: true, + DefaultChannelIndexAck: true, + CadPeriodicityAck: true, + })), + }, + }, + } { + tc := tc + test.RunSubtest(t, test.SubtestConfig{ + Name: tc.Name, + Parallel: true, + Func: func(ctx context.Context, t *testing.T, a *assertions.Assertion) { + t.Helper() + dev := ttnpb.Clone(tc.Device) + evs, err := mac.HandleRelayConfAns(ctx, dev, tc.Payload) + if tc.Error != nil && !a.So(err, should.EqualErrorOrDefinition, tc.Error) || + tc.Error == nil && !a.So(err, should.BeNil) { + t.FailNow() + } + a.So(dev, should.Resemble, tc.Expected) + a.So(evs, should.ResembleEventBuilders, tc.Events) + }, + }) + } +} diff --git a/pkg/networkserver/mac/relay_configure_fwd_limit.go b/pkg/networkserver/mac/relay_configure_fwd_limit.go new file mode 100644 index 0000000000..2520a8409f --- /dev/null +++ b/pkg/networkserver/mac/relay_configure_fwd_limit.go @@ -0,0 +1,159 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mac + +import ( + "context" + + "go.thethings.network/lorawan-stack/v3/pkg/events" + "go.thethings.network/lorawan-stack/v3/pkg/log" + "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" + "google.golang.org/protobuf/proto" +) + +var ( + // defaultRelayForwardingLimits is the default relay forward limits, based on the contents of the + // relay specification. + defaultRelayForwardingLimits = &ttnpb.ServingRelayParameters_ForwardingLimits{ + JoinRequests: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_2, + ReloadRate: 4, + }, + Notifications: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_2, + ReloadRate: 4, + }, + UplinkMessages: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_2, + ReloadRate: 8, + }, + Overall: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_2, + ReloadRate: 8, + }, + } + + // EvtEnqueueRelayConfigureFwdLimitRequest is emitted when a relay forward limits configuration request is enqueued. + EvtEnqueueRelayConfigureFwdLimitRequest = defineEnqueueMACRequestEvent( + "relay_configure_fwd_limit", "relay configure forward limit", + events.WithDataType(&ttnpb.MACCommand_RelayConfigureFwdLimitReq{}), + )() + // EvtReceiveRelayConfigureFwdLimitAnswer is emitted when a relay forward limits configuration request is answered. + EvtReceiveRelayConfigureFwdLimitAnswer = defineReceiveMACAnswerEvent( + "relay_configure_fwd_limit", "relay configure forward limit", + events.WithDataType(&ttnpb.MACCommand_RelayConfigureFwdLimitAns{}), + )() +) + +// DeviceNeedsRelayConfigureFwdLimitReq returns true iff the device needs a relay forward limits configuration request. +func DeviceNeedsRelayConfigureFwdLimitReq(dev *ttnpb.EndDevice) bool { + if dev.GetMulticast() || dev.GetMacState() == nil { + return false + } + currentLimits := dev.MacState.GetCurrentParameters().GetRelay().GetServing().GetLimits() + desiredLimits := dev.MacState.GetDesiredParameters().GetRelay().GetServing().GetLimits() + if desiredLimits == nil && currentLimits == nil { + return false + } + if currentLimits == nil { + currentLimits = defaultRelayForwardingLimits + } + if desiredLimits == nil { + desiredLimits = defaultRelayForwardingLimits + } + return !proto.Equal(desiredLimits, currentLimits) +} + +// EnqueueRelayConfigureFwdLimitReq enqueues a relay forward limits configuration request if needed. +func EnqueueRelayConfigureFwdLimitReq( + ctx context.Context, dev *ttnpb.EndDevice, maxDownLen, maxUpLen uint16, +) EnqueueState { + if !DeviceNeedsRelayConfigureFwdLimitReq(dev) { + return EnqueueState{ + MaxDownLen: maxDownLen, + MaxUpLen: maxUpLen, + Ok: true, + } + } + var st EnqueueState + dev.MacState.PendingRequests, st = enqueueMACCommand( + ttnpb.MACCommandIdentifier_CID_RELAY_CONFIGURE_FWD_LIMIT, + maxDownLen, maxUpLen, + func(nDown, nUp uint16) ([]*ttnpb.MACCommand, uint16, events.Builders, bool) { + if nDown < 1 || nUp < 1 { + return nil, 0, nil, false + } + desiredLimits := dev.MacState.GetDesiredParameters().GetRelay().GetServing().GetLimits() + if desiredLimits == nil { + desiredLimits = defaultRelayForwardingLimits + } + req := &ttnpb.MACCommand_RelayConfigureFwdLimitReq{ + ResetLimitCounter: desiredLimits.ResetBehavior, + JoinRequestLimits: desiredLimits.JoinRequests, + NotifyLimits: desiredLimits.Notifications, + GlobalUplinkLimits: desiredLimits.UplinkMessages, + OverallLimits: desiredLimits.Overall, + } + log.FromContext(ctx).WithFields(relayConfigureForwardLimitsFields(desiredLimits)). + Debug("Enqueued RelayConfigureFwdLimitReq") + return []*ttnpb.MACCommand{ + req.MACCommand(), + }, + 1, + events.Builders{ + EvtEnqueueRelayConfigureFwdLimitRequest.With(events.WithData(req)), + }, + true + }, + dev.MacState.PendingRequests..., + ) + return st +} + +// HandleRelayConfigureFwdLimitAns handles a relay forward limits configuration answer. +func HandleRelayConfigureFwdLimitAns( + _ context.Context, dev *ttnpb.EndDevice, pld *ttnpb.MACCommand_RelayConfigureFwdLimitAns, +) (events.Builders, error) { + if pld == nil { + return nil, ErrNoPayload.New() + } + var err error + dev.MacState.PendingRequests, err = handleMACResponse( + ttnpb.MACCommandIdentifier_CID_RELAY_CONFIGURE_FWD_LIMIT, + false, + func(cmd *ttnpb.MACCommand) error { + req := cmd.GetRelayConfigureFwdLimitReq() + currentServing := dev.MacState.GetCurrentParameters().GetRelay().GetServing() + if currentServing == nil { + // NOTE: EnqueueRelayConfigureFwdLimitReq is optimistic and assumes that EnqueueRelayConfReq + // has enqueued the desired relay parameters, and that the end device will accept them. If + // either of these conditions is not true, the current serving parameters will be nil. + return nil + } + currentServing.Limits = &ttnpb.ServingRelayParameters_ForwardingLimits{ + ResetBehavior: req.ResetLimitCounter, + JoinRequests: req.JoinRequestLimits, + Notifications: req.NotifyLimits, + UplinkMessages: req.GlobalUplinkLimits, + Overall: req.OverallLimits, + } + return nil + }, + dev.MacState.PendingRequests..., + ) + return events.Builders{ + EvtReceiveRelayConfigureFwdLimitAnswer.With(events.WithData(pld)), + }, err +} diff --git a/pkg/networkserver/mac/relay_configure_fwd_limit_test.go b/pkg/networkserver/mac/relay_configure_fwd_limit_test.go new file mode 100644 index 0000000000..2a355c890d --- /dev/null +++ b/pkg/networkserver/mac/relay_configure_fwd_limit_test.go @@ -0,0 +1,519 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mac_test + +import ( + "context" + "testing" + + "github.com/smarty/assertions" + "go.thethings.network/lorawan-stack/v3/pkg/events" + "go.thethings.network/lorawan-stack/v3/pkg/networkserver/mac" + "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" + "go.thethings.network/lorawan-stack/v3/pkg/util/test" + "go.thethings.network/lorawan-stack/v3/pkg/util/test/assertions/should" +) + +func TestDeviceNeedsRelayConfigureFwdLimitReq(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + Name string + InputDevice *ttnpb.EndDevice + Needs bool + }{ + { + Name: "no MAC state", + InputDevice: &ttnpb.EndDevice{}, + }, + { + Name: "no relay", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{}, + }, + }, + }, + { + Name: "no limits", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{}, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + Limits: &ttnpb.ServingRelayParameters_ForwardingLimits{}, + }, + }, + }, + }, + }, + }, + Needs: true, + }, + { + Name: "some limits", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{}, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + Limits: &ttnpb.ServingRelayParameters_ForwardingLimits{ + JoinRequests: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_2, + ReloadRate: 12, + }, + Overall: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_4, + ReloadRate: 23, + }, + }, + }, + }, + }, + }, + }, + }, + Needs: true, + }, + { + Name: "no change", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + Limits: &ttnpb.ServingRelayParameters_ForwardingLimits{ + JoinRequests: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_2, + ReloadRate: 12, + }, + Overall: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_4, + ReloadRate: 23, + }, + }, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + Limits: &ttnpb.ServingRelayParameters_ForwardingLimits{ + JoinRequests: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_2, + ReloadRate: 12, + }, + Overall: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_4, + ReloadRate: 23, + }, + }, + }, + }, + }, + }, + }, + }, + }, + } { + tc := tc + test.RunSubtest(t, test.SubtestConfig{ + Name: tc.Name, + Parallel: true, + Func: func(ctx context.Context, t *testing.T, a *assertions.Assertion) { + t.Helper() + dev := ttnpb.Clone(tc.InputDevice) + res := mac.DeviceNeedsRelayConfigureFwdLimitReq(dev) + if tc.Needs { + a.So(res, should.BeTrue) + } else { + a.So(res, should.BeFalse) + } + a.So(dev, should.Resemble, tc.InputDevice) + }, + }) + } +} + +func TestEnqueueRelayConfigureFwdLimitReq(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + Name string + InputDevice, ExpectedDevice *ttnpb.EndDevice + MaxDownlinkLength uint16 + MaxUplinkLength uint16 + State mac.EnqueueState + }{ + { + Name: "no limits", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{}, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + Limits: &ttnpb.ServingRelayParameters_ForwardingLimits{}, + }, + }, + }, + }, + }, + }, + ExpectedDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{}, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + Limits: &ttnpb.ServingRelayParameters_ForwardingLimits{}, + }, + }, + }, + }, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayConfigureFwdLimitReq{}).MACCommand(), + }, + }, + }, + MaxDownlinkLength: 50, + MaxUplinkLength: 50, + State: mac.EnqueueState{ + MaxDownLen: 44, + MaxUpLen: 49, + QueuedEvents: events.Builders{ + mac.EvtEnqueueRelayConfigureFwdLimitRequest.With(events.WithData( + &ttnpb.MACCommand_RelayConfigureFwdLimitReq{}, + )), + }, + Ok: true, + }, + }, + { + Name: "some limits", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{}, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + Limits: &ttnpb.ServingRelayParameters_ForwardingLimits{ + JoinRequests: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_2, + ReloadRate: 12, + }, + Overall: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_4, + ReloadRate: 23, + }, + }, + }, + }, + }, + }, + }, + }, + ExpectedDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{}, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + Limits: &ttnpb.ServingRelayParameters_ForwardingLimits{ + JoinRequests: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_2, + ReloadRate: 12, + }, + Overall: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_4, + ReloadRate: 23, + }, + }, + }, + }, + }, + }, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayConfigureFwdLimitReq{ + JoinRequestLimits: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_2, + ReloadRate: 12, + }, + OverallLimits: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_4, + ReloadRate: 23, + }, + }).MACCommand(), + }, + }, + }, + MaxDownlinkLength: 50, + MaxUplinkLength: 50, + State: mac.EnqueueState{ + MaxDownLen: 44, + MaxUpLen: 49, + QueuedEvents: events.Builders{ + mac.EvtEnqueueRelayConfigureFwdLimitRequest.With(events.WithData( + &ttnpb.MACCommand_RelayConfigureFwdLimitReq{ + JoinRequestLimits: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_2, + ReloadRate: 12, + }, + OverallLimits: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_4, + ReloadRate: 23, + }, + }, + )), + }, + Ok: true, + }, + }, + } { + tc := tc + test.RunSubtest(t, test.SubtestConfig{ + Name: tc.Name, + Parallel: true, + Func: func(ctx context.Context, t *testing.T, a *assertions.Assertion) { + t.Helper() + dev := ttnpb.Clone(tc.InputDevice) + st := mac.EnqueueRelayConfigureFwdLimitReq(ctx, dev, tc.MaxDownlinkLength, tc.MaxUplinkLength) + a.So(dev, should.Resemble, tc.ExpectedDevice) + a.So(st.QueuedEvents, should.ResembleEventBuilders, tc.State.QueuedEvents) + st.QueuedEvents = tc.State.QueuedEvents + a.So(st, should.Resemble, tc.State) + }, + }) + } +} + +func TestHandleRelayConfigureFwdLimitAns(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + Name string + Device, Expected *ttnpb.EndDevice + Payload *ttnpb.MACCommand_RelayConfigureFwdLimitAns + Events events.Builders + Error error + }{ + { + Name: "no limits", + Device: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{}, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + Limits: &ttnpb.ServingRelayParameters_ForwardingLimits{}, + }, + }, + }, + }, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayConfigureFwdLimitReq{}).MACCommand(), + }, + }, + }, + Expected: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + Limits: &ttnpb.ServingRelayParameters_ForwardingLimits{}, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + Limits: &ttnpb.ServingRelayParameters_ForwardingLimits{}, + }, + }, + }, + }, + }, + }, + Payload: &ttnpb.MACCommand_RelayConfigureFwdLimitAns{}, + Events: events.Builders{ + mac.EvtReceiveRelayConfigureFwdLimitAnswer.With(events.WithData( + &ttnpb.MACCommand_RelayConfigureFwdLimitAns{}, + )), + }, + }, + { + Name: "some limits", + Device: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{}, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + Limits: &ttnpb.ServingRelayParameters_ForwardingLimits{ + JoinRequests: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_2, + ReloadRate: 12, + }, + Overall: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_4, + ReloadRate: 23, + }, + }, + }, + }, + }, + }, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayConfigureFwdLimitReq{ + JoinRequestLimits: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_2, + ReloadRate: 12, + }, + OverallLimits: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_4, + ReloadRate: 23, + }, + }).MACCommand(), + }, + }, + }, + Expected: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + Limits: &ttnpb.ServingRelayParameters_ForwardingLimits{ + JoinRequests: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_2, + ReloadRate: 12, + }, + Overall: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_4, + ReloadRate: 23, + }, + }, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + Limits: &ttnpb.ServingRelayParameters_ForwardingLimits{ + JoinRequests: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_2, + ReloadRate: 12, + }, + Overall: &ttnpb.RelayForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_4, + ReloadRate: 23, + }, + }, + }, + }, + }, + }, + }, + }, + Payload: &ttnpb.MACCommand_RelayConfigureFwdLimitAns{}, + Events: events.Builders{ + mac.EvtReceiveRelayConfigureFwdLimitAnswer.With(events.WithData( + &ttnpb.MACCommand_RelayConfigureFwdLimitAns{}, + )), + }, + }, + } { + tc := tc + test.RunSubtest(t, test.SubtestConfig{ + Name: tc.Name, + Parallel: true, + Func: func(ctx context.Context, t *testing.T, a *assertions.Assertion) { + t.Helper() + dev := ttnpb.Clone(tc.Device) + evs, err := mac.HandleRelayConfigureFwdLimitAns(ctx, dev, tc.Payload) + if tc.Error != nil && !a.So(err, should.EqualErrorOrDefinition, tc.Error) || + tc.Error == nil && !a.So(err, should.BeNil) { + t.FailNow() + } + a.So(dev, should.Resemble, tc.Expected) + a.So(evs, should.ResembleEventBuilders, tc.Events) + }, + }) + } +} diff --git a/pkg/networkserver/mac/relay_ctrl_uplink_list.go b/pkg/networkserver/mac/relay_ctrl_uplink_list.go new file mode 100644 index 0000000000..8ba5f8b791 --- /dev/null +++ b/pkg/networkserver/mac/relay_ctrl_uplink_list.go @@ -0,0 +1,171 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mac + +import ( + "context" + + "go.thethings.network/lorawan-stack/v3/pkg/events" + "go.thethings.network/lorawan-stack/v3/pkg/log" + "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" + "google.golang.org/protobuf/proto" +) + +var ( + // EvtEnqueueRelayCtrlUplinkListRequest is emitted when a relay control uplink list request is enqueued. + EvtEnqueueRelayCtrlUplinkListRequest = defineEnqueueMACRequestEvent( + "relay_ctrl_uplink_list", "relay control uplink list", + events.WithDataType(&ttnpb.MACCommand_RelayCtrlUplinkListReq{}), + )() + // EvtReceiveRelayCtrlUplinkListAccept is emitted when a relay control uplink list request is accepted. + EvtReceiveRelayCtrlUplinkListAccept = defineReceiveMACAcceptEvent( + "relay_ctrl_uplink_list", "relay control uplink list", + events.WithDataType(&ttnpb.MACCommand_RelayCtrlUplinkListAns{}), + )() + // EvtReceiveRelayCtrlUplinkListReject is emitted when a relay control uplink list request is rejected. + EvtReceiveRelayCtrlUplinkListReject = defineReceiveMACRejectEvent( + "relay_ctrl_uplink_list", "relay control uplink list", + events.WithDataType(&ttnpb.MACCommand_RelayCtrlUplinkListAns{}), + )() +) + +// DeviceNeedsRelayCtrlUplinkListReqAtIndex returns true iff the device needs a relay +// control uplink list request at the given index. +func DeviceNeedsRelayCtrlUplinkListReqAtIndex(dev *ttnpb.EndDevice, i int) bool { + currentRules := dev.GetMacState().GetCurrentParameters().GetRelay().GetServing().GetUplinkForwardingRules() + desiredRules := dev.GetMacState().GetDesiredParameters().GetRelay().GetServing().GetUplinkForwardingRules() + switch { + case i >= len(currentRules) && i >= len(desiredRules): + case i >= len(desiredRules), proto.Equal(desiredRules[i], emptyRelayUplinkForwardingRule): + // A rule is desired to be deleted. + return !proto.Equal(currentRules[i], emptyRelayUplinkForwardingRule) + case i >= len(currentRules), proto.Equal(currentRules[i], emptyRelayUplinkForwardingRule): + // A rule is desired to be created. + // NOTE: CtrlUplinkListReq cannot delete a forwarding rule. + default: + // NOTE: CtrlUplinkListReq cannot update a forwarding rule. + } + return false +} + +// DeviceNeedsRelayCtrlUplinkListReq returns true iff the device needs a relay control uplink list request. +func DeviceNeedsRelayCtrlUplinkListReq(dev *ttnpb.EndDevice) bool { + if dev.GetMulticast() || dev.GetMacState() == nil { + return false + } + currentServing := dev.MacState.GetCurrentParameters().GetRelay().GetServing() + desiredServing := dev.MacState.GetDesiredParameters().GetRelay().GetServing() + if desiredServing == nil { + return false + } + for i := range currentServing.GetUplinkForwardingRules() { + if DeviceNeedsRelayCtrlUplinkListReqAtIndex(dev, i) { + return true + } + } + return false +} + +// EnqueueRelayCtrlUplinkListReq enqueues a relay control uplink list request. +func EnqueueRelayCtrlUplinkListReq( + ctx context.Context, dev *ttnpb.EndDevice, maxDownLen, maxUpLen uint16, +) EnqueueState { + if !DeviceNeedsRelayCtrlUplinkListReq(dev) { + return EnqueueState{ + MaxDownLen: maxDownLen, + MaxUpLen: maxUpLen, + Ok: true, + } + } + var st EnqueueState + dev.MacState.PendingRequests, st = enqueueMACCommand( + ttnpb.MACCommandIdentifier_CID_RELAY_CTRL_UPLINK_LIST, + maxDownLen, maxUpLen, + func(nDown, nUp uint16) ([]*ttnpb.MACCommand, uint16, events.Builders, bool) { + if nDown < 1 || nUp < 1 { + return nil, 0, nil, false + } + currentRules := dev.MacState.GetCurrentParameters().GetRelay().GetServing().GetUplinkForwardingRules() + desiredRules := dev.MacState.DesiredParameters.Relay.GetServing().UplinkForwardingRules + var reqs []*ttnpb.MACCommand_RelayCtrlUplinkListReq + for i := 0; i < len(currentRules); i++ { + switch { + case !DeviceNeedsRelayCtrlUplinkListReqAtIndex(dev, i): + case i >= len(desiredRules), proto.Equal(desiredRules[i], emptyRelayUplinkForwardingRule): + reqs = append(reqs, &ttnpb.MACCommand_RelayCtrlUplinkListReq{ + RuleIndex: uint32(i), + Action: ttnpb.RelayCtrlUplinkListAction_RELAY_CTRL_UPLINK_LIST_ACTION_REMOVE_TRUSTED_END_DEVICE, + }) + } + } + cmds := make([]*ttnpb.MACCommand, 0, len(reqs)) + evs := make(events.Builders, 0, len(reqs)) + for _, req := range reqs { + if nDown < 1 || nUp < 1 { + return cmds, uint16(len(cmds)), evs, false + } + nDown-- + nUp-- + log.FromContext(ctx).WithFields(relayCtrlUplinkListReqFields(req)). + Debug("Enqueued RelayCtrlUplinkListReq") + cmds = append(cmds, req.MACCommand()) + evs = append(evs, EvtEnqueueRelayCtrlUplinkListRequest.With(events.WithData(req))) + } + return cmds, uint16(len(cmds)), evs, true + }, + dev.MacState.PendingRequests..., + ) + return st +} + +// HandleRelayCtrlUplinkListAns handles a relay control uplink list answer. +func HandleRelayCtrlUplinkListAns( + _ context.Context, dev *ttnpb.EndDevice, pld *ttnpb.MACCommand_RelayCtrlUplinkListAns, +) (events.Builders, error) { + if pld == nil { + return nil, ErrNoPayload.New() + } + var err error + dev.MacState.PendingRequests, err = handleMACResponse( + ttnpb.MACCommandIdentifier_CID_RELAY_CTRL_UPLINK_LIST, + false, + func(cmd *ttnpb.MACCommand) error { + if !pld.RuleIndexAck { + return nil + } + req := cmd.GetRelayCtrlUplinkListReq() + currentServing := dev.MacState.GetCurrentParameters().GetRelay().GetServing() + if currentServing == nil || req.RuleIndex >= uint32(len(currentServing.UplinkForwardingRules)) { + return nil + } + switch req.Action { + case ttnpb.RelayCtrlUplinkListAction_RELAY_CTRL_UPLINK_LIST_ACTION_READ_W_F_CNT: + case ttnpb.RelayCtrlUplinkListAction_RELAY_CTRL_UPLINK_LIST_ACTION_REMOVE_TRUSTED_END_DEVICE: + currentServing.UplinkForwardingRules[req.RuleIndex] = &ttnpb.ServingRelayParameters_UplinkForwardingRule{} + default: + panic("unreachable") + } + return nil + }, + dev.MacState.PendingRequests..., + ) + ev := EvtReceiveRelayCtrlUplinkListAccept + if !pld.RuleIndexAck { + ev = EvtReceiveRelayCtrlUplinkListReject + } + return []events.Builder{ + ev.With(events.WithData(pld)), + }, err +} diff --git a/pkg/networkserver/mac/relay_ctrl_uplink_list_test.go b/pkg/networkserver/mac/relay_ctrl_uplink_list_test.go new file mode 100644 index 0000000000..bf2e83b7f9 --- /dev/null +++ b/pkg/networkserver/mac/relay_ctrl_uplink_list_test.go @@ -0,0 +1,451 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mac_test + +import ( + "context" + "testing" + + "github.com/smarty/assertions" + "go.thethings.network/lorawan-stack/v3/pkg/events" + "go.thethings.network/lorawan-stack/v3/pkg/networkserver/mac" + "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" + "go.thethings.network/lorawan-stack/v3/pkg/util/test" + "go.thethings.network/lorawan-stack/v3/pkg/util/test/assertions/should" +) + +func TestDeviceNeedsRelayCtrlUplinkListReq(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + Name string + InputDevice *ttnpb.EndDevice + Needs bool + }{ + { + Name: "no MAC state", + InputDevice: &ttnpb.EndDevice{}, + }, + { + Name: "no relay", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{}, + }, + }, + }, + { + Name: "add rule", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + Name: "update rule", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 12, + + DeviceId: "foo", + SessionKeyId: []byte{0x03, 0x04, 0x05}, + }, + }, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + Limits: &ttnpb.RelayUplinkForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_12, + ReloadRate: 24, + }, + LastWFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + Name: "remove rule", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 12, + + DeviceId: "foo", + SessionKeyId: []byte{0x03, 0x04, 0x05}, + }, + { + LastWFCnt: 12, + + DeviceId: "bar", + SessionKeyId: []byte{0x02, 0x03, 0x04}, + }, + }, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + {}, + { + LastWFCnt: 12, + + DeviceId: "bar", + SessionKeyId: []byte{0x02, 0x03, 0x04}, + }, + }, + }, + }, + }, + }, + }, + }, + Needs: true, + }, + } { + tc := tc + test.RunSubtest(t, test.SubtestConfig{ + Name: tc.Name, + Parallel: true, + Func: func(ctx context.Context, t *testing.T, a *assertions.Assertion) { + t.Helper() + dev := ttnpb.Clone(tc.InputDevice) + res := mac.DeviceNeedsRelayCtrlUplinkListReq(dev) + if tc.Needs { + a.So(res, should.BeTrue) + } else { + a.So(res, should.BeFalse) + } + a.So(dev, should.Resemble, tc.InputDevice) + }, + }) + } +} + +func TestEnqueueRelayCtrlUplinkListReq(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + Name string + InputDevice, ExpectedDevice *ttnpb.EndDevice + MaxDownlinkLength uint16 + MaxUplinkLength uint16 + State mac.EnqueueState + }{ + { + Name: "remove rule", + InputDevice: &ttnpb.EndDevice{ + Ids: test.MakeEndDeviceIdentifiers(), + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }, + { + LastWFCnt: 24, + + DeviceId: "bar", + SessionKeyId: []byte{0x02, 0x03, 0x04}, + }, + }, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + {}, + { + LastWFCnt: 42, + + DeviceId: "bar", + SessionKeyId: []byte{0x02, 0x03, 0x04}, + }, + }, + }, + }, + }, + }, + }, + }, + ExpectedDevice: &ttnpb.EndDevice{ + Ids: test.MakeEndDeviceIdentifiers(), + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }, + { + LastWFCnt: 24, + + DeviceId: "bar", + SessionKeyId: []byte{0x02, 0x03, 0x04}, + }, + }, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + {}, + { + LastWFCnt: 42, + + DeviceId: "bar", + SessionKeyId: []byte{0x02, 0x03, 0x04}, + }, + }, + }, + }, + }, + }, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayCtrlUplinkListReq{ + RuleIndex: 0, + Action: ttnpb.RelayCtrlUplinkListAction_RELAY_CTRL_UPLINK_LIST_ACTION_REMOVE_TRUSTED_END_DEVICE, + }).MACCommand(), + }, + }, + }, + MaxDownlinkLength: 50, + MaxUplinkLength: 50, + State: mac.EnqueueState{ + MaxDownLen: 48, + MaxUpLen: 44, + QueuedEvents: events.Builders{ + mac.EvtEnqueueRelayCtrlUplinkListRequest.With(events.WithData( + &ttnpb.MACCommand_RelayCtrlUplinkListReq{ + RuleIndex: 0, + Action: ttnpb.RelayCtrlUplinkListAction_RELAY_CTRL_UPLINK_LIST_ACTION_REMOVE_TRUSTED_END_DEVICE, + }, + )), + }, + Ok: true, + }, + }, + } { + tc := tc + test.RunSubtest(t, test.SubtestConfig{ + Name: tc.Name, + Parallel: true, + Func: func(ctx context.Context, t *testing.T, a *assertions.Assertion) { + t.Helper() + dev := ttnpb.Clone(tc.InputDevice) + st := mac.EnqueueRelayCtrlUplinkListReq(ctx, dev, tc.MaxDownlinkLength, tc.MaxUplinkLength) + a.So(dev, should.Resemble, tc.ExpectedDevice) + a.So(st.QueuedEvents, should.ResembleEventBuilders, tc.State.QueuedEvents) + st.QueuedEvents = tc.State.QueuedEvents + a.So(st, should.Resemble, tc.State) + }, + }) + } +} + +func TestHandleRelayCtrlUplinkListAns(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + Name string + Device, Expected *ttnpb.EndDevice + Payload *ttnpb.MACCommand_RelayCtrlUplinkListAns + Events events.Builders + Error error + }{ + { + Name: "remove rule", + Device: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }, + { + LastWFCnt: 42, + + DeviceId: "bar", + SessionKeyId: []byte{0x02, 0x03, 0x04}, + }, + }, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + {}, + { + LastWFCnt: 42, + + DeviceId: "bar", + SessionKeyId: []byte{0x02, 0x03, 0x04}, + }, + }, + }, + }, + }, + }, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayCtrlUplinkListReq{ + RuleIndex: 0, + Action: ttnpb.RelayCtrlUplinkListAction_RELAY_CTRL_UPLINK_LIST_ACTION_REMOVE_TRUSTED_END_DEVICE, + }).MACCommand(), + }, + }, + }, + Expected: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + {}, + { + LastWFCnt: 42, + + DeviceId: "bar", + SessionKeyId: []byte{0x02, 0x03, 0x04}, + }, + }, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + {}, + { + LastWFCnt: 42, + + DeviceId: "bar", + SessionKeyId: []byte{0x02, 0x03, 0x04}, + }, + }, + }, + }, + }, + }, + }, + }, + Payload: &ttnpb.MACCommand_RelayCtrlUplinkListAns{ + RuleIndexAck: true, + WFCnt: 0x11223344, + }, + Events: events.Builders{ + mac.EvtReceiveRelayCtrlUplinkListAccept.With(events.WithData( + &ttnpb.MACCommand_RelayCtrlUplinkListAns{ + RuleIndexAck: true, + WFCnt: 0x11223344, + }, + )), + }, + }, + } { + tc := tc + test.RunSubtest(t, test.SubtestConfig{ + Name: tc.Name, + Parallel: true, + Func: func(ctx context.Context, t *testing.T, a *assertions.Assertion) { + t.Helper() + dev := ttnpb.Clone(tc.Device) + evs, err := mac.HandleRelayCtrlUplinkListAns(ctx, dev, tc.Payload) + if tc.Error != nil && !a.So(err, should.EqualErrorOrDefinition, tc.Error) || + tc.Error == nil && !a.So(err, should.BeNil) { + t.FailNow() + } + a.So(dev, should.Resemble, tc.Expected) + a.So(evs, should.ResembleEventBuilders, tc.Events) + }, + }) + } +} diff --git a/pkg/networkserver/mac/relay_end_device_conf.go b/pkg/networkserver/mac/relay_end_device_conf.go new file mode 100644 index 0000000000..0af64f6ba7 --- /dev/null +++ b/pkg/networkserver/mac/relay_end_device_conf.go @@ -0,0 +1,190 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mac + +import ( + "context" + + "go.thethings.network/lorawan-stack/v3/pkg/events" + "go.thethings.network/lorawan-stack/v3/pkg/log" + "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" + "google.golang.org/protobuf/proto" +) + +var ( + // EvtEnqueueRelayEndDeviceConfRequest is emitted when a relay end device configuration request is enqueued. + EvtEnqueueRelayEndDeviceConfRequest = defineEnqueueMACRequestEvent( + "relay_end_device_conf", "relay end device configuration", + events.WithDataType(&ttnpb.MACCommand_RelayEndDeviceConfReq{}), + )() + // EvtReceiveRelayEndDeviceConfAccept is emitted when a relay end device configuration request is accepted. + EvtReceiveRelayEndDeviceConfAccept = defineReceiveMACAcceptEvent( + "relay_end_device_conf", "relay end device configuration", + events.WithDataType(&ttnpb.MACCommand_RelayEndDeviceConfAns{}), + )() + // EvtReceiveRelayEndDeviceConfReject is emitted when a relay end device configuration request is rejected. + EvtReceiveRelayEndDeviceConfReject = defineReceiveMACRejectEvent( + "relay_end_device_conf", "relay end device configuration", + events.WithDataType(&ttnpb.MACCommand_RelayEndDeviceConfAns{}), + )() +) + +// DeviceNeedsRelayEndDeviceConfReq returns true iff the device needs a relay end device configuration request. +func DeviceNeedsRelayEndDeviceConfReq(dev *ttnpb.EndDevice) bool { + if dev.GetMulticast() || dev.GetMacState() == nil { + return false + } + currentServed := dev.MacState.GetCurrentParameters().GetRelay().GetServed() + desiredServed := dev.MacState.GetDesiredParameters().GetRelay().GetServed() + return !proto.Equal( + &ttnpb.ServedRelayParameters{ + Mode: desiredServed.GetMode(), + Backoff: desiredServed.GetBackoff(), + SecondChannel: desiredServed.GetSecondChannel(), + }, + &ttnpb.ServedRelayParameters{ + Mode: currentServed.GetMode(), + Backoff: currentServed.GetBackoff(), + SecondChannel: currentServed.GetSecondChannel(), + }, + ) +} + +// EnqueueRelayEndDeviceConfReq enqueues a relay end device configuration request if needed. +func EnqueueRelayEndDeviceConfReq(ctx context.Context, dev *ttnpb.EndDevice, maxDownLen, maxUpLen uint16) EnqueueState { + if !DeviceNeedsRelayEndDeviceConfReq(dev) { + return EnqueueState{ + MaxDownLen: maxDownLen, + MaxUpLen: maxUpLen, + Ok: true, + } + } + var st EnqueueState + dev.MacState.PendingRequests, st = enqueueMACCommand( + ttnpb.MACCommandIdentifier_CID_RELAY_END_DEVICE_CONF, + maxDownLen, maxUpLen, + func(nDown, nUp uint16) ([]*ttnpb.MACCommand, uint16, events.Builders, bool) { + if nDown < 1 || nUp < 1 { + return nil, 0, nil, false + } + desiredServed := dev.MacState.GetDesiredParameters().GetRelay().GetServed() + req := &ttnpb.MACCommand_RelayEndDeviceConfReq{} + if desiredServed != nil { + req.Configuration = &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration{ + Backoff: desiredServed.Backoff, + SecondChannel: desiredServed.SecondChannel, + ServingDeviceId: desiredServed.ServingDeviceId, + } + switch { + case desiredServed.GetAlways() != nil: + req.Configuration.Mode = &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration_Always{ + Always: desiredServed.GetAlways(), + } + case desiredServed.GetDynamic() != nil: + req.Configuration.Mode = &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration_Dynamic{ + Dynamic: desiredServed.GetDynamic(), + } + case desiredServed.GetEndDeviceControlled() != nil: + req.Configuration.Mode = &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration_EndDeviceControlled{ + EndDeviceControlled: desiredServed.GetEndDeviceControlled(), + } + default: + panic("unreachable") + } + } + log.FromContext(ctx).WithFields(servedRelayFields(desiredServed)).Debug("Enqueued RelayEndDeviceConfReq") + return []*ttnpb.MACCommand{ + req.MACCommand(), + }, + 1, + events.Builders{ + EvtEnqueueRelayEndDeviceConfRequest.With(events.WithData(req)), + }, + true + }, + dev.MacState.PendingRequests..., + ) + return st +} + +// HandleRelayEndDeviceConfAns handles a relay end device configuration answer. +func HandleRelayEndDeviceConfAns( + _ context.Context, dev *ttnpb.EndDevice, pld *ttnpb.MACCommand_RelayEndDeviceConfAns, +) (events.Builders, error) { + if pld == nil { + return nil, ErrNoPayload.New() + } + rejected := !pld.SecondChannelFrequencyAck || + // NOTE: SecondChannelAckOffsetAck is not defined in the specification. + !pld.SecondChannelDataRateIndexAck || + !pld.SecondChannelIndexAck || + !pld.BackoffAck + var err error + dev.MacState.PendingRequests, err = handleMACResponse( + ttnpb.MACCommandIdentifier_CID_RELAY_END_DEVICE_CONF, + false, + func(cmd *ttnpb.MACCommand) error { + if rejected { + return nil + } + conf := cmd.GetRelayEndDeviceConfReq().Configuration + currentParameters := dev.MacState.CurrentParameters + if conf == nil { + currentParameters.Relay = nil + return nil + } + relay := currentParameters.Relay + if relay == nil { + relay = &ttnpb.RelayParameters{} + currentParameters.Relay = relay + } + served := relay.GetServed() + if served == nil { + served = &ttnpb.ServedRelayParameters{} + relay.Mode = &ttnpb.RelayParameters_Served{ + Served: served, + } + } + switch { + case conf.GetAlways() != nil: + served.Mode = &ttnpb.ServedRelayParameters_Always{ + Always: conf.GetAlways(), + } + case conf.GetDynamic() != nil: + served.Mode = &ttnpb.ServedRelayParameters_Dynamic{ + Dynamic: conf.GetDynamic(), + } + case conf.GetEndDeviceControlled() != nil: + served.Mode = &ttnpb.ServedRelayParameters_EndDeviceControlled{ + EndDeviceControlled: conf.GetEndDeviceControlled(), + } + default: + panic("unreachable") + } + served.Backoff = conf.Backoff + served.SecondChannel = conf.SecondChannel + served.ServingDeviceId = conf.ServingDeviceId + return nil + }, + dev.MacState.PendingRequests..., + ) + ev := EvtReceiveRelayEndDeviceConfAccept + if rejected { + ev = EvtReceiveRelayEndDeviceConfReject + } + return events.Builders{ + ev.With(events.WithData(pld)), + }, err +} diff --git a/pkg/networkserver/mac/relay_end_device_conf_test.go b/pkg/networkserver/mac/relay_end_device_conf_test.go new file mode 100644 index 0000000000..d9699ae5cd --- /dev/null +++ b/pkg/networkserver/mac/relay_end_device_conf_test.go @@ -0,0 +1,495 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mac_test + +import ( + "context" + "testing" + + "github.com/smarty/assertions" + "go.thethings.network/lorawan-stack/v3/pkg/events" + "go.thethings.network/lorawan-stack/v3/pkg/networkserver/mac" + "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" + "go.thethings.network/lorawan-stack/v3/pkg/util/test" + "go.thethings.network/lorawan-stack/v3/pkg/util/test/assertions/should" +) + +func TestDeviceNeedsRelayEndDeviceConfReq(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + Name string + InputDevice *ttnpb.EndDevice + Needs bool + }{ + { + Name: "no MAC state", + InputDevice: &ttnpb.EndDevice{}, + }, + { + Name: "no relay", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{}, + }, + }, + }, + { + Name: "disable served", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Served{ + Served: &ttnpb.ServedRelayParameters{ + Mode: &ttnpb.ServedRelayParameters_Always{ + Always: &ttnpb.RelayEndDeviceAlwaysMode{}, + }, + ServingDeviceId: "foo", + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{}, + }, + }, + Needs: true, + }, + { + Name: "enable served", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Served{ + Served: &ttnpb.ServedRelayParameters{ + Mode: &ttnpb.ServedRelayParameters_Always{ + Always: &ttnpb.RelayEndDeviceAlwaysMode{}, + }, + ServingDeviceId: "foo", + }, + }, + }, + }, + }, + }, + Needs: true, + }, + { + Name: "always to dynamic mode", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Served{ + Served: &ttnpb.ServedRelayParameters{ + Mode: &ttnpb.ServedRelayParameters_Always{ + Always: &ttnpb.RelayEndDeviceAlwaysMode{}, + }, + ServingDeviceId: "foo", + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Served{ + Served: &ttnpb.ServedRelayParameters{ + Mode: &ttnpb.ServedRelayParameters_Dynamic{ + Dynamic: &ttnpb.RelayEndDeviceDynamicMode{ + SmartEnableLevel: ttnpb.RelaySmartEnableLevel_RELAY_SMART_ENABLE_LEVEL_32, + }, + }, + ServingDeviceId: "foo", + }, + }, + }, + }, + }, + }, + Needs: true, + }, + } { + tc := tc + test.RunSubtest(t, test.SubtestConfig{ + Name: tc.Name, + Parallel: true, + Func: func(ctx context.Context, t *testing.T, a *assertions.Assertion) { + t.Helper() + dev := ttnpb.Clone(tc.InputDevice) + res := mac.DeviceNeedsRelayEndDeviceConfReq(dev) + if tc.Needs { + a.So(res, should.BeTrue) + } else { + a.So(res, should.BeFalse) + } + a.So(dev, should.Resemble, tc.InputDevice) + }, + }) + } +} + +func TestEnqueueRelayEndDeviceConfReq(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + Name string + InputDevice, ExpectedDevice *ttnpb.EndDevice + MaxDownlinkLength uint16 + MaxUplinkLength uint16 + State mac.EnqueueState + }{ + { + Name: "enable served", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Served{ + Served: &ttnpb.ServedRelayParameters{ + Mode: &ttnpb.ServedRelayParameters_Always{ + Always: &ttnpb.RelayEndDeviceAlwaysMode{}, + }, + ServingDeviceId: "foo", + }, + }, + }, + }, + }, + }, + ExpectedDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Served{ + Served: &ttnpb.ServedRelayParameters{ + Mode: &ttnpb.ServedRelayParameters_Always{ + Always: &ttnpb.RelayEndDeviceAlwaysMode{}, + }, + ServingDeviceId: "foo", + }, + }, + }, + }, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayEndDeviceConfReq{ + Configuration: &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration{ + Mode: &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration_Always{ + Always: &ttnpb.RelayEndDeviceAlwaysMode{}, + }, + ServingDeviceId: "foo", + }, + }).MACCommand(), + }, + }, + }, + MaxDownlinkLength: 50, + MaxUplinkLength: 50, + State: mac.EnqueueState{ + MaxDownLen: 43, + MaxUpLen: 48, + QueuedEvents: events.Builders{ + mac.EvtEnqueueRelayEndDeviceConfRequest.With(events.WithData(&ttnpb.MACCommand_RelayEndDeviceConfReq{ + Configuration: &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration{ + Mode: &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration_Always{ + Always: &ttnpb.RelayEndDeviceAlwaysMode{}, + }, + ServingDeviceId: "foo", + }, + })), + }, + Ok: true, + }, + }, + { + Name: "disable served", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Served{ + Served: &ttnpb.ServedRelayParameters{ + Mode: &ttnpb.ServedRelayParameters_Always{ + Always: &ttnpb.RelayEndDeviceAlwaysMode{}, + }, + ServingDeviceId: "foo", + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{}, + }, + }, + ExpectedDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Served{ + Served: &ttnpb.ServedRelayParameters{ + Mode: &ttnpb.ServedRelayParameters_Always{ + Always: &ttnpb.RelayEndDeviceAlwaysMode{}, + }, + ServingDeviceId: "foo", + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{}, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayEndDeviceConfReq{}).MACCommand(), + }, + }, + }, + MaxDownlinkLength: 50, + MaxUplinkLength: 50, + State: mac.EnqueueState{ + MaxDownLen: 43, + MaxUpLen: 48, + QueuedEvents: events.Builders{ + mac.EvtEnqueueRelayEndDeviceConfRequest.With(events.WithData(&ttnpb.MACCommand_RelayEndDeviceConfReq{})), + }, + Ok: true, + }, + }, + } { + tc := tc + test.RunSubtest(t, test.SubtestConfig{ + Name: tc.Name, + Parallel: true, + Func: func(ctx context.Context, t *testing.T, a *assertions.Assertion) { + t.Helper() + dev := ttnpb.Clone(tc.InputDevice) + st := mac.EnqueueRelayEndDeviceConfReq(ctx, dev, tc.MaxDownlinkLength, tc.MaxUplinkLength) + a.So(dev, should.Resemble, tc.ExpectedDevice) + a.So(st.QueuedEvents, should.ResembleEventBuilders, tc.State.QueuedEvents) + st.QueuedEvents = tc.State.QueuedEvents + a.So(st, should.Resemble, tc.State) + }, + }) + } +} + +func TestHandleRelayEndDeviceConfAns(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + Name string + Device, Expected *ttnpb.EndDevice + Payload *ttnpb.MACCommand_RelayEndDeviceConfAns + Events events.Builders + Error error + }{ + { + Name: "reject served", + Device: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Served{ + Served: &ttnpb.ServedRelayParameters{ + Mode: &ttnpb.ServedRelayParameters_Always{ + Always: &ttnpb.RelayEndDeviceAlwaysMode{}, + }, + ServingDeviceId: "foo", + }, + }, + }, + }, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayEndDeviceConfReq{ + Configuration: &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration{ + Mode: &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration_Always{ + Always: &ttnpb.RelayEndDeviceAlwaysMode{}, + }, + ServingDeviceId: "foo", + }, + }).MACCommand(), + }, + }, + }, + Expected: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Served{ + Served: &ttnpb.ServedRelayParameters{ + Mode: &ttnpb.ServedRelayParameters_Always{ + Always: &ttnpb.RelayEndDeviceAlwaysMode{}, + }, + ServingDeviceId: "foo", + }, + }, + }, + }, + }, + }, + Payload: &ttnpb.MACCommand_RelayEndDeviceConfAns{ + SecondChannelFrequencyAck: true, + // NOTE: SecondChannelAckOffsetAck is not defined in the specification. + SecondChannelDataRateIndexAck: false, + SecondChannelIndexAck: true, + BackoffAck: false, + }, + Events: events.Builders{ + mac.EvtReceiveRelayEndDeviceConfReject.With(events.WithData(&ttnpb.MACCommand_RelayEndDeviceConfAns{ + SecondChannelFrequencyAck: true, + // NOTE: SecondChannelAckOffsetAck is not defined in the specification. + SecondChannelDataRateIndexAck: false, + SecondChannelIndexAck: true, + BackoffAck: false, + })), + }, + }, + { + Name: "enable served", + Device: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Served{ + Served: &ttnpb.ServedRelayParameters{ + Mode: &ttnpb.ServedRelayParameters_Always{ + Always: &ttnpb.RelayEndDeviceAlwaysMode{}, + }, + ServingDeviceId: "foo", + }, + }, + }, + }, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayEndDeviceConfReq{ + Configuration: &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration{ + Mode: &ttnpb.MACCommand_RelayEndDeviceConfReq_Configuration_Always{ + Always: &ttnpb.RelayEndDeviceAlwaysMode{}, + }, + ServingDeviceId: "foo", + }, + }).MACCommand(), + }, + }, + }, + Expected: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Served{ + Served: &ttnpb.ServedRelayParameters{ + Mode: &ttnpb.ServedRelayParameters_Always{ + Always: &ttnpb.RelayEndDeviceAlwaysMode{}, + }, + ServingDeviceId: "foo", + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Served{ + Served: &ttnpb.ServedRelayParameters{ + Mode: &ttnpb.ServedRelayParameters_Always{ + Always: &ttnpb.RelayEndDeviceAlwaysMode{}, + }, + ServingDeviceId: "foo", + }, + }, + }, + }, + }, + }, + Payload: &ttnpb.MACCommand_RelayEndDeviceConfAns{ + SecondChannelFrequencyAck: true, + // NOTE: SecondChannelAckOffsetAck is not defined in the specification. + SecondChannelDataRateIndexAck: true, + SecondChannelIndexAck: true, + BackoffAck: true, + }, + Events: events.Builders{ + mac.EvtReceiveRelayEndDeviceConfAccept.With(events.WithData(&ttnpb.MACCommand_RelayEndDeviceConfAns{ + SecondChannelFrequencyAck: true, + // NOTE: SecondChannelAckOffsetAck is not defined in the specification. + SecondChannelDataRateIndexAck: true, + SecondChannelIndexAck: true, + BackoffAck: true, + })), + }, + }, + { + Name: "disable served", + Device: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Served{ + Served: &ttnpb.ServedRelayParameters{ + Mode: &ttnpb.ServedRelayParameters_Always{ + Always: &ttnpb.RelayEndDeviceAlwaysMode{}, + }, + ServingDeviceId: "foo", + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{}, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayEndDeviceConfReq{}).MACCommand(), + }, + }, + }, + Expected: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{}, + }, + }, + Payload: &ttnpb.MACCommand_RelayEndDeviceConfAns{ + SecondChannelFrequencyAck: true, + // NOTE: SecondChannelAckOffsetAck is not defined in the specification. + SecondChannelDataRateIndexAck: true, + SecondChannelIndexAck: true, + BackoffAck: true, + }, + Events: events.Builders{ + mac.EvtReceiveRelayEndDeviceConfAccept.With(events.WithData(&ttnpb.MACCommand_RelayEndDeviceConfAns{ + SecondChannelFrequencyAck: true, + // NOTE: SecondChannelAckOffsetAck is not defined in the specification. + SecondChannelDataRateIndexAck: true, + SecondChannelIndexAck: true, + BackoffAck: true, + })), + }, + }, + } { + tc := tc + test.RunSubtest(t, test.SubtestConfig{ + Name: tc.Name, + Parallel: true, + Func: func(ctx context.Context, t *testing.T, a *assertions.Assertion) { + t.Helper() + dev := ttnpb.Clone(tc.Device) + evs, err := mac.HandleRelayEndDeviceConfAns(ctx, dev, tc.Payload) + if tc.Error != nil && !a.So(err, should.EqualErrorOrDefinition, tc.Error) || + tc.Error == nil && !a.So(err, should.BeNil) { + t.FailNow() + } + a.So(dev, should.Resemble, tc.Expected) + a.So(evs, should.ResembleEventBuilders, tc.Events) + }, + }) + } +} diff --git a/pkg/networkserver/mac/relay_notify_new_end_device.go b/pkg/networkserver/mac/relay_notify_new_end_device.go new file mode 100644 index 0000000000..d43a358951 --- /dev/null +++ b/pkg/networkserver/mac/relay_notify_new_end_device.go @@ -0,0 +1,40 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mac + +import ( + "context" + + "go.thethings.network/lorawan-stack/v3/pkg/events" + "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" +) + +// EvtReceiveRelayNotifyNewEndDeviceIndication is emitted when a relay notify new end device +// indication is received. +var EvtReceiveRelayNotifyNewEndDeviceIndication = defineReceiveMACIndicationEvent( + "relay_notify_new_end_device", "relay notify new end device", +)() + +// HandleRelayNotifyNewEndDeviceReq handles a relay notify new end device request. +func HandleRelayNotifyNewEndDeviceReq( + _ context.Context, _ *ttnpb.EndDevice, pld *ttnpb.MACCommand_RelayNotifyNewEndDeviceReq, +) (events.Builders, error) { + if pld == nil { + return nil, ErrNoPayload.New() + } + return events.Builders{ + EvtReceiveRelayNotifyNewEndDeviceIndication.With(events.WithData(pld)), + }, nil +} diff --git a/pkg/networkserver/mac/relay_update_uplink_list.go b/pkg/networkserver/mac/relay_update_uplink_list.go new file mode 100644 index 0000000000..e40de9cfc9 --- /dev/null +++ b/pkg/networkserver/mac/relay_update_uplink_list.go @@ -0,0 +1,201 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mac + +import ( + "context" + + "go.thethings.network/lorawan-stack/v3/pkg/events" + "go.thethings.network/lorawan-stack/v3/pkg/log" + "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" + "google.golang.org/protobuf/proto" +) + +var ( + emptyRelayUplinkForwardingRule = &ttnpb.ServingRelayParameters_UplinkForwardingRule{} + + // EvtEnqueueRelayUpdateUplinkListRequest is emitted when a relay update uplink list request is enqueued. + EvtEnqueueRelayUpdateUplinkListRequest = defineEnqueueMACRequestEvent( + "relay_update_uplink_list", "relay update uplink list", + events.WithDataType(&ttnpb.MACCommand_RelayUpdateUplinkListReq{}), + )() + // EvtReceiveRelayUpdateUplinkListAnswer is emitted when a relay update uplink list request is answered. + EvtReceiveRelayUpdateUplinkListAnswer = defineReceiveMACAnswerEvent( + "relay_update_uplink_list", "relay update uplink list", + events.WithDataType(&ttnpb.MACCommand_RelayUpdateUplinkListAns{}), + )() +) + +// DeviceNeedsRelayUpdateUplinkListReqAtIndex returns true iff the device needs a relay +// update uplink list request at the given index. +func DeviceNeedsRelayUpdateUplinkListReqAtIndex(dev *ttnpb.EndDevice, i int) bool { + currentRules := dev.GetMacState().GetCurrentParameters().GetRelay().GetServing().GetUplinkForwardingRules() + desiredRules := dev.GetMacState().GetDesiredParameters().GetRelay().GetServing().GetUplinkForwardingRules() + switch { + case i >= len(currentRules) && i >= len(desiredRules): + case i >= len(desiredRules), proto.Equal(desiredRules[i], emptyRelayUplinkForwardingRule): + // A rule is desired to be deleted. + // NOTE: UpdateUplinkListReq cannot delete a forwarding rule. + case i >= len(currentRules), proto.Equal(currentRules[i], emptyRelayUplinkForwardingRule): + // A rule is desired to be created. + return true + default: + // A rule is desired to be updated. + return !proto.Equal(desiredRules[i], currentRules[i]) + } + return false +} + +// DeviceNeedsRelayUpdateUplinkListReq returns true iff the device needs a relay update uplink list request. +func DeviceNeedsRelayUpdateUplinkListReq(dev *ttnpb.EndDevice) bool { + if dev.GetMulticast() || dev.GetMacState() == nil { + return false + } + currentServing := dev.MacState.GetCurrentParameters().GetRelay().GetServing() + desiredServing := dev.MacState.GetDesiredParameters().GetRelay().GetServing() + if desiredServing == nil { + return false + } + if len(desiredServing.GetUplinkForwardingRules()) > len(currentServing.GetUplinkForwardingRules()) { + return true + } + for i := range desiredServing.GetUplinkForwardingRules() { + if DeviceNeedsRelayUpdateUplinkListReqAtIndex(dev, i) { + return true + } + } + return false +} + +// EnqueueRelayUpdateUplinkListReq enqueues a relay update uplink list request. +func EnqueueRelayUpdateUplinkListReq( + ctx context.Context, dev *ttnpb.EndDevice, maxDownLen, maxUpLen uint16, keyService RelayKeyService, +) EnqueueState { + if !DeviceNeedsRelayUpdateUplinkListReq(dev) { + return EnqueueState{ + MaxDownLen: maxDownLen, + MaxUpLen: maxUpLen, + Ok: true, + } + } + var st EnqueueState + dev.MacState.PendingRequests, st = enqueueMACCommand( + ttnpb.MACCommandIdentifier_CID_RELAY_UPDATE_UPLINK_LIST, + maxDownLen, maxUpLen, + func(nDown, nUp uint16) ([]*ttnpb.MACCommand, uint16, events.Builders, bool) { + if nDown < 1 || nUp < 1 { + return nil, 0, nil, false + } + currentRules := dev.MacState.GetCurrentParameters().GetRelay().GetServing().GetUplinkForwardingRules() + desiredRules := dev.MacState.DesiredParameters.Relay.GetServing().UplinkForwardingRules + pendingRuleIndices := make([]int, 0, len(desiredRules)) + pendingDeviceIDs := make([]string, 0, len(desiredRules)) + pendingSessionKeyIDs := make([][]byte, 0, len(desiredRules)) + var reqs []*ttnpb.MACCommand_RelayUpdateUplinkListReq + for i := 0; i < len(desiredRules) || i < len(currentRules); i++ { + if DeviceNeedsRelayUpdateUplinkListReqAtIndex(dev, i) { + pendingRuleIndices = append(pendingRuleIndices, i) + pendingDeviceIDs = append(pendingDeviceIDs, desiredRules[i].DeviceId) + pendingSessionKeyIDs = append(pendingSessionKeyIDs, desiredRules[i].SessionKeyId) + } + } + devAddrs, keys, err := keyService.BatchDeriveRootWorSKey( + ctx, dev.Ids.ApplicationIds, pendingDeviceIDs, pendingSessionKeyIDs, + ) + if err != nil { + log.FromContext(ctx).WithError(err).Warn("Root relay session keys derivation failed") + return nil, 0, nil, true + } + for i, ruleIdx := range pendingRuleIndices { + if devAddrs[i] == nil || keys[i] == nil { + continue + } + desiredRule := desiredRules[ruleIdx] + reqs = append(reqs, &ttnpb.MACCommand_RelayUpdateUplinkListReq{ + RuleIndex: uint32(ruleIdx), + ForwardLimits: desiredRule.Limits, + DevAddr: devAddrs[i][:], + WFCnt: desiredRule.LastWFCnt, + RootWorSKey: keys[i][:], + + DeviceId: desiredRule.DeviceId, + SessionKeyId: desiredRule.SessionKeyId, + }) + } + cmds := make([]*ttnpb.MACCommand, 0, len(reqs)) + evs := make(events.Builders, 0, len(reqs)) + for _, req := range reqs { + if nDown < 1 || nUp < 1 { + return cmds, uint16(len(cmds)), evs, false + } + nDown-- + nUp-- + log.FromContext(ctx).WithFields(relayUpdateUplinkListReqFields(req)). + Debug("Enqueued RelayUpdateUplinkListReq") + cmds = append(cmds, req.MACCommand()) + evs = append(evs, EvtEnqueueRelayUpdateUplinkListRequest.With(events.WithData(req.Sanitized()))) + } + return cmds, uint16(len(cmds)), evs, true + }, + dev.MacState.PendingRequests..., + ) + return st +} + +// HandleRelayUpdateUplinkListAns handles a relay update uplink list answer. +func HandleRelayUpdateUplinkListAns( + _ context.Context, dev *ttnpb.EndDevice, pld *ttnpb.MACCommand_RelayUpdateUplinkListAns, +) (events.Builders, error) { + if pld == nil { + return nil, ErrNoPayload.New() + } + var err error + dev.MacState.PendingRequests, err = handleMACResponse( + ttnpb.MACCommandIdentifier_CID_RELAY_UPDATE_UPLINK_LIST, + false, + func(cmd *ttnpb.MACCommand) error { + req := cmd.GetRelayUpdateUplinkListReq() + currentServing := dev.MacState.GetCurrentParameters().GetRelay().GetServing() + if currentServing == nil { + // NOTE: EnqueueRelayUpdateUplinkListReq is optimistic and assumes that EnqueueRelayConfReq + // has enqueued the desired relay parameters, and that the end device will accept them. If + // either of these conditions is not true, the current serving parameters will be nil. + return nil + } + if n := len(currentServing.UplinkForwardingRules); uint(req.RuleIndex) >= uint(n) { + currentServing.UplinkForwardingRules = append( + currentServing.UplinkForwardingRules, + make( + []*ttnpb.ServingRelayParameters_UplinkForwardingRule, + 1+int(req.RuleIndex-uint32(n)), + )..., + ) + for i := n; i < len(currentServing.UplinkForwardingRules); i++ { + currentServing.UplinkForwardingRules[i] = &ttnpb.ServingRelayParameters_UplinkForwardingRule{} + } + } + rule := currentServing.UplinkForwardingRules[req.RuleIndex] + rule.Limits = req.ForwardLimits + rule.LastWFCnt = req.WFCnt + rule.DeviceId = req.DeviceId + rule.SessionKeyId = req.SessionKeyId + return nil + }, + dev.MacState.PendingRequests..., + ) + return []events.Builder{ + EvtReceiveRelayUpdateUplinkListAnswer.With(events.WithData(pld)), + }, err +} diff --git a/pkg/networkserver/mac/relay_update_uplink_list_test.go b/pkg/networkserver/mac/relay_update_uplink_list_test.go new file mode 100644 index 0000000000..d2c2fdb090 --- /dev/null +++ b/pkg/networkserver/mac/relay_update_uplink_list_test.go @@ -0,0 +1,670 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mac_test + +import ( + "context" + "testing" + + "github.com/smarty/assertions" + "go.thethings.network/lorawan-stack/v3/pkg/events" + "go.thethings.network/lorawan-stack/v3/pkg/networkserver/mac" + "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" + "go.thethings.network/lorawan-stack/v3/pkg/types" + "go.thethings.network/lorawan-stack/v3/pkg/util/test" + "go.thethings.network/lorawan-stack/v3/pkg/util/test/assertions/should" +) + +type relayKeyServiceFunc func( + context.Context, *ttnpb.ApplicationIdentifiers, []string, [][]byte, +) ([]*types.DevAddr, []*types.AES128Key, error) + +var _ (mac.RelayKeyService) = relayKeyServiceFunc(nil) + +// BatchDeriveRootWorSKey implements mac.RelayKeyService. +func (f relayKeyServiceFunc) BatchDeriveRootWorSKey( + ctx context.Context, appID *ttnpb.ApplicationIdentifiers, deviceIDs []string, sessionKeyIDs [][]byte, +) ([]*types.DevAddr, []*types.AES128Key, error) { + return f(ctx, appID, deviceIDs, sessionKeyIDs) +} + +func TestDeviceNeedsRelayUpdateUplinkListReq(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + Name string + InputDevice *ttnpb.EndDevice + Needs bool + }{ + { + Name: "no MAC state", + InputDevice: &ttnpb.EndDevice{}, + }, + { + Name: "no relay", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{}, + }, + }, + }, + { + Name: "add rule", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }, + }, + }, + }, + }, + }, + }, + }, + Needs: true, + }, + { + Name: "update rule", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 12, + + DeviceId: "foo", + SessionKeyId: []byte{0x03, 0x04, 0x05}, + }, + }, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + Limits: &ttnpb.RelayUplinkForwardLimits{ + BucketSize: ttnpb.RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_12, + ReloadRate: 24, + }, + LastWFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }, + }, + }, + }, + }, + }, + }, + }, + Needs: true, + }, + { + Name: "remove rule", + InputDevice: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 12, + + DeviceId: "foo", + SessionKeyId: []byte{0x03, 0x04, 0x05}, + }, + { + LastWFCnt: 12, + + DeviceId: "bar", + SessionKeyId: []byte{0x02, 0x03, 0x04}, + }, + }, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + {}, + { + LastWFCnt: 12, + + DeviceId: "bar", + SessionKeyId: []byte{0x02, 0x03, 0x04}, + }, + }, + }, + }, + }, + }, + }, + }, + }, + } { + tc := tc + test.RunSubtest(t, test.SubtestConfig{ + Name: tc.Name, + Parallel: true, + Func: func(ctx context.Context, t *testing.T, a *assertions.Assertion) { + t.Helper() + dev := ttnpb.Clone(tc.InputDevice) + res := mac.DeviceNeedsRelayUpdateUplinkListReq(dev) + if tc.Needs { + a.So(res, should.BeTrue) + } else { + a.So(res, should.BeFalse) + } + a.So(dev, should.Resemble, tc.InputDevice) + }, + }) + } +} + +func TestEnqueueRelayUpdateUplinkListReq(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + Name string + InputDevice, ExpectedDevice *ttnpb.EndDevice + MaxDownlinkLength uint16 + MaxUplinkLength uint16 + RelayKeyService relayKeyServiceFunc + State mac.EnqueueState + }{ + { + Name: "add rule", + InputDevice: &ttnpb.EndDevice{ + Ids: test.MakeEndDeviceIdentifiers(), + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }, + }, + }, + }, + }, + }, + }, + }, + ExpectedDevice: &ttnpb.EndDevice{ + Ids: test.MakeEndDeviceIdentifiers(), + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{}, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }, + }, + }, + }, + }, + }, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayUpdateUplinkListReq{ + RuleIndex: 0, + DevAddr: types.DevAddr{0x42, 0x43, 0x44, 0x45}.Bytes(), + WFCnt: 42, + RootWorSKey: types.AES128Key{0x01, 0x02, 0x03, 0x04}.Bytes(), + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }).MACCommand(), + }, + }, + }, + MaxDownlinkLength: 50, + MaxUplinkLength: 50, + RelayKeyService: func( + context.Context, *ttnpb.ApplicationIdentifiers, []string, [][]byte, + ) ([]*types.DevAddr, []*types.AES128Key, error) { + return []*types.DevAddr{{0x42, 0x43, 0x44, 0x45}}, []*types.AES128Key{{0x01, 0x02, 0x03, 0x04}}, nil + }, + State: mac.EnqueueState{ + MaxDownLen: 23, + MaxUpLen: 49, + QueuedEvents: events.Builders{ + mac.EvtEnqueueRelayUpdateUplinkListRequest.With(events.WithData( + &ttnpb.MACCommand_RelayUpdateUplinkListReq{ + RuleIndex: 0, + DevAddr: types.DevAddr{0x42, 0x43, 0x44, 0x45}.Bytes(), + WFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }, + )), + }, + Ok: true, + }, + }, + { + Name: "update rule", + InputDevice: &ttnpb.EndDevice{ + Ids: test.MakeEndDeviceIdentifiers(), + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }, + { + LastWFCnt: 24, + + DeviceId: "bar", + SessionKeyId: []byte{0x02, 0x03, 0x04}, + }, + }, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }, + { + LastWFCnt: 42, + + DeviceId: "foobar", + SessionKeyId: []byte{0x03, 0x04, 0x05}, + }, + }, + }, + }, + }, + }, + }, + }, + ExpectedDevice: &ttnpb.EndDevice{ + Ids: test.MakeEndDeviceIdentifiers(), + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }, + { + LastWFCnt: 24, + + DeviceId: "bar", + SessionKeyId: []byte{0x02, 0x03, 0x04}, + }, + }, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }, + { + LastWFCnt: 42, + + DeviceId: "foobar", + SessionKeyId: []byte{0x03, 0x04, 0x05}, + }, + }, + }, + }, + }, + }, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayUpdateUplinkListReq{ + RuleIndex: 1, + DevAddr: types.DevAddr{0x43, 0x44, 0x45, 0x46}.Bytes(), + WFCnt: 42, + RootWorSKey: types.AES128Key{0x02, 0x03, 0x04, 0x05}.Bytes(), + + DeviceId: "foobar", + SessionKeyId: []byte{0x03, 0x04, 0x05}, + }).MACCommand(), + }, + }, + }, + MaxDownlinkLength: 50, + MaxUplinkLength: 50, + RelayKeyService: func( + context.Context, *ttnpb.ApplicationIdentifiers, []string, [][]byte, + ) ([]*types.DevAddr, []*types.AES128Key, error) { + return []*types.DevAddr{{0x43, 0x44, 0x45, 0x46}}, []*types.AES128Key{{0x02, 0x03, 0x04, 0x05}}, nil + }, + State: mac.EnqueueState{ + MaxDownLen: 23, + MaxUpLen: 49, + QueuedEvents: events.Builders{ + mac.EvtEnqueueRelayUpdateUplinkListRequest.With(events.WithData( + &ttnpb.MACCommand_RelayUpdateUplinkListReq{ + RuleIndex: 1, + DevAddr: types.DevAddr{0x43, 0x44, 0x45, 0x46}.Bytes(), + WFCnt: 42, + + DeviceId: "foobar", + SessionKeyId: []byte{0x03, 0x04, 0x05}, + }, + )), + }, + Ok: true, + }, + }, + } { + tc := tc + test.RunSubtest(t, test.SubtestConfig{ + Name: tc.Name, + Parallel: true, + Func: func(ctx context.Context, t *testing.T, a *assertions.Assertion) { + t.Helper() + dev := ttnpb.Clone(tc.InputDevice) + st := mac.EnqueueRelayUpdateUplinkListReq( + ctx, dev, tc.MaxDownlinkLength, tc.MaxUplinkLength, tc.RelayKeyService, + ) + a.So(dev, should.Resemble, tc.ExpectedDevice) + a.So(st.QueuedEvents, should.ResembleEventBuilders, tc.State.QueuedEvents) + st.QueuedEvents = tc.State.QueuedEvents + a.So(st, should.Resemble, tc.State) + }, + }) + } +} + +func TestHandleRelayUpdateUplinkListAns(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + Name string + Device, Expected *ttnpb.EndDevice + Payload *ttnpb.MACCommand_RelayUpdateUplinkListAns + Events events.Builders + Error error + }{ + { + Name: "add rule", + Device: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{}, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }, + }, + }, + }, + }, + }, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayUpdateUplinkListReq{ + RuleIndex: 0, + DevAddr: types.DevAddr{0x42, 0x43, 0x44, 0x45}.Bytes(), + WFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }).MACCommand(), + }, + }, + }, + Expected: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }, + }, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }, + }, + }, + }, + }, + }, + }, + }, + Payload: &ttnpb.MACCommand_RelayUpdateUplinkListAns{}, + Events: events.Builders{ + mac.EvtReceiveRelayUpdateUplinkListAnswer.With(events.WithData( + &ttnpb.MACCommand_RelayUpdateUplinkListAns{}, + )), + }, + }, + { + Name: "update rule", + Device: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }, + { + LastWFCnt: 24, + + DeviceId: "bar", + SessionKeyId: []byte{0x02, 0x03, 0x04}, + }, + }, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }, + { + LastWFCnt: 42, + + DeviceId: "foobar", + SessionKeyId: []byte{0x03, 0x04, 0x05}, + }, + }, + }, + }, + }, + }, + PendingRequests: []*ttnpb.MACCommand{ + (&ttnpb.MACCommand_RelayUpdateUplinkListReq{ + RuleIndex: 1, + DevAddr: types.DevAddr{0x43, 0x44, 0x45, 0x46}.Bytes(), + WFCnt: 42, + + DeviceId: "foobar", + SessionKeyId: []byte{0x03, 0x04, 0x05}, + }).MACCommand(), + }, + }, + }, + Expected: &ttnpb.EndDevice{ + MacState: &ttnpb.MACState{ + CurrentParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }, + { + LastWFCnt: 42, + + DeviceId: "foobar", + SessionKeyId: []byte{0x03, 0x04, 0x05}, + }, + }, + }, + }, + }, + }, + DesiredParameters: &ttnpb.MACParameters{ + Relay: &ttnpb.RelayParameters{ + Mode: &ttnpb.RelayParameters_Serving{ + Serving: &ttnpb.ServingRelayParameters{ + UplinkForwardingRules: []*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + { + LastWFCnt: 42, + + DeviceId: "foo", + SessionKeyId: []byte{0x01, 0x02, 0x03}, + }, + { + LastWFCnt: 42, + + DeviceId: "foobar", + SessionKeyId: []byte{0x03, 0x04, 0x05}, + }, + }, + }, + }, + }, + }, + }, + }, + Payload: &ttnpb.MACCommand_RelayUpdateUplinkListAns{}, + Events: events.Builders{ + mac.EvtReceiveRelayUpdateUplinkListAnswer.With(events.WithData( + &ttnpb.MACCommand_RelayUpdateUplinkListAns{}, + )), + }, + }, + } { + tc := tc + test.RunSubtest(t, test.SubtestConfig{ + Name: tc.Name, + Parallel: true, + Func: func(ctx context.Context, t *testing.T, a *assertions.Assertion) { + t.Helper() + dev := ttnpb.Clone(tc.Device) + evs, err := mac.HandleRelayUpdateUplinkListAns(ctx, dev, tc.Payload) + if tc.Error != nil && !a.So(err, should.EqualErrorOrDefinition, tc.Error) || + tc.Error == nil && !a.So(err, should.BeNil) { + t.FailNow() + } + a.So(dev, should.Resemble, tc.Expected) + a.So(evs, should.ResembleEventBuilders, tc.Events) + }, + }) + } +} diff --git a/pkg/networkserver/mac/utils.go b/pkg/networkserver/mac/utils.go index 50269c9331..16f2b62afe 100644 --- a/pkg/networkserver/mac/utils.go +++ b/pkg/networkserver/mac/utils.go @@ -713,6 +713,7 @@ func NewState(dev *ttnpb.EndDevice, fps *frequencyplans.Store, defaults *ttnpb.M AdrAckLimitExponent: &ttnpb.ADRAckLimitExponentValue{Value: phy.ADRAckLimit}, AdrAckDelayExponent: &ttnpb.ADRAckDelayExponentValue{Value: phy.ADRAckDelay}, PingSlotDataRateIndexValue: DeviceDefaultPingSlotDataRateIndexValue(dev, phy, defaults), + Relay: DeviceDefaultRelayParameters(dev, defaults), } desired := current if !dev.Multicast { @@ -735,6 +736,7 @@ func NewState(dev *ttnpb.EndDevice, fps *frequencyplans.Store, defaults *ttnpb.M AdrAckLimitExponent: DeviceDesiredADRAckLimitExponent(dev, phy, defaults), AdrAckDelayExponent: DeviceDesiredADRAckDelayExponent(dev, phy, defaults), PingSlotDataRateIndexValue: DeviceDesiredPingSlotDataRateIndexValue(dev, phy, fp, defaults), + Relay: DeviceDesiredRelayParameters(dev, defaults), } } // TODO: Support rejoins. (https://github.com/TheThingsNetwork/lorawan-stack/issues/8) diff --git a/pkg/networkserver/networkserver_util_internal_test.go b/pkg/networkserver/networkserver_util_internal_test.go index 4c615527ed..dd7f1dc7cc 100644 --- a/pkg/networkserver/networkserver_util_internal_test.go +++ b/pkg/networkserver/networkserver_util_internal_test.go @@ -2523,6 +2523,12 @@ type MockDeviceRegistry struct { paths []string, f func(context.Context, *ttnpb.EndDevice) (*ttnpb.EndDevice, []string, error), ) (*ttnpb.EndDevice, context.Context, error) + BatchGetByIDFunc func( + ctx context.Context, + appIDs *ttnpb.ApplicationIdentifiers, + devIDs []string, + paths []string, + ) ([]*ttnpb.EndDevice, error) BatchDeleteFunc func( ctx context.Context, appIDs *ttnpb.ApplicationIdentifiers, @@ -2561,6 +2567,16 @@ func (m MockDeviceRegistry) Range(ctx context.Context, paths []string, f func(co panic("Range must not be called") } +// BatchGetByID panics. +func (m MockDeviceRegistry) BatchGetByID( + ctx context.Context, appID *ttnpb.ApplicationIdentifiers, devIDs []string, paths []string, +) ([]*ttnpb.EndDevice, error) { + if m.BatchGetByIDFunc == nil { + panic("BatchGetByIDFunc called, but not set") + } + return m.BatchGetByIDFunc(ctx, appID, devIDs, paths) +} + // GetByID calls GetByIDFunc if set and panics otherwise. func (m MockDeviceRegistry) BatchDelete( ctx context.Context, diff --git a/pkg/networkserver/observability.go b/pkg/networkserver/observability.go index d2f3acbeb6..53777c2743 100644 --- a/pkg/networkserver/observability.go +++ b/pkg/networkserver/observability.go @@ -56,6 +56,16 @@ var ( Up: &ttnpb.ApplicationUp_UplinkMessage{UplinkMessage: &ttnpb.ApplicationUplink{}}, }), ) + evtDropRelayUplink = events.Define( + "ns.up.relay.drop", "drop relay message", + events.WithVisibility(ttnpb.Right_RIGHT_APPLICATION_TRAFFIC_READ), + events.WithErrorDataType(), + ) + evtProcessRelayUplink = events.Define( + "ns.up.relay.process", "successfully processed relay message", + events.WithVisibility(ttnpb.Right_RIGHT_APPLICATION_TRAFFIC_READ), + events.WithDataType(&ttnpb.UplinkMessage{}), + ) evtScheduleDataDownlinkAttempt = events.Define( "ns.down.data.schedule.attempt", "schedule data downlink for transmission on Gateway Server", events.WithVisibility(ttnpb.Right_RIGHT_APPLICATION_TRAFFIC_READ), diff --git a/pkg/networkserver/redis/registry.go b/pkg/networkserver/redis/registry.go index 6efbc2e99b..a666a900a9 100644 --- a/pkg/networkserver/redis/registry.go +++ b/pkg/networkserver/redis/registry.go @@ -30,6 +30,7 @@ import ( "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" "go.thethings.network/lorawan-stack/v3/pkg/types" "go.thethings.network/lorawan-stack/v3/pkg/unique" + "golang.org/x/exp/maps" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/timestamppb" ) @@ -38,6 +39,8 @@ var ( errInvalidFieldmask = errors.DefineInvalidArgument("invalid_fieldmask", "invalid fieldmask") errInvalidIdentifiers = errors.DefineInvalidArgument("invalid_identifiers", "invalid identifiers") errReadOnlyField = errors.DefineInvalidArgument("read_only_field", "read-only field `{field}`") + + errRelayServed = errors.DefineAlreadyExists("relay_served", "`{served}` is already served by `{serving}`") ) // DeviceSchemaVersion is the Network Server database schema version regarding the devices namespace. @@ -78,6 +81,34 @@ func (r *DeviceRegistry) euiKey(joinEUI, devEUI types.EUI64) string { return r.Redis.Key("eui", joinEUI.String(), devEUI.String()) } +func (r *DeviceRegistry) relayRulesMapping(ctx context.Context, dev *ttnpb.EndDevice) map[string]string { + m := make(map[string]string) + add := func(rules []*ttnpb.ServingRelayParameters_UplinkForwardingRule) { + for _, rule := range rules { + if rule.GetDeviceId() == "" { + continue + } + servedUID := unique.ID(ctx, &ttnpb.EndDeviceIdentifiers{ + ApplicationIds: dev.Ids.ApplicationIds, + DeviceId: rule.DeviceId, + }) + path := r.Redis.Key("relay", "rules", servedUID) + m[path] = servedUID + } + } + for _, rules := range [][]*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + dev.GetMacSettings().GetRelay().GetServing().GetUplinkForwardingRules(), + dev.GetMacSettings().GetDesiredRelay().GetServing().GetUplinkForwardingRules(), + dev.GetMacState().GetCurrentParameters().GetRelay().GetServing().GetUplinkForwardingRules(), + dev.GetMacState().GetDesiredParameters().GetRelay().GetServing().GetUplinkForwardingRules(), + dev.GetPendingMacState().GetCurrentParameters().GetRelay().GetServing().GetUplinkForwardingRules(), + dev.GetPendingMacState().GetDesiredParameters().GetRelay().GetServing().GetUplinkForwardingRules(), + } { + add(rules) + } + return m +} + // GetByID gets device by appID, devID. func (r *DeviceRegistry) GetByID(ctx context.Context, appID *ttnpb.ApplicationIdentifiers, devID string, paths []string) (*ttnpb.EndDevice, context.Context, error) { defer trace.StartRegion(ctx, "get end device by id").End() @@ -101,6 +132,48 @@ func (r *DeviceRegistry) GetByID(ctx context.Context, appID *ttnpb.ApplicationId return pb, ctx, nil } +// BatchGetByID gets devices by appID, deviceIDs. +func (r *DeviceRegistry) BatchGetByID( + ctx context.Context, appID *ttnpb.ApplicationIdentifiers, deviceIDs []string, paths []string, +) ([]*ttnpb.EndDevice, error) { + defer trace.StartRegion(ctx, "batch get end device by id").End() + + keys := make([]string, len(deviceIDs)) + for i, devID := range deviceIDs { + ids := &ttnpb.EndDeviceIdentifiers{ + ApplicationIds: appID, + DeviceId: devID, + } + if err := ids.ValidateContext(ctx); err != nil { + return nil, err + } + keys[i] = r.uidKey(unique.ID(ctx, ids)) + } + + results, err := r.Redis.MGet(ctx, keys...).Result() + if err != nil { + return nil, ttnredis.ConvertError(err) + } + + protos := make([]*ttnpb.EndDevice, len(deviceIDs)) + for i, result := range results { + switch cmd := result.(type) { + case nil: + case string: + dev := &ttnpb.EndDevice{} + if err := ttnredis.UnmarshalProto(cmd, dev); err != nil { + return nil, err + } + dev, err = ttnpb.FilterGetEndDevice(dev, paths...) + if err != nil { + return nil, err + } + protos[i] = dev + } + } + return protos, nil +} + // GetByEUI gets device by joinEUI, devEUI. func (r *DeviceRegistry) GetByEUI(ctx context.Context, joinEUI, devEUI types.EUI64, paths []string) (*ttnpb.EndDevice, context.Context, error) { defer trace.StartRegion(ctx, "get end device by eui").End() @@ -658,6 +731,9 @@ func (r *DeviceRegistry) SetByID(ctx context.Context, appID *ttnpb.ApplicationId uid, ) } + if relayRulesMapping := r.relayRulesMapping(ctx, stored); len(relayRulesMapping) > 0 { + p.Del(ctx, maps.Keys(relayRulesMapping)...) + } return nil } @@ -689,6 +765,28 @@ func (r *DeviceRegistry) SetByID(ctx context.Context, appID *ttnpb.ApplicationId return registry.UniqueEUIViolationErr(ctx, joinEUI, devEUI, storedUIDStr) } } + if relayRulesMapping := r.relayRulesMapping(ctx, pb); len(relayRulesMapping) > 0 { + keys := maps.Keys(relayRulesMapping) + if err := tx.Watch(ctx, keys...).Err(); err != nil { + return err + } + ruleUIDs, err := tx.MGet(ctx, keys...).Result() + if err != nil { + return err + } + for i, ruleUID := range ruleUIDs { + switch ruleUID := ruleUID.(type) { + case nil: + case string: + return errRelayServed.WithAttributes( + "served", relayRulesMapping[keys[i]], + "serving", ruleUID, + ) + default: + panic("unreachable") + } + } + } } else { if ttnpb.HasAnyField(sets, "ids.application_ids.application_id") && pb.Ids.ApplicationIds.ApplicationId != stored.Ids.ApplicationIds.ApplicationId { return errReadOnlyField.WithAttributes("field", "ids.application_ids.application_id") @@ -848,6 +946,56 @@ func (r *DeviceRegistry) SetByID(ctx context.Context, appID *ttnpb.ApplicationId } } + storedRelayRulesMapping := r.relayRulesMapping(ctx, stored) + updatedRelayRulesMapping := r.relayRulesMapping(ctx, updated) + if !maps.Equal(storedRelayRulesMapping, updatedRelayRulesMapping) { + storedRelayRulesKeys := maps.Keys(storedRelayRulesMapping) + updatedRelayRulesKeys := maps.Keys(updatedRelayRulesMapping) + if err := tx.Watch(ctx, append(storedRelayRulesKeys, updatedRelayRulesKeys...)...).Err(); err != nil { + return err + } + + removed := make([]string, 0, len(storedRelayRulesKeys)) + for _, storedKey := range storedRelayRulesKeys { + if _, ok := updatedRelayRulesMapping[storedKey]; !ok { + removed = append(removed, storedKey) + } + } + if len(removed) > 0 { + p.Del(ctx, removed...) + } + + added := make([]string, 0, len(updatedRelayRulesKeys)) + for _, updatedKey := range updatedRelayRulesKeys { + if _, ok := storedRelayRulesMapping[updatedKey]; !ok { + added = append(added, updatedKey) + } + } + if len(added) > 0 { + ruleUIDs, err := tx.MGet(ctx, added...).Result() + if err != nil { + return err + } + for i, ruleUID := range ruleUIDs { + switch ruleUID := ruleUID.(type) { + case nil: + case string: + return errRelayServed.WithAttributes( + "served", updatedRelayRulesMapping[added[i]], + "serving", ruleUID, + ) + default: + panic("unreachable") + } + } + addedMapping := make(map[string]string, len(added)) + for _, addedKey := range added { + addedMapping[addedKey] = uid + } + p.MSet(ctx, addedMapping) + } + } + _, err := ttnredis.SetProto(ctx, p, uk, updated, 0) if err != nil { return err @@ -930,6 +1078,7 @@ func (r *DeviceRegistry) BatchDelete( return err } euiKeys := make([]string, 0, len(raw)) + relayRulesKeys := make([]string, 0, len(raw)) for _, raw := range raw { switch val := raw.(type) { case nil: @@ -964,6 +1113,7 @@ func (r *DeviceRegistry) BatchDelete( )), }...) } + relayRulesKeys = append(relayRulesKeys, maps.Keys(r.relayRulesMapping(ctx, dev))...) } } // If the provided end device identifiers are not registered, it is possible @@ -974,8 +1124,13 @@ func (r *DeviceRegistry) BatchDelete( return err } } + if len(relayRulesKeys) > 0 { + if err := tx.Watch(ctx, relayRulesKeys...).Err(); err != nil { + return err + } + } if _, err := tx.TxPipelined(ctx, func(p redis.Pipeliner) error { - p.Del(ctx, append(uidKeys, euiKeys...)...) + p.Del(ctx, append(append(uidKeys, euiKeys...), relayRulesKeys...)...) for uid, keys := range addrMapping { for _, key := range keys { removeAddrMapping(ctx, p, key, uid) diff --git a/pkg/networkserver/registry.go b/pkg/networkserver/registry.go index 2c58d582f9..e76eedfc77 100644 --- a/pkg/networkserver/registry.go +++ b/pkg/networkserver/registry.go @@ -43,6 +43,9 @@ type DeviceRegistry interface { RangeByUplinkMatches(ctx context.Context, up *ttnpb.UplinkMessage, f func(context.Context, *UplinkMatch) (bool, error)) error SetByID(ctx context.Context, appID *ttnpb.ApplicationIdentifiers, devID string, paths []string, f func(context.Context, *ttnpb.EndDevice) (*ttnpb.EndDevice, []string, error)) (*ttnpb.EndDevice, context.Context, error) Range(ctx context.Context, paths []string, f func(context.Context, *ttnpb.EndDeviceIdentifiers, *ttnpb.EndDevice) bool) error + BatchGetByID( + ctx context.Context, appID *ttnpb.ApplicationIdentifiers, deviceIDs []string, paths []string, + ) ([]*ttnpb.EndDevice, error) BatchDelete( ctx context.Context, appIDs *ttnpb.ApplicationIdentifiers, diff --git a/pkg/networkserver/relay.go b/pkg/networkserver/relay.go new file mode 100644 index 0000000000..84d1a74a65 --- /dev/null +++ b/pkg/networkserver/relay.go @@ -0,0 +1,446 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package networkserver + +import ( + "bytes" + "context" + + "go.thethings.network/lorawan-stack/v3/pkg/band" + "go.thethings.network/lorawan-stack/v3/pkg/crypto" + "go.thethings.network/lorawan-stack/v3/pkg/crypto/cryptoutil" + "go.thethings.network/lorawan-stack/v3/pkg/encoding/lorawan" + "go.thethings.network/lorawan-stack/v3/pkg/errors" + "go.thethings.network/lorawan-stack/v3/pkg/events" + "go.thethings.network/lorawan-stack/v3/pkg/log" + "go.thethings.network/lorawan-stack/v3/pkg/networkserver/internal" + "go.thethings.network/lorawan-stack/v3/pkg/networkserver/internal/time" + "go.thethings.network/lorawan-stack/v3/pkg/networkserver/mac" + "go.thethings.network/lorawan-stack/v3/pkg/specification/relayspec" + "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" + "go.thethings.network/lorawan-stack/v3/pkg/types" + "google.golang.org/grpc" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/durationpb" + "google.golang.org/protobuf/types/known/timestamppb" +) + +var ( + errRelaySchedule = errors.DefineAborted("relay_schedule", "relay schedule") + errRelayInvalidUplinkToken = errors.DefineInvalidArgument("relay_uplink_token", "invalid relay uplink token") + errRelayNoSession = errors.DefineNotFound("relay_session", "relay session not found") + errRelayNoSessionKeyID = errors.DefineNotFound("relay_session_key_id", "relay session key ID not found") + errRelayNoRecentUplinks = errors.DefineNotFound("relay_recent_uplinks", "recent uplinks not found") + errRelayRXWindowUnavailable = errors.DefineUnavailable("relay_rx_windows_available", "no RX windows available") + errRelayMTYpe = errors.DefineInvalidArgument("relay_m_type", "invalid MType") + errRelayFullFCnt = errors.DefineInvalidArgument("relay_full_f_cnt", "invalid full FCnt") + errRelayNotServing = errors.DefineUnavailable("relay_serving", "relay not serving") +) + +type relayKeyService struct { + devices DeviceRegistry + keys crypto.KeyService +} + +var _ mac.RelayKeyService = (*relayKeyService)(nil) + +// BatchDeriveRootWorSKey implements mac.RelayKeyService. +func (r *relayKeyService) BatchDeriveRootWorSKey( + ctx context.Context, appID *ttnpb.ApplicationIdentifiers, deviceIDs []string, sessionKeyIDs [][]byte, +) (devAddrs []*types.DevAddr, keys []*types.AES128Key, err error) { + if len(deviceIDs) != len(sessionKeyIDs) { + panic("device IDs and session key IDs must have the same length") + } + if len(deviceIDs) == 0 { + return nil, nil, nil + } + devices, err := r.devices.BatchGetByID( + ctx, + appID, + deviceIDs, + []string{ + "pending_session.dev_addr", + "pending_session.keys.nwk_s_enc_key.encrypted_key", + "pending_session.keys.nwk_s_enc_key.kek_label", + "pending_session.keys.nwk_s_enc_key.key", + "pending_session.keys.session_key_id", + "session.dev_addr", + "session.keys.nwk_s_enc_key.encrypted_key", + "session.keys.nwk_s_enc_key.kek_label", + "session.keys.nwk_s_enc_key.key", + "session.keys.session_key_id", + }, + ) + if err != nil { + return nil, nil, err + } + devAddrs, keys = make([]*types.DevAddr, len(deviceIDs)), make([]*types.AES128Key, len(deviceIDs)) + for i, dev := range devices { + var devAddr types.DevAddr + var keyEnvelope *ttnpb.KeyEnvelope + switch { + case dev.GetPendingSession().GetKeys().GetNwkSEncKey() != nil && + bytes.Equal(dev.PendingSession.Keys.SessionKeyId, sessionKeyIDs[i]): + copy(devAddr[:], dev.PendingSession.DevAddr) + keyEnvelope = dev.PendingSession.Keys.NwkSEncKey + case dev.GetSession().GetKeys().GetNwkSEncKey() != nil && + bytes.Equal(dev.Session.Keys.SessionKeyId, sessionKeyIDs[i]): + copy(devAddr[:], dev.Session.DevAddr) + keyEnvelope = dev.Session.Keys.NwkSEncKey + default: + continue + } + key, err := cryptoutil.UnwrapAES128Key(ctx, keyEnvelope, r.keys) + if err != nil { + return nil, nil, err + } + key = crypto.DeriveRootWorSKey(key) + devAddrs[i], keys[i] = &devAddr, &key + } + return devAddrs, keys, nil +} + +func (ns *NetworkServer) relayKeyService() mac.RelayKeyService { + return &relayKeyService{ns.devices, ns.KeyService()} +} + +func relayUplinkToken(ids *ttnpb.EndDeviceIdentifiers, sessionKeyID []byte, fullFCnt uint32) ([]byte, error) { + token := &ttnpb.RelayUplinkToken{ + Ids: ids, + SessionKeyId: sessionKeyID, + FullFCnt: fullFCnt, + } + if err := token.ValidateFields(); err != nil { + return nil, err + } + return proto.Marshal(token) +} + +func handleRelayForwardingProtocol( + ctx context.Context, + dev *ttnpb.EndDevice, + fullFCnt uint32, + phy *band.Band, + up *ttnpb.UplinkMessage, + keyService crypto.KeyService, +) (_ *ttnpb.UplinkMessage, queuedEvents []events.Event, err error) { + defer func() { + if err != nil { + queuedEvents = append(queuedEvents, evtDropRelayUplink.NewWithIdentifiersAndData(ctx, dev.Ids, err)) + } + }() + session := dev.Session + nwkSEncKey := session.Keys.NwkSEncKey + key, err := cryptoutil.UnwrapAES128Key(ctx, nwkSEncKey, keyService) + if err != nil { + return nil, queuedEvents, err + } + rawPayload, err := crypto.DecryptUplink( + key, types.DevAddr(session.DevAddr), fullFCnt, up.Payload.GetMacPayload().FrmPayload, + ) + if err != nil { + return nil, queuedEvents, err + } + req := &ttnpb.RelayForwardUplinkReq{} + if err := lorawan.UnmarshalRelayForwardUplinkReq(phy, rawPayload, req); err != nil { + return nil, queuedEvents, err + } + uplinkToken, err := relayUplinkToken(dev.Ids, session.Keys.SessionKeyId, fullFCnt) + if err != nil { + return nil, queuedEvents, err + } + mdTime, mdReceivedAt := up.ReceivedAt, up.ReceivedAt + var mdGPSTime *timestamppb.Timestamp + for _, md := range up.RxMetadata { + if md.GpsTime != nil { + mdTime, mdGPSTime, mdReceivedAt = md.Time, md.GpsTime, md.ReceivedAt + break + } + if mdReceivedAt == nil { + mdTime, mdGPSTime, mdReceivedAt = md.Time, md.GpsTime, md.ReceivedAt + continue + } + if md.ReceivedAt != nil && md.ReceivedAt.AsTime().Before(mdReceivedAt.AsTime()) { + mdTime, mdGPSTime, mdReceivedAt = md.Time, md.GpsTime, md.ReceivedAt + } + } + adjustTime := func(ts *timestamppb.Timestamp) *timestamppb.Timestamp { + if ts == nil { + return nil + } + t := ts.AsTime().Add(-(up.ConsumedAirtime.AsDuration() + phy.RelayForwardDelay)) + return timestamppb.New(t) + } + up = &ttnpb.UplinkMessage{ + RawPayload: req.RawPayload, + Settings: &ttnpb.TxSettings{ + DataRate: req.DataRate, + Frequency: req.Frequency, + Time: adjustTime(up.Settings.Time), + }, + RxMetadata: []*ttnpb.RxMetadata{ + { + GatewayIds: relayspec.GatewayIdentifiers, + Relay: &ttnpb.RelayMetadata{ + DeviceId: dev.Ids.DeviceId, + WorChannel: req.WorChannel, + }, + Time: adjustTime(mdTime), + Rssi: float32(req.Rssi), + ChannelRssi: float32(req.Rssi), + Snr: float32(req.Snr), + UplinkToken: uplinkToken, + GpsTime: adjustTime(mdGPSTime), + ReceivedAt: adjustTime(mdReceivedAt), + }, + }, + ReceivedAt: up.ReceivedAt, + CorrelationIds: events.CorrelationIDsFromContext(ctx), + } + if err := up.ValidateFields(); err != nil { + return nil, queuedEvents, err + } + up.Payload = &ttnpb.Message{} + if err := lorawan.UnmarshalMessage(up.RawPayload, up.Payload); err != nil { + return nil, queuedEvents, err + } + if err := up.Payload.ValidateFields(); err != nil { + return nil, queuedEvents, err + } + queuedEvents = append(queuedEvents, evtProcessRelayUplink.NewWithIdentifiersAndData(ctx, dev.Ids, up)) + return up, queuedEvents, nil +} + +func relayLoopbackFunc( + conn *grpc.ClientConn, + up *ttnpb.UplinkMessage, + callOpts ...grpc.CallOption, +) func(context.Context) error { + client := ttnpb.NewGsNsClient(conn) + return func(ctx context.Context) error { + switch _, err := client.HandleUplink(ctx, up, callOpts...); { + case err == nil, errors.IsNotFound(err), errors.IsAlreadyExists(err): + return nil + default: + return err + } + } +} + +func relayUpdateRules( + deviceID string, sessionKeyID []byte, rules []*ttnpb.ServingRelayParameters_UplinkForwardingRule, +) bool { + for _, rule := range rules { + if rule.DeviceId != deviceID || bytes.Equal(rule.SessionKeyId, sessionKeyID) { + continue + } + rule.LastWFCnt = 0 + rule.SessionKeyId = sessionKeyID + return true + } + return false +} + +var relayDeliverSessionKeysPaths = ttnpb.AddFields( + deviceDownlinkFullPaths[:], + "mac_settings.desired_relay.mode.serving.uplink_forwarding_rules", + "mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", + "pending_mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", +) + +func (ns *NetworkServer) deliverRelaySessionKeys(ctx context.Context, dev *ttnpb.EndDevice, sessionKeyID []byte) error { + for _, served := range []*ttnpb.ServedRelayParameters{ + dev.MacSettings.GetRelay().GetServed(), + dev.MacSettings.GetDesiredRelay().GetServed(), + } { + if served == nil { + continue + } + serving, ctx, err := ns.devices.SetByID( + ctx, + dev.Ids.ApplicationIds, + served.ServingDeviceId, + relayDeliverSessionKeysPaths, + func(ctx context.Context, serving *ttnpb.EndDevice) (*ttnpb.EndDevice, []string, error) { + if serving == nil { + return nil, nil, nil + } + var paths []string + for path, rules := range map[string][]*ttnpb.ServingRelayParameters_UplinkForwardingRule{ + "mac_settings.desired_relay.mode.serving.uplink_forwarding_rules": serving.MacSettings.GetDesiredRelay().GetServing().GetUplinkForwardingRules(), // nolint:lll + "mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules": serving.MacState.GetDesiredParameters().GetRelay().GetServing().GetUplinkForwardingRules(), // nolint:lll + "pending_mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules": serving.PendingMacState.GetDesiredParameters().GetRelay().GetServing().GetUplinkForwardingRules(), // nolint:lll + } { + if relayUpdateRules(dev.Ids.DeviceId, sessionKeyID, rules) { + paths = ttnpb.AddFields(paths, path) + } + } + return serving, paths, nil + }, + ) + if err != nil { + return err + } + if err := ns.updateDataDownlinkTask(ctx, serving, time.Time{}); err != nil { + log.FromContext(ctx).WithError(err).Error("Failed to update downlink task queue after session key delivery") + } + } + return nil +} + +func parseRelayUplinkToken(b []byte) (*ttnpb.RelayUplinkToken, error) { + token := &ttnpb.RelayUplinkToken{} + if err := proto.Unmarshal(b, token); err != nil { + return nil, err + } + if err := token.ValidateFields(); err != nil { + return nil, err + } + return token, nil +} + +func (ns *NetworkServer) relayPatchServingDevice( + ctx context.Context, + appID *ttnpb.ApplicationIdentifiers, + devID string, + gets []string, + f func(context.Context, *ttnpb.EndDevice) (*ttnpb.EndDevice, []string, error), +) error { + fullGets := ttnpb.AddFields(gets, deviceDownlinkFullPaths[:]...) + filteredF := func(ctx context.Context, dev *ttnpb.EndDevice) (*ttnpb.EndDevice, []string, error) { + dev, err := ttnpb.FilterGetEndDevice(dev, gets...) + if err != nil { + return nil, nil, err + } + dev, sets, err := f(ctx, dev) + if err != nil { + return nil, nil, err + } + if dev == nil { + panic("nil device returned") + } + return dev, sets, nil + } + dev, ctx, err := ns.devices.SetByID(ctx, appID, devID, fullGets, filteredF) + if err != nil { + return err + } + return ns.updateDataDownlinkTask(ctx, dev, time.Time{}) +} + +type relayDownlinkTarget struct { + servedEndDeviceIDs *ttnpb.EndDeviceIdentifiers + servedSessionKeyID []byte + + patchServingDevice func( + ctx context.Context, + appID *ttnpb.ApplicationIdentifiers, + devID string, + paths []string, + f func(context.Context, *ttnpb.EndDevice) (*ttnpb.EndDevice, []string, error), + ) error +} + +var _ downlinkTarget = (*relayDownlinkTarget)(nil) + +// Equal implements downlinkTarget. +func (*relayDownlinkTarget) Equal(downlinkTarget) bool { + return false +} + +// Schedule implements downlinkTarget. +func (r *relayDownlinkTarget) Schedule( + ctx context.Context, down *ttnpb.DownlinkMessage, _ ...grpc.CallOption, +) (*ttnpb.ScheduleDownlinkResponse, error) { + request := down.GetRequest() + if request == nil { + panic("downlink without request") + } + if len(request.DownlinkPaths) != 1 { + panic("invalid downlink paths length") + } + path := request.DownlinkPaths[0].GetUplinkToken() + if len(path) == 0 { + panic("invalid downlink path") + } + token, err := parseRelayUplinkToken(path) + if err != nil { + return nil, err + } + if !proto.Equal(token.Ids.ApplicationIds, r.servedEndDeviceIDs.ApplicationIds) { + return nil, errRelaySchedule.WithCause(errRelayInvalidUplinkToken) + } + f := func(ctx context.Context, dev *ttnpb.EndDevice) (*ttnpb.EndDevice, []string, error) { + session, macState := dev.GetSession(), dev.GetMacState() + if session == nil || macState == nil { + log.FromContext(ctx).Debug("Nil session or MAC state") + return dev, nil, errRelaySchedule.WithCause(errRelayNoSession) + } + if !bytes.Equal(session.Keys.SessionKeyId, token.SessionKeyId) { + log.FromContext(ctx).Debug("Invalid session key ID") + return dev, nil, errRelaySchedule.WithCause(errRelayNoSessionKeyID) + } + if len(macState.RecentUplinks) == 0 { + log.FromContext(ctx).Debug("No recent uplinks") + return dev, nil, errRelaySchedule.WithCause(errRelayNoRecentUplinks) + } + if !macState.RxWindowsAvailable { + log.FromContext(ctx).Debug("No RX windows available") + return dev, nil, errRelaySchedule.WithCause(errRelayRXWindowUnavailable) + } + lastPayload := internal.LastUplink(macState.RecentUplinks...).Payload + if mType := lastPayload.MHdr.MType; mType != ttnpb.MType_UNCONFIRMED_UP && mType != ttnpb.MType_CONFIRMED_UP { + log.FromContext(ctx).Debug("Invalid MType") + return dev, nil, errRelaySchedule.WithCause(errRelayMTYpe) + } + if lastPayload.GetMacPayload().FullFCnt != token.FullFCnt { + log.FromContext(ctx).Debug("Invalid full FCnt") + return dev, nil, errRelaySchedule.WithCause(errRelayFullFCnt) + } + if macState.CurrentParameters.Relay.GetServing() == nil { + log.FromContext(ctx).Debug("Not serving relay") + return dev, nil, errRelaySchedule.WithCause(errRelayNotServing) + } + log.FromContext(ctx).Debug("Relay downlink enqueued") + macState.PendingRelayDownlink = &ttnpb.RelayForwardDownlinkReq{ + RawPayload: down.RawPayload, + } + return dev, []string{"mac_state.pending_relay_downlink.raw_payload"}, nil + } + if err := r.patchServingDevice( + ctx, + token.Ids.ApplicationIds, + token.Ids.DeviceId, + []string{ + "mac_state.current_parameters.relay.mode.serving", + "mac_state.recent_uplinks", + "mac_state.rx_windows_available", + "session.keys.session_key_id", + }, + f, + ); err != nil { + return nil, err + } + return &ttnpb.ScheduleDownlinkResponse{ + Delay: durationpb.New(peeringScheduleDelay), + DownlinkPath: &ttnpb.DownlinkPath{ + Path: &ttnpb.DownlinkPath_Fixed{ + Fixed: &ttnpb.GatewayAntennaIdentifiers{ + GatewayIds: relayspec.GatewayIdentifiers, + }, + }, + }, + }, nil +} diff --git a/pkg/networkserver/relay_test.go b/pkg/networkserver/relay_test.go new file mode 100644 index 0000000000..cda20e0769 --- /dev/null +++ b/pkg/networkserver/relay_test.go @@ -0,0 +1,279 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package networkserver_test + +import ( + "context" + "testing" + + "github.com/smarty/assertions" + "go.thethings.network/lorawan-stack/v3/pkg/crypto" + "go.thethings.network/lorawan-stack/v3/pkg/crypto/cryptoutil" + "go.thethings.network/lorawan-stack/v3/pkg/networkserver" + "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" + "go.thethings.network/lorawan-stack/v3/pkg/types" + "go.thethings.network/lorawan-stack/v3/pkg/util/test" + "go.thethings.network/lorawan-stack/v3/pkg/util/test/assertions/should" +) + +func TestBatchDeriveRootWorSKey(t *testing.T) { + t.Parallel() + keyVault := cryptoutil.NewMemKeyVault(nil) + keyService := crypto.NewKeyService(keyVault) + filterFields := func( + t *testing.T, a *assertions.Assertion, devices []*ttnpb.EndDevice, paths []string, + ) []*ttnpb.EndDevice { + t.Helper() + devices = append(devices[:0:0], devices...) + for i, dev := range devices { + var err error + devices[i], err = ttnpb.FilterGetEndDevice(dev, paths...) + if !a.So(err, should.BeNil) { + t.FailNow() + } + } + return devices + } + for _, tc := range []struct { + Name string + + ApplicationIDs *ttnpb.ApplicationIdentifiers + DeviceIDs []string + SessionKeyIDs [][]byte + + DevAddrs []*types.DevAddr + Keys []*types.AES128Key + + BatchGetByIDFunc func( + ctx context.Context, + t *testing.T, + a *assertions.Assertion, + appIDs *ttnpb.ApplicationIdentifiers, + devIDs []string, + paths []string, + ) ([]*ttnpb.EndDevice, error) + }{ + { + Name: "no devices", + + ApplicationIDs: test.DefaultApplicationIdentifiers, + + BatchGetByIDFunc: func( + ctx context.Context, + t *testing.T, + a *assertions.Assertion, + appIDs *ttnpb.ApplicationIdentifiers, + devIDs []string, + paths []string, + ) ([]*ttnpb.EndDevice, error) { + t.Helper() + t.Fatal("BatchGetByID must not be called") + return nil, nil + }, + }, + { + Name: "no sessions", + + ApplicationIDs: test.DefaultApplicationIdentifiers, + DeviceIDs: []string{"device1", "device2"}, + SessionKeyIDs: [][]byte{{0x01}, {0x02}}, + + DevAddrs: []*types.DevAddr{nil, nil}, + Keys: []*types.AES128Key{nil, nil}, + + BatchGetByIDFunc: func( + ctx context.Context, + t *testing.T, + a *assertions.Assertion, + appIDs *ttnpb.ApplicationIdentifiers, + devIDs []string, + paths []string, + ) ([]*ttnpb.EndDevice, error) { + t.Helper() + a.So(appIDs, should.Resemble, test.DefaultApplicationIdentifiers) + a.So(devIDs, should.Resemble, []string{"device1", "device2"}) + return filterFields(t, a, []*ttnpb.EndDevice{ + { + Ids: &ttnpb.EndDeviceIdentifiers{ + ApplicationIds: test.DefaultApplicationIdentifiers, + DeviceId: "device1", + }, + }, + { + Ids: &ttnpb.EndDeviceIdentifiers{ + ApplicationIds: test.DefaultApplicationIdentifiers, + DeviceId: "device2", + }, + }, + }, paths), nil + }, + }, + { + Name: "only sessions", + + ApplicationIDs: test.DefaultApplicationIdentifiers, + DeviceIDs: []string{"device1", "device2"}, + SessionKeyIDs: [][]byte{{0x01}, {0x02}}, + + DevAddrs: []*types.DevAddr{{0x42, 0x42, 0x42, 0x42}, {0x43, 0x43, 0x43, 0x43}}, + Keys: []*types.AES128Key{ + {0xEE, 0x91, 0xDC, 0x1A, 0x66, 0x66, 0xC0, 0x6E, 0x82, 0x77, 0xDE, 0x6D, 0xB4, 0xDB, 0x94, 0x5F}, + {0xC2, 0x7E, 0x77, 0x4E, 0x20, 0x73, 0x18, 0x96, 0xFE, 0x20, 0x5D, 0x77, 0x1D, 0x7B, 0xC1, 0xF1}, + }, + + BatchGetByIDFunc: func( + ctx context.Context, + t *testing.T, + a *assertions.Assertion, + appIDs *ttnpb.ApplicationIdentifiers, + devIDs []string, + paths []string, + ) ([]*ttnpb.EndDevice, error) { + t.Helper() + a.So(appIDs, should.Resemble, test.DefaultApplicationIdentifiers) + a.So(devIDs, should.Resemble, []string{"device1", "device2"}) + return filterFields(t, a, []*ttnpb.EndDevice{ + { + Ids: &ttnpb.EndDeviceIdentifiers{ + ApplicationIds: test.DefaultApplicationIdentifiers, + DeviceId: "device1", + }, + Session: &ttnpb.Session{ + DevAddr: types.DevAddr{0x42, 0x42, 0x42, 0x42}.Bytes(), + Keys: &ttnpb.SessionKeys{ + SessionKeyId: []byte{0x01}, + NwkSEncKey: &ttnpb.KeyEnvelope{ + Key: []byte{0xCE, 0x07, 0xA0, 0x09, 0xA3, 0x97, 0x0A, 0xC0, 0x51, 0x9A, 0x09, 0x9E, 0xD5, 0x3E, 0x55, 0x0B}, // nolint:lll + }, + }, + }, + }, + { + Ids: &ttnpb.EndDeviceIdentifiers{ + ApplicationIds: test.DefaultApplicationIdentifiers, + DeviceId: "device2", + }, + Session: &ttnpb.Session{ + DevAddr: types.DevAddr{0x43, 0x43, 0x43, 0x43}.Bytes(), + Keys: &ttnpb.SessionKeys{ + SessionKeyId: []byte{0x02}, + NwkSEncKey: &ttnpb.KeyEnvelope{ + Key: []byte{0xCE, 0x07, 0xA0, 0x09, 0xA3, 0x97, 0x0A, 0xC0, 0x51, 0x9A, 0x09, 0x9E, 0xD5, 0x3E, 0x55, 0x0C}, // nolint:lll + }, + }, + }, + }, + }, paths), nil + }, + }, + { + Name: "with pending sessions", + + ApplicationIDs: test.DefaultApplicationIdentifiers, + DeviceIDs: []string{"device1", "device2"}, + SessionKeyIDs: [][]byte{{0x03}, {0x02}}, + + DevAddrs: []*types.DevAddr{{0x44, 0x44, 0x44, 0x44}, {0x43, 0x43, 0x43, 0x43}}, + Keys: []*types.AES128Key{ + {0x67, 0x11, 0x92, 0xD5, 0x9C, 0x0D, 0x35, 0x7D, 0xEF, 0xE2, 0xA9, 0x45, 0x21, 0xC4, 0x22, 0x7C}, + {0xC2, 0x7E, 0x77, 0x4E, 0x20, 0x73, 0x18, 0x96, 0xFE, 0x20, 0x5D, 0x77, 0x1D, 0x7B, 0xC1, 0xF1}, + }, + + BatchGetByIDFunc: func( + ctx context.Context, + t *testing.T, + a *assertions.Assertion, + appIDs *ttnpb.ApplicationIdentifiers, + devIDs []string, + paths []string, + ) ([]*ttnpb.EndDevice, error) { + t.Helper() + a.So(appIDs, should.Resemble, test.DefaultApplicationIdentifiers) + a.So(devIDs, should.Resemble, []string{"device1", "device2"}) + return filterFields(t, a, []*ttnpb.EndDevice{ + { + Ids: &ttnpb.EndDeviceIdentifiers{ + ApplicationIds: test.DefaultApplicationIdentifiers, + DeviceId: "device1", + }, + Session: &ttnpb.Session{ + DevAddr: types.DevAddr{0x42, 0x42, 0x42, 0x42}.Bytes(), + Keys: &ttnpb.SessionKeys{ + SessionKeyId: []byte{0x01}, + NwkSEncKey: &ttnpb.KeyEnvelope{ + Key: []byte{0xCE, 0x07, 0xA0, 0x09, 0xA3, 0x97, 0x0A, 0xC0, 0x51, 0x9A, 0x09, 0x9E, 0xD5, 0x3E, 0x55, 0x0B}, // nolint:lll + }, + }, + }, + PendingSession: &ttnpb.Session{ + DevAddr: types.DevAddr{0x44, 0x44, 0x44, 0x44}.Bytes(), + Keys: &ttnpb.SessionKeys{ + SessionKeyId: []byte{0x03}, + NwkSEncKey: &ttnpb.KeyEnvelope{ + Key: []byte{0xCE, 0x07, 0xA0, 0x09, 0xA3, 0x97, 0x0A, 0xC0, 0x51, 0x9A, 0x09, 0x9E, 0xD5, 0x3E, 0x55, 0x0D}, // nolint:lll + }, + }, + }, + }, + { + Ids: &ttnpb.EndDeviceIdentifiers{ + ApplicationIds: test.DefaultApplicationIdentifiers, + DeviceId: "device2", + }, + Session: &ttnpb.Session{ + DevAddr: types.DevAddr{0x43, 0x43, 0x43, 0x43}.Bytes(), + Keys: &ttnpb.SessionKeys{ + SessionKeyId: []byte{0x02}, + NwkSEncKey: &ttnpb.KeyEnvelope{ + Key: []byte{0xCE, 0x07, 0xA0, 0x09, 0xA3, 0x97, 0x0A, 0xC0, 0x51, 0x9A, 0x09, 0x9E, 0xD5, 0x3E, 0x55, 0x0C}, // nolint:lll + }, + }, + }, + }, + }, paths), nil + }, + }, + } { + tc := tc + test.RunSubtest(t, test.SubtestConfig{ + Name: tc.Name, + Parallel: true, + Func: func(ctx context.Context, t *testing.T, a *assertions.Assertion) { + t.Helper() + relayKeyService := networkserver.NewRelayKeyService( + &networkserver.MockDeviceRegistry{ + BatchGetByIDFunc: func( + ctx context.Context, + appIDs *ttnpb.ApplicationIdentifiers, + devIDs []string, + paths []string, + ) ([]*ttnpb.EndDevice, error) { + t.Helper() + return tc.BatchGetByIDFunc(ctx, t, a, appIDs, devIDs, paths) + }, + }, + keyService, + ) + devAddrs, keys, err := relayKeyService.BatchDeriveRootWorSKey( + ctx, tc.ApplicationIDs, tc.DeviceIDs, tc.SessionKeyIDs, + ) + if a.So(err, should.BeNil) { + a.So(devAddrs, should.Resemble, tc.DevAddrs) + a.So(keys, should.Resemble, tc.Keys) + } + }, + }) + } +} diff --git a/pkg/networkserver/relay_util_test.go b/pkg/networkserver/relay_util_test.go new file mode 100644 index 0000000000..4343c6fb92 --- /dev/null +++ b/pkg/networkserver/relay_util_test.go @@ -0,0 +1,28 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package networkserver + +import ( + "go.thethings.network/lorawan-stack/v3/pkg/crypto" + "go.thethings.network/lorawan-stack/v3/pkg/networkserver/mac" +) + +// NewRelayKeyService returns a new mac.RelayKeyService. +func NewRelayKeyService(devices DeviceRegistry, keys crypto.KeyService) mac.RelayKeyService { + return &relayKeyService{ + devices: devices, + keys: keys, + } +} diff --git a/pkg/networkserver/utils.go b/pkg/networkserver/utils.go index ba4cca23d7..43b00ca0ff 100644 --- a/pkg/networkserver/utils.go +++ b/pkg/networkserver/utils.go @@ -256,6 +256,9 @@ func nextDataDownlinkSlot(ctx context.Context, dev *ttnpb.EndDevice, phy *band.B case mac.ContainsStickyMACCommand(dev.MacState.RecentMacCommandIdentifiers...): logger.Debug("Sticky MAC response received, choose class A downlink slot") return classA, true + case dev.MacState.PendingRelayDownlink != nil: + logger.Debug("Pending relay downlink, choose class A downlink slot") + return classA, true case mac.DeviceNeedsADRParamSetupReq(dev, phy): logger.Debug("Device needs ADRParamSetupReq, choose class A downlink slot") return classA, true @@ -295,6 +298,21 @@ func nextDataDownlinkSlot(ctx context.Context, dev *ttnpb.EndDevice, phy *band.B case mac.DeviceNeedsTxParamSetupReq(dev, phy): logger.Debug("Device needs TxParamSetupReq, choose class A downlink slot") return classA, true + case mac.DeviceNeedsRelayConfReq(dev): + logger.Debug("Device needs RelayConfReq, choose class A downlink slot") + return classA, true + case mac.DeviceNeedsRelayEndDeviceConfReq(dev): + logger.Debug("Device needs RelayEndDeviceConfReq, choose class A downlink slot") + return classA, true + case mac.DeviceNeedsRelayUpdateUplinkListReq(dev): + logger.Debug("Device needs RelayUpdateUplinkListReq, choose class A downlink slot") + return classA, true + case mac.DeviceNeedsRelayCtrlUplinkListReq(dev): + logger.Debug("Device needs RelayCtrlUplinkListReq, choose class A downlink slot") + return classA, true + case mac.DeviceNeedsRelayConfigureFwdLimitReq(dev): + logger.Debug("Device needs RelayConfigureFwdLimitReq, choose class A downlink slot") + return classA, true } } diff --git a/pkg/specification/relayspec/relay.go b/pkg/specification/relayspec/relay.go new file mode 100644 index 0000000000..81b8b1ebbd --- /dev/null +++ b/pkg/specification/relayspec/relay.go @@ -0,0 +1,24 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package relayspec contains LoRaWAN relay related functionality. +package relayspec + +import "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" + +// FPort is the FPort used for the relay forwarding protocol. +const FPort = 226 + +// GatewayIdentifiers is the GatewayIdentifiers used for relay end devices. +var GatewayIdentifiers = &ttnpb.GatewayIdentifiers{GatewayId: "relay"} diff --git a/pkg/ttnpb/end_device.go b/pkg/ttnpb/end_device.go index 16b2c1d497..7891145016 100644 --- a/pkg/ttnpb/end_device.go +++ b/pkg/ttnpb/end_device.go @@ -59,6 +59,222 @@ func (v *BoolValue) FieldIsZero(p string) bool { panic(fmt.Sprintf("unknown path '%s'", p)) } +// FieldIsZero returns whether path p is zero. +func (v *ServedRelayParameters) FieldIsZero(p string) bool { + if v == nil { + return true + } + switch p { + case "backoff": + return v.Backoff == 0 + case "mode": + return v.Mode == nil + case "mode.always": + return v.GetAlways() == nil + case "mode.dynamic": + return v.GetDynamic() == nil + case "mode.dynamic.smart_enable_level": + return v.GetDynamic().FieldIsZero("smart_enable_level") + case "mode.end_device_controlled": + return v.GetEndDeviceControlled() == nil + case "second_channel": + return v.SecondChannel == nil + case "second_channel.ack_offset": + return v.SecondChannel.FieldIsZero("ack_offset") + case "second_channel.data_rate_index": + return v.SecondChannel.FieldIsZero("data_rate_index") + case "second_channel.frequency": + return v.SecondChannel.FieldIsZero("frequency") + case "serving_device_id": + return v.ServingDeviceId == "" + } + panic(fmt.Sprintf("unknown path '%s'", p)) +} + +// FieldIsZero returns whether path p is zero. +func (v *RelayForwardLimits) FieldIsZero(p string) bool { + if v == nil { + return true + } + switch p { + case "bucket_size": + return v.BucketSize == 0 + case "reload_rate": + return v.ReloadRate == 0 + } + panic(fmt.Sprintf("unknown path '%s'", p)) +} + +// FieldIsZero returns whether path p is zero. +func (v *ServingRelayParameters_ForwardingLimits) FieldIsZero(p string) bool { + if v == nil { + return true + } + switch p { + case "reset_behavior": + return v.ResetBehavior == 0 + case "join_requests": + return v.JoinRequests == nil + case "join_requests.bucket_size": + return v.JoinRequests.FieldIsZero("bucket_size") + case "join_requests.reload_rate": + return v.JoinRequests.FieldIsZero("reload_rate") + case "notifications": + return v.Notifications == nil + case "notifications.bucket_size": + return v.Notifications.FieldIsZero("bucket_size") + case "notifications.reload_rate": + return v.Notifications.FieldIsZero("reload_rate") + case "uplink_messages": + return v.UplinkMessages == nil + case "uplink_messages.bucket_size": + return v.UplinkMessages.FieldIsZero("bucket_size") + case "uplink_messages.reload_rate": + return v.UplinkMessages.FieldIsZero("reload_rate") + case "overall": + return v.Overall == nil + case "overall.bucket_size": + return v.Overall.FieldIsZero("bucket_size") + case "overall.reload_rate": + return v.Overall.FieldIsZero("reload_rate") + } + panic(fmt.Sprintf("unknown path '%s'", p)) +} + +// FieldIsZero returns whether path p is zero. +func (v *ServingRelayParameters) FieldIsZero(p string) bool { + if v == nil { + return true + } + switch p { + case "second_channel": + return v.SecondChannel == nil + case "second_channel.ack_offset": + return v.SecondChannel.FieldIsZero("ack_offset") + case "second_channel.data_rate_index": + return v.SecondChannel.FieldIsZero("data_rate_index") + case "second_channel.frequency": + return v.SecondChannel.FieldIsZero("frequency") + case "default_channel_index": + return v.DefaultChannelIndex == 0 + case "cad_periodicity": + return v.CadPeriodicity == 0 + case "uplink_forwarding_rules": + return v.UplinkForwardingRules == nil + case "limits": + return v.Limits == nil + case "limits.reset_behavior": + return v.Limits.FieldIsZero("reset_behavior") + case "limits.join_requests": + return v.Limits.FieldIsZero("join_requests") + case "limits.join_requests.bucket_size": + return v.Limits.FieldIsZero("join_requests.bucket_size") + case "limits.join_requests.reload_rate": + return v.Limits.FieldIsZero("join_requests.reload_rate") + case "limits.notifications": + return v.Limits.FieldIsZero("notifications") + case "limits.notifications.bucket_size": + return v.Limits.FieldIsZero("notifications.bucket_size") + case "limits.notifications.reload_rate": + return v.Limits.FieldIsZero("notifications.reload_rate") + case "limits.uplink_messages": + return v.Limits.FieldIsZero("uplink_messages") + case "limits.uplink_messages.bucket_size": + return v.Limits.FieldIsZero("uplink_messages.bucket_size") + case "limits.uplink_messages.reload_rate": + return v.Limits.FieldIsZero("uplink_messages.reload_rate") + case "limits.overall": + return v.Limits.FieldIsZero("overall") + case "limits.overall.bucket_size": + return v.Limits.FieldIsZero("overall.bucket_size") + case "limits.overall.reload_rate": + return v.Limits.FieldIsZero("overall.reload_rate") + } + panic(fmt.Sprintf("unknown path '%s'", p)) +} + +// FieldIsZero returns whether path p is zero. +func (v *RelayParameters) FieldIsZero(p string) bool { + if v == nil { + return true + } + switch p { + case "mode": + return v.Mode == nil + case "mode.served": + return v.GetServed() == nil + case "mode.served.backoff": + return v.GetServed().FieldIsZero("backoff") + case "mode.served.mode": + return v.GetServed().FieldIsZero("mode") + case "mode.served.mode.always": + return v.GetServed().FieldIsZero("mode.always") + case "mode.served.mode.dynamic": + return v.GetServed().FieldIsZero("mode.dynamic") + case "mode.served.mode.dynamic.smart_enable_level": + return v.GetServed().FieldIsZero("mode.dynamic.smart_enable_level") + case "mode.served.mode.end_device_controlled": + return v.GetServed().FieldIsZero("mode.end_device_controlled") + case "mode.served.second_channel": + return v.GetServed().FieldIsZero("second_channel") + case "mode.served.second_channel.ack_offset": + return v.GetServed().FieldIsZero("second_channel.ack_offset") + case "mode.served.second_channel.data_rate_index": + return v.GetServed().FieldIsZero("second_channel.data_rate_index") + case "mode.served.second_channel.frequency": + return v.GetServed().FieldIsZero("second_channel.frequency") + case "mode.served.default_channel_index": + return v.GetServed().FieldIsZero("default_channel_index") + case "mode.served.serving_device_id": + return v.GetServed().FieldIsZero("serving_device_id") + case "mode.serving": + return v.GetServing() == nil + case "mode.serving.second_channel": + return v.GetServing().FieldIsZero("second_channel") + case "mode.serving.second_channel.ack_offset": + return v.GetServing().FieldIsZero("second_channel.ack_offset") + case "mode.serving.second_channel.data_rate_index": + return v.GetServing().FieldIsZero("second_channel.data_rate_index") + case "mode.serving.second_channel.frequency": + return v.GetServing().FieldIsZero("second_channel.frequency") + case "mode.serving.default_channel_index": + return v.GetServing().FieldIsZero("default_channel_index") + case "mode.serving.cad_periodicity": + return v.GetServing().FieldIsZero("cad_periodicity") + case "mode.serving.uplink_forwarding_rules": + return v.GetServing().FieldIsZero("uplink_forwarding_rules") + case "mode.serving.limits": + return v.GetServing().FieldIsZero("limits") + case "mode.serving.limits.reset_behavior": + return v.GetServing().FieldIsZero("limits.reset_behavior") + case "mode.serving.limits.join_requests": + return v.GetServing().FieldIsZero("limits.join_requests") + case "mode.serving.limits.join_requests.bucket_size": + return v.GetServing().FieldIsZero("limits.join_requests.bucket_size") + case "mode.serving.limits.join_requests.reload_rate": + return v.GetServing().FieldIsZero("limits.join_requests.reload_rate") + case "mode.serving.limits.notifications": + return v.GetServing().FieldIsZero("limits.notifications") + case "mode.serving.limits.notifications.bucket_size": + return v.GetServing().FieldIsZero("limits.notifications.bucket_size") + case "mode.serving.limits.notifications.reload_rate": + return v.GetServing().FieldIsZero("limits.notifications.reload_rate") + case "mode.serving.limits.uplink_messages": + return v.GetServing().FieldIsZero("limits.uplink_messages") + case "mode.serving.limits.uplink_messages.bucket_size": + return v.GetServing().FieldIsZero("limits.uplink_messages.bucket_size") + case "mode.serving.limits.uplink_messages.reload_rate": + return v.GetServing().FieldIsZero("limits.uplink_messages.reload_rate") + case "mode.serving.limits.overall": + return v.GetServing().FieldIsZero("limits.overall") + case "mode.serving.limits.overall.bucket_size": + return v.GetServing().FieldIsZero("limits.overall.bucket_size") + case "mode.serving.limits.overall.reload_rate": + return v.GetServing().FieldIsZero("limits.overall.reload_rate") + } + panic(fmt.Sprintf("unknown path '%s'", p)) +} + // FieldIsZero returns whether path p is zero. func (v *EndDeviceAuthenticationCode) FieldIsZero(p string) bool { if v == nil { @@ -315,6 +531,154 @@ func (v *MACSettings) FieldIsZero(p string) bool { return v.PingSlotPeriodicity == nil case "ping_slot_periodicity.value": return v.PingSlotPeriodicity.FieldIsZero("value") + case "relay": + return v.Relay == nil + case "relay.mode": + return v.Relay.FieldIsZero("mode") + case "relay.mode.served": + return v.Relay.FieldIsZero("mode.served") + case "relay.mode.served.backoff": + return v.Relay.FieldIsZero("mode.served.backoff") + case "relay.mode.served.mode": + return v.Relay.FieldIsZero("mode.served.mode") + case "relay.mode.served.mode.always": + return v.Relay.FieldIsZero("mode.served.mode.always") + case "relay.mode.served.mode.dynamic": + return v.Relay.FieldIsZero("mode.served.mode.dynamic") + case "relay.mode.served.mode.dynamic.smart_enable_level": + return v.Relay.FieldIsZero("mode.served.mode.dynamic.smart_enable_level") + case "relay.mode.served.mode.end_device_controlled": + return v.Relay.FieldIsZero("mode.served.mode.end_device_controlled") + case "relay.mode.served.second_channel": + return v.Relay.FieldIsZero("mode.served.second_channel") + case "relay.mode.served.second_channel.ack_offset": + return v.Relay.FieldIsZero("mode.served.second_channel.ack_offset") + case "relay.mode.served.second_channel.data_rate_index": + return v.Relay.FieldIsZero("mode.served.second_channel.data_rate_index") + case "relay.mode.served.second_channel.frequency": + return v.Relay.FieldIsZero("mode.served.second_channel.frequency") + case "relay.mode.served.default_channel_index": + return v.Relay.FieldIsZero("mode.served.default_channel_index") + case "relay.mode.served.serving_device_id": + return v.Relay.FieldIsZero("mode.served.serving_device_id") + case "relay.mode.serving": + return v.Relay.FieldIsZero("mode.serving") + case "relay.mode.serving.second_channel": + return v.Relay.FieldIsZero("mode.serving.second_channel") + case "relay.mode.serving.second_channel.ack_offset": + return v.Relay.FieldIsZero("mode.serving.second_channel.ack_offset") + case "relay.mode.serving.second_channel.data_rate_index": + return v.Relay.FieldIsZero("mode.serving.second_channel.data_rate_index") + case "relay.mode.serving.second_channel.frequency": + return v.Relay.FieldIsZero("mode.serving.second_channel.frequency") + case "relay.mode.serving.default_channel_index": + return v.Relay.FieldIsZero("mode.serving.default_channel_index") + case "relay.mode.serving.cad_periodicity": + return v.Relay.FieldIsZero("mode.serving.cad_periodicity") + case "relay.mode.serving.uplink_forwarding_rules": + return v.Relay.FieldIsZero("mode.serving.uplink_forwarding_rules") + case "relay.mode.serving.limits": + return v.Relay.FieldIsZero("mode.serving.limits") + case "relay.mode.serving.limits.reset_behavior": + return v.Relay.FieldIsZero("mode.serving.limits.reset_behavior") + case "relay.mode.serving.limits.join_requests": + return v.Relay.FieldIsZero("mode.serving.limits.join_requests") + case "relay.mode.serving.limits.join_requests.bucket_size": + return v.Relay.FieldIsZero("mode.serving.limits.join_requests.bucket_size") + case "relay.mode.serving.limits.join_requests.reload_rate": + return v.Relay.FieldIsZero("mode.serving.limits.join_requests.reload_rate") + case "relay.mode.serving.limits.notifications": + return v.Relay.FieldIsZero("mode.serving.limits.notifications") + case "relay.mode.serving.limits.notifications.bucket_size": + return v.Relay.FieldIsZero("mode.serving.limits.notifications.bucket_size") + case "relay.mode.serving.limits.notifications.reload_rate": + return v.Relay.FieldIsZero("mode.serving.limits.notifications.reload_rate") + case "relay.mode.serving.limits.uplink_messages": + return v.Relay.FieldIsZero("mode.serving.limits.uplink_messages") + case "relay.mode.serving.limits.uplink_messages.bucket_size": + return v.Relay.FieldIsZero("mode.serving.limits.uplink_messages.bucket_size") + case "relay.mode.serving.limits.uplink_messages.reload_rate": + return v.Relay.FieldIsZero("mode.serving.limits.uplink_messages.reload_rate") + case "relay.mode.serving.limits.overall": + return v.Relay.FieldIsZero("mode.serving.limits.overall") + case "relay.mode.serving.limits.overall.bucket_size": + return v.Relay.FieldIsZero("mode.serving.limits.overall.bucket_size") + case "relay.mode.serving.limits.overall.reload_rate": + return v.Relay.FieldIsZero("mode.serving.limits.overall.reload_rate") + case "desired_relay": + return v.DesiredRelay == nil + case "desired_relay.mode": + return v.DesiredRelay.FieldIsZero("mode") + case "desired_relay.mode.served": + return v.DesiredRelay.FieldIsZero("mode.served") + case "desired_relay.mode.served.backoff": + return v.DesiredRelay.FieldIsZero("mode.served.backoff") + case "desired_relay.mode.served.mode": + return v.DesiredRelay.FieldIsZero("mode.served.mode") + case "desired_relay.mode.served.mode.always": + return v.DesiredRelay.FieldIsZero("mode.served.mode.always") + case "desired_relay.mode.served.mode.dynamic": + return v.DesiredRelay.FieldIsZero("mode.served.mode.dynamic") + case "desired_relay.mode.served.mode.dynamic.smart_enable_level": + return v.DesiredRelay.FieldIsZero("mode.served.mode.dynamic.smart_enable_level") + case "desired_relay.mode.served.mode.end_device_controlled": + return v.DesiredRelay.FieldIsZero("mode.served.mode.end_device_controlled") + case "desired_relay.mode.served.second_channel": + return v.DesiredRelay.FieldIsZero("mode.served.second_channel") + case "desired_relay.mode.served.second_channel.ack_offset": + return v.DesiredRelay.FieldIsZero("mode.served.second_channel.ack_offset") + case "desired_relay.mode.served.second_channel.data_rate_index": + return v.DesiredRelay.FieldIsZero("mode.served.second_channel.data_rate_index") + case "desired_relay.mode.served.second_channel.frequency": + return v.DesiredRelay.FieldIsZero("mode.served.second_channel.frequency") + case "desired_relay.mode.served.default_channel_index": + return v.DesiredRelay.FieldIsZero("mode.served.default_channel_index") + case "desired_relay.mode.served.serving_device_id": + return v.DesiredRelay.FieldIsZero("mode.served.serving_device_id") + case "desired_relay.mode.serving": + return v.DesiredRelay.FieldIsZero("mode.serving") + case "desired_relay.mode.serving.second_channel": + return v.DesiredRelay.FieldIsZero("mode.serving.second_channel") + case "desired_relay.mode.serving.second_channel.ack_offset": + return v.DesiredRelay.FieldIsZero("mode.serving.second_channel.ack_offset") + case "desired_relay.mode.serving.second_channel.data_rate_index": + return v.DesiredRelay.FieldIsZero("mode.serving.second_channel.data_rate_index") + case "desired_relay.mode.serving.second_channel.frequency": + return v.DesiredRelay.FieldIsZero("mode.serving.second_channel.frequency") + case "desired_relay.mode.serving.default_channel_index": + return v.DesiredRelay.FieldIsZero("mode.serving.default_channel_index") + case "desired_relay.mode.serving.cad_periodicity": + return v.DesiredRelay.FieldIsZero("mode.serving.cad_periodicity") + case "desired_relay.mode.serving.uplink_forwarding_rules": + return v.DesiredRelay.FieldIsZero("mode.serving.uplink_forwarding_rules") + case "desired_relay.mode.serving.limits": + return v.DesiredRelay.FieldIsZero("mode.serving.limits") + case "desired_relay.mode.serving.limits.reset_behavior": + return v.DesiredRelay.FieldIsZero("mode.serving.limits.reset_behavior") + case "desired_relay.mode.serving.limits.join_requests": + return v.DesiredRelay.FieldIsZero("mode.serving.limits.join_requests") + case "desired_relay.mode.serving.limits.join_requests.bucket_size": + return v.DesiredRelay.FieldIsZero("mode.serving.limits.join_requests.bucket_size") + case "desired_relay.mode.serving.limits.join_requests.reload_rate": + return v.DesiredRelay.FieldIsZero("mode.serving.limits.join_requests.reload_rate") + case "desired_relay.mode.serving.limits.notifications": + return v.DesiredRelay.FieldIsZero("mode.serving.limits.notifications") + case "desired_relay.mode.serving.limits.notifications.bucket_size": + return v.DesiredRelay.FieldIsZero("mode.serving.limits.notifications.bucket_size") + case "desired_relay.mode.serving.limits.notifications.reload_rate": + return v.DesiredRelay.FieldIsZero("mode.serving.limits.notifications.reload_rate") + case "desired_relay.mode.serving.limits.uplink_messages": + return v.DesiredRelay.FieldIsZero("mode.serving.limits.uplink_messages") + case "desired_relay.mode.serving.limits.uplink_messages.bucket_size": + return v.DesiredRelay.FieldIsZero("mode.serving.limits.uplink_messages.bucket_size") + case "desired_relay.mode.serving.limits.uplink_messages.reload_rate": + return v.DesiredRelay.FieldIsZero("mode.serving.limits.uplink_messages.reload_rate") + case "desired_relay.mode.serving.limits.overall": + return v.DesiredRelay.FieldIsZero("mode.serving.limits.overall") + case "desired_relay.mode.serving.limits.overall.bucket_size": + return v.DesiredRelay.FieldIsZero("mode.serving.limits.overall.bucket_size") + case "desired_relay.mode.serving.limits.overall.reload_rate": + return v.DesiredRelay.FieldIsZero("mode.serving.limits.overall.reload_rate") case "resets_f_cnt": return v.ResetsFCnt == nil case "resets_f_cnt.value": @@ -411,6 +775,80 @@ func (v *MACParameters) FieldIsZero(p string) bool { return v.RejoinCountPeriodicity == 0 case "rejoin_time_periodicity": return v.RejoinTimePeriodicity == 0 + case "relay": + return v.Relay == nil + case "relay.mode": + return v.Relay.FieldIsZero("mode") + case "relay.mode.served": + return v.Relay.FieldIsZero("mode.served") + case "relay.mode.served.backoff": + return v.Relay.FieldIsZero("mode.served.backoff") + case "relay.mode.served.mode": + return v.Relay.FieldIsZero("mode.served.mode") + case "relay.mode.served.mode.always": + return v.Relay.FieldIsZero("mode.served.mode.always") + case "relay.mode.served.mode.dynamic": + return v.Relay.FieldIsZero("mode.served.mode.dynamic") + case "relay.mode.served.mode.dynamic.smart_enable_level": + return v.Relay.FieldIsZero("mode.served.mode.dynamic.smart_enable_level") + case "relay.mode.served.mode.end_device_controlled": + return v.Relay.FieldIsZero("mode.served.mode.end_device_controlled") + case "relay.mode.served.second_channel": + return v.Relay.FieldIsZero("mode.served.second_channel") + case "relay.mode.served.second_channel.ack_offset": + return v.Relay.FieldIsZero("mode.served.second_channel.ack_offset") + case "relay.mode.served.second_channel.data_rate_index": + return v.Relay.FieldIsZero("mode.served.second_channel.data_rate_index") + case "relay.mode.served.second_channel.frequency": + return v.Relay.FieldIsZero("mode.served.second_channel.frequency") + case "relay.mode.served.default_channel_index": + return v.Relay.FieldIsZero("mode.served.default_channel_index") + case "relay.mode.served.serving_device_id": + return v.Relay.FieldIsZero("mode.served.serving_device_id") + case "relay.mode.serving": + return v.Relay.FieldIsZero("mode.serving") + case "relay.mode.serving.second_channel": + return v.Relay.FieldIsZero("mode.serving.second_channel") + case "relay.mode.serving.second_channel.ack_offset": + return v.Relay.FieldIsZero("mode.serving.second_channel.ack_offset") + case "relay.mode.serving.second_channel.data_rate_index": + return v.Relay.FieldIsZero("mode.serving.second_channel.data_rate_index") + case "relay.mode.serving.second_channel.frequency": + return v.Relay.FieldIsZero("mode.serving.second_channel.frequency") + case "relay.mode.serving.default_channel_index": + return v.Relay.FieldIsZero("mode.serving.default_channel_index") + case "relay.mode.serving.cad_periodicity": + return v.Relay.FieldIsZero("mode.serving.cad_periodicity") + case "relay.mode.serving.uplink_forwarding_rules": + return v.Relay.FieldIsZero("mode.serving.uplink_forwarding_rules") + case "relay.mode.serving.limits": + return v.Relay.FieldIsZero("mode.serving.limits") + case "relay.mode.serving.limits.reset_behavior": + return v.Relay.FieldIsZero("mode.serving.limits.reset_behavior") + case "relay.mode.serving.limits.join_requests": + return v.Relay.FieldIsZero("mode.serving.limits.join_requests") + case "relay.mode.serving.limits.join_requests.bucket_size": + return v.Relay.FieldIsZero("mode.serving.limits.join_requests.bucket_size") + case "relay.mode.serving.limits.join_requests.reload_rate": + return v.Relay.FieldIsZero("mode.serving.limits.join_requests.reload_rate") + case "relay.mode.serving.limits.notifications": + return v.Relay.FieldIsZero("mode.serving.limits.notifications") + case "relay.mode.serving.limits.notifications.bucket_size": + return v.Relay.FieldIsZero("mode.serving.limits.notifications.bucket_size") + case "relay.mode.serving.limits.notifications.reload_rate": + return v.Relay.FieldIsZero("mode.serving.limits.notifications.reload_rate") + case "relay.mode.serving.limits.uplink_messages": + return v.Relay.FieldIsZero("mode.serving.limits.uplink_messages") + case "relay.mode.serving.limits.uplink_messages.bucket_size": + return v.Relay.FieldIsZero("mode.serving.limits.uplink_messages.bucket_size") + case "relay.mode.serving.limits.uplink_messages.reload_rate": + return v.Relay.FieldIsZero("mode.serving.limits.uplink_messages.reload_rate") + case "relay.mode.serving.limits.overall": + return v.Relay.FieldIsZero("mode.serving.limits.overall") + case "relay.mode.serving.limits.overall.bucket_size": + return v.Relay.FieldIsZero("mode.serving.limits.overall.bucket_size") + case "relay.mode.serving.limits.overall.reload_rate": + return v.Relay.FieldIsZero("mode.serving.limits.overall.reload_rate") case "rx1_data_rate_offset": return v.Rx1DataRateOffset == 0 case "rx1_delay": @@ -579,6 +1017,80 @@ func (v *MACState) FieldIsZero(p string) bool { return v.CurrentParameters.FieldIsZero("rejoin_count_periodicity") case "current_parameters.rejoin_time_periodicity": return v.CurrentParameters.FieldIsZero("rejoin_time_periodicity") + case "current_parameters.relay": + return v.CurrentParameters.FieldIsZero("relay") + case "current_parameters.relay.mode": + return v.CurrentParameters.FieldIsZero("relay.mode") + case "current_parameters.relay.mode.served": + return v.CurrentParameters.FieldIsZero("relay.mode.served") + case "current_parameters.relay.mode.served.backoff": + return v.CurrentParameters.FieldIsZero("relay.mode.served.backoff") + case "current_parameters.relay.mode.served.mode": + return v.CurrentParameters.FieldIsZero("relay.mode.served.mode") + case "current_parameters.relay.mode.served.mode.always": + return v.CurrentParameters.FieldIsZero("relay.mode.served.mode.always") + case "current_parameters.relay.mode.served.mode.dynamic": + return v.CurrentParameters.FieldIsZero("relay.mode.served.mode.dynamic") + case "current_parameters.relay.mode.served.mode.dynamic.smart_enable_level": + return v.CurrentParameters.FieldIsZero("relay.mode.served.mode.dynamic.smart_enable_level") + case "current_parameters.relay.mode.served.mode.end_device_controlled": + return v.CurrentParameters.FieldIsZero("relay.mode.served.mode.end_device_controlled") + case "current_parameters.relay.mode.served.second_channel": + return v.CurrentParameters.FieldIsZero("relay.mode.served.second_channel") + case "current_parameters.relay.mode.served.second_channel.ack_offset": + return v.CurrentParameters.FieldIsZero("relay.mode.served.second_channel.ack_offset") + case "current_parameters.relay.mode.served.second_channel.data_rate_index": + return v.CurrentParameters.FieldIsZero("relay.mode.served.second_channel.data_rate_index") + case "current_parameters.relay.mode.served.second_channel.frequency": + return v.CurrentParameters.FieldIsZero("relay.mode.served.second_channel.frequency") + case "current_parameters.relay.mode.served.default_channel_index": + return v.CurrentParameters.FieldIsZero("relay.mode.served.default_channel_index") + case "current_parameters.relay.mode.served.serving_device_id": + return v.CurrentParameters.FieldIsZero("relay.mode.served.serving_device_id") + case "current_parameters.relay.mode.serving": + return v.CurrentParameters.FieldIsZero("relay.mode.serving") + case "current_parameters.relay.mode.serving.second_channel": + return v.CurrentParameters.FieldIsZero("relay.mode.serving.second_channel") + case "current_parameters.relay.mode.serving.second_channel.ack_offset": + return v.CurrentParameters.FieldIsZero("relay.mode.serving.second_channel.ack_offset") + case "current_parameters.relay.mode.serving.second_channel.data_rate_index": + return v.CurrentParameters.FieldIsZero("relay.mode.serving.second_channel.data_rate_index") + case "current_parameters.relay.mode.serving.second_channel.frequency": + return v.CurrentParameters.FieldIsZero("relay.mode.serving.second_channel.frequency") + case "current_parameters.relay.mode.serving.default_channel_index": + return v.CurrentParameters.FieldIsZero("relay.mode.serving.default_channel_index") + case "current_parameters.relay.mode.serving.cad_periodicity": + return v.CurrentParameters.FieldIsZero("relay.mode.serving.cad_periodicity") + case "current_parameters.relay.mode.serving.uplink_forwarding_rules": + return v.CurrentParameters.FieldIsZero("relay.mode.serving.uplink_forwarding_rules") + case "current_parameters.relay.mode.serving.limits": + return v.CurrentParameters.FieldIsZero("relay.mode.serving.limits") + case "current_parameters.relay.mode.serving.limits.reset_behavior": + return v.CurrentParameters.FieldIsZero("relay.mode.serving.limits.reset_behavior") + case "current_parameters.relay.mode.serving.limits.join_requests": + return v.CurrentParameters.FieldIsZero("relay.mode.serving.limits.join_requests") + case "current_parameters.relay.mode.serving.limits.join_requests.bucket_size": + return v.CurrentParameters.FieldIsZero("relay.mode.serving.limits.join_requests.bucket_size") + case "current_parameters.relay.mode.serving.limits.join_requests.reload_rate": + return v.CurrentParameters.FieldIsZero("relay.mode.serving.limits.join_requests.reload_rate") + case "current_parameters.relay.mode.serving.limits.notifications": + return v.CurrentParameters.FieldIsZero("relay.mode.serving.limits.notifications") + case "current_parameters.relay.mode.serving.limits.notifications.bucket_size": + return v.CurrentParameters.FieldIsZero("relay.mode.serving.limits.notifications.bucket_size") + case "current_parameters.relay.mode.serving.limits.notifications.reload_rate": + return v.CurrentParameters.FieldIsZero("relay.mode.serving.limits.notifications.reload_rate") + case "current_parameters.relay.mode.serving.limits.uplink_messages": + return v.CurrentParameters.FieldIsZero("relay.mode.serving.limits.uplink_messages") + case "current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size": + return v.CurrentParameters.FieldIsZero("relay.mode.serving.limits.uplink_messages.bucket_size") + case "current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate": + return v.CurrentParameters.FieldIsZero("relay.mode.serving.limits.uplink_messages.reload_rate") + case "current_parameters.relay.mode.serving.limits.overall": + return v.CurrentParameters.FieldIsZero("relay.mode.serving.limits.overall") + case "current_parameters.relay.mode.serving.limits.overall.bucket_size": + return v.CurrentParameters.FieldIsZero("relay.mode.serving.limits.overall.bucket_size") + case "current_parameters.relay.mode.serving.limits.overall.reload_rate": + return v.CurrentParameters.FieldIsZero("relay.mode.serving.limits.overall.reload_rate") case "current_parameters.rx1_data_rate_offset": return v.CurrentParameters.FieldIsZero("rx1_data_rate_offset") case "current_parameters.rx1_delay": @@ -635,6 +1147,80 @@ func (v *MACState) FieldIsZero(p string) bool { return v.DesiredParameters.FieldIsZero("rejoin_count_periodicity") case "desired_parameters.rejoin_time_periodicity": return v.DesiredParameters.FieldIsZero("rejoin_time_periodicity") + case "desired_parameters.relay": + return v.DesiredParameters.FieldIsZero("relay") + case "desired_parameters.relay.mode": + return v.DesiredParameters.FieldIsZero("relay.mode") + case "desired_parameters.relay.mode.served": + return v.DesiredParameters.FieldIsZero("relay.mode.served") + case "desired_parameters.relay.mode.served.backoff": + return v.DesiredParameters.FieldIsZero("relay.mode.served.backoff") + case "desired_parameters.relay.mode.served.mode": + return v.DesiredParameters.FieldIsZero("relay.mode.served.mode") + case "desired_parameters.relay.mode.served.mode.always": + return v.DesiredParameters.FieldIsZero("relay.mode.served.mode.always") + case "desired_parameters.relay.mode.served.mode.dynamic": + return v.DesiredParameters.FieldIsZero("relay.mode.served.mode.dynamic") + case "desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level": + return v.DesiredParameters.FieldIsZero("relay.mode.served.mode.dynamic.smart_enable_level") + case "desired_parameters.relay.mode.served.mode.end_device_controlled": + return v.DesiredParameters.FieldIsZero("relay.mode.served.mode.end_device_controlled") + case "desired_parameters.relay.mode.served.second_channel": + return v.DesiredParameters.FieldIsZero("relay.mode.served.second_channel") + case "desired_parameters.relay.mode.served.second_channel.ack_offset": + return v.DesiredParameters.FieldIsZero("relay.mode.served.second_channel.ack_offset") + case "desired_parameters.relay.mode.served.second_channel.data_rate_index": + return v.DesiredParameters.FieldIsZero("relay.mode.served.second_channel.data_rate_index") + case "desired_parameters.relay.mode.served.second_channel.frequency": + return v.DesiredParameters.FieldIsZero("relay.mode.served.second_channel.frequency") + case "desired_parameters.relay.mode.served.default_channel_index": + return v.DesiredParameters.FieldIsZero("relay.mode.served.default_channel_index") + case "desired_parameters.relay.mode.served.serving_device_id": + return v.DesiredParameters.FieldIsZero("relay.mode.served.serving_device_id") + case "desired_parameters.relay.mode.serving": + return v.DesiredParameters.FieldIsZero("relay.mode.serving") + case "desired_parameters.relay.mode.serving.second_channel": + return v.DesiredParameters.FieldIsZero("relay.mode.serving.second_channel") + case "desired_parameters.relay.mode.serving.second_channel.ack_offset": + return v.DesiredParameters.FieldIsZero("relay.mode.serving.second_channel.ack_offset") + case "desired_parameters.relay.mode.serving.second_channel.data_rate_index": + return v.DesiredParameters.FieldIsZero("relay.mode.serving.second_channel.data_rate_index") + case "desired_parameters.relay.mode.serving.second_channel.frequency": + return v.DesiredParameters.FieldIsZero("relay.mode.serving.second_channel.frequency") + case "desired_parameters.relay.mode.serving.default_channel_index": + return v.DesiredParameters.FieldIsZero("relay.mode.serving.default_channel_index") + case "desired_parameters.relay.mode.serving.cad_periodicity": + return v.DesiredParameters.FieldIsZero("relay.mode.serving.cad_periodicity") + case "desired_parameters.relay.mode.serving.uplink_forwarding_rules": + return v.DesiredParameters.FieldIsZero("relay.mode.serving.uplink_forwarding_rules") + case "desired_parameters.relay.mode.serving.limits": + return v.DesiredParameters.FieldIsZero("relay.mode.serving.limits") + case "desired_parameters.relay.mode.serving.limits.reset_behavior": + return v.DesiredParameters.FieldIsZero("relay.mode.serving.limits.reset_behavior") + case "desired_parameters.relay.mode.serving.limits.join_requests": + return v.DesiredParameters.FieldIsZero("relay.mode.serving.limits.join_requests") + case "desired_parameters.relay.mode.serving.limits.join_requests.bucket_size": + return v.DesiredParameters.FieldIsZero("relay.mode.serving.limits.join_requests.bucket_size") + case "desired_parameters.relay.mode.serving.limits.join_requests.reload_rate": + return v.DesiredParameters.FieldIsZero("relay.mode.serving.limits.join_requests.reload_rate") + case "desired_parameters.relay.mode.serving.limits.notifications": + return v.DesiredParameters.FieldIsZero("relay.mode.serving.limits.notifications") + case "desired_parameters.relay.mode.serving.limits.notifications.bucket_size": + return v.DesiredParameters.FieldIsZero("relay.mode.serving.limits.notifications.bucket_size") + case "desired_parameters.relay.mode.serving.limits.notifications.reload_rate": + return v.DesiredParameters.FieldIsZero("relay.mode.serving.limits.notifications.reload_rate") + case "desired_parameters.relay.mode.serving.limits.uplink_messages": + return v.DesiredParameters.FieldIsZero("relay.mode.serving.limits.uplink_messages") + case "desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size": + return v.DesiredParameters.FieldIsZero("relay.mode.serving.limits.uplink_messages.bucket_size") + case "desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate": + return v.DesiredParameters.FieldIsZero("relay.mode.serving.limits.uplink_messages.reload_rate") + case "desired_parameters.relay.mode.serving.limits.overall": + return v.DesiredParameters.FieldIsZero("relay.mode.serving.limits.overall") + case "desired_parameters.relay.mode.serving.limits.overall.bucket_size": + return v.DesiredParameters.FieldIsZero("relay.mode.serving.limits.overall.bucket_size") + case "desired_parameters.relay.mode.serving.limits.overall.reload_rate": + return v.DesiredParameters.FieldIsZero("relay.mode.serving.limits.overall.reload_rate") case "desired_parameters.rx1_data_rate_offset": return v.DesiredParameters.FieldIsZero("rx1_data_rate_offset") case "desired_parameters.rx1_delay": @@ -815,6 +1401,10 @@ func (v *MACState) FieldIsZero(p string) bool { return v.PendingJoinRequest.FieldIsZero("rx_delay") case "pending_join_request.selected_mac_version": return v.PendingJoinRequest.FieldIsZero("selected_mac_version") + case "pending_relay_downlink": + return v.PendingRelayDownlink == nil + case "pending_relay_downlink.raw_payload": + return v.PendingRelayDownlink.FieldIsZero("raw_payload") case "pending_requests": return v.PendingRequests == nil case "ping_slot_periodicity": @@ -1199,6 +1789,150 @@ func (v *EndDevice) FieldIsZero(p string) bool { return v.MacSettings.FieldIsZero("ping_slot_periodicity") case "mac_settings.ping_slot_periodicity.value": return v.MacSettings.FieldIsZero("ping_slot_periodicity.value") + case "mac_settings.relay": + return v.MacSettings.FieldIsZero("relay") + case "mac_settings.relay.mode": + return v.MacSettings.FieldIsZero("relay.mode") + case "mac_settings.relay.mode.served": + return v.MacSettings.FieldIsZero("relay.mode.served") + case "mac_settings.relay.mode.served.backoff": + return v.MacSettings.FieldIsZero("relay.mode.served.backoff") + case "mac_settings.relay.mode.served.mode": + return v.MacSettings.FieldIsZero("relay.mode.served.mode") + case "mac_settings.relay.mode.served.mode.always": + return v.MacSettings.FieldIsZero("relay.mode.served.mode.always") + case "mac_settings.relay.mode.served.mode.dynamic": + return v.MacSettings.FieldIsZero("relay.mode.served.mode.dynamic") + case "mac_settings.relay.mode.served.mode.dynamic.smart_enable_level": + return v.MacSettings.FieldIsZero("relay.mode.served.mode.dynamic.smart_enable_level") + case "mac_settings.relay.mode.served.mode.end_device_controlled": + return v.MacSettings.FieldIsZero("relay.mode.served.mode.end_device_controlled") + case "mac_settings.relay.mode.served.second_channel": + return v.MacSettings.FieldIsZero("relay.mode.served.second_channel") + case "mac_settings.relay.mode.served.second_channel.ack_offset": + return v.MacSettings.FieldIsZero("relay.mode.served.second_channel.ack_offset") + case "mac_settings.relay.mode.served.second_channel.data_rate_index": + return v.MacSettings.FieldIsZero("relay.mode.served.second_channel.data_rate_index") + case "mac_settings.relay.mode.served.second_channel.frequency": + return v.MacSettings.FieldIsZero("relay.mode.served.second_channel.frequency") + case "mac_settings.relay.mode.served.serving_device_id": + return v.MacSettings.FieldIsZero("relay.mode.served.serving_device_id") + case "mac_settings.relay.mode.serving": + return v.MacSettings.FieldIsZero("relay.mode.serving") + case "mac_settings.relay.mode.serving.second_channel": + return v.MacSettings.FieldIsZero("relay.mode.serving.second_channel") + case "mac_settings.relay.mode.serving.second_channel.ack_offset": + return v.MacSettings.FieldIsZero("relay.mode.serving.second_channel.ack_offset") + case "mac_settings.relay.mode.serving.second_channel.data_rate_index": + return v.MacSettings.FieldIsZero("relay.mode.serving.second_channel.data_rate_index") + case "mac_settings.relay.mode.serving.second_channel.frequency": + return v.MacSettings.FieldIsZero("relay.mode.serving.second_channel.frequency") + case "mac_settings.relay.mode.serving.default_channel_index": + return v.MacSettings.FieldIsZero("relay.mode.serving.default_channel_index") + case "mac_settings.relay.mode.serving.cad_periodicity": + return v.MacSettings.FieldIsZero("relay.mode.serving.cad_periodicity") + case "mac_settings.relay.mode.serving.uplink_forwarding_rules": + return v.MacSettings.FieldIsZero("relay.mode.serving.uplink_forwarding_rules") + case "mac_settings.relay.mode.serving.limits": + return v.MacSettings.FieldIsZero("relay.mode.serving.limits") + case "mac_settings.relay.mode.serving.limits.reset_behavior": + return v.MacSettings.FieldIsZero("relay.mode.serving.limits.reset_behavior") + case "mac_settings.relay.mode.serving.limits.join_requests": + return v.MacSettings.FieldIsZero("relay.mode.serving.limits.join_requests") + case "mac_settings.relay.mode.serving.limits.join_requests.bucket_size": + return v.MacSettings.FieldIsZero("relay.mode.serving.limits.join_requests.bucket_size") + case "mac_settings.relay.mode.serving.limits.join_requests.reload_rate": + return v.MacSettings.FieldIsZero("relay.mode.serving.limits.join_requests.reload_rate") + case "mac_settings.relay.mode.serving.limits.notifications": + return v.MacSettings.FieldIsZero("relay.mode.serving.limits.notifications") + case "mac_settings.relay.mode.serving.limits.notifications.bucket_size": + return v.MacSettings.FieldIsZero("relay.mode.serving.limits.notifications.bucket_size") + case "mac_settings.relay.mode.serving.limits.notifications.reload_rate": + return v.MacSettings.FieldIsZero("relay.mode.serving.limits.notifications.reload_rate") + case "mac_settings.relay.mode.serving.limits.uplink_messages": + return v.MacSettings.FieldIsZero("relay.mode.serving.limits.uplink_messages") + case "mac_settings.relay.mode.serving.limits.uplink_messages.bucket_size": + return v.MacSettings.FieldIsZero("relay.mode.serving.limits.uplink_messages.bucket_size") + case "mac_settings.relay.mode.serving.limits.uplink_messages.reload_rate": + return v.MacSettings.FieldIsZero("relay.mode.serving.limits.uplink_messages.reload_rate") + case "mac_settings.relay.mode.serving.limits.overall": + return v.MacSettings.FieldIsZero("relay.mode.serving.limits.overall") + case "mac_settings.relay.mode.serving.limits.overall.bucket_size": + return v.MacSettings.FieldIsZero("relay.mode.serving.limits.overall.bucket_size") + case "mac_settings.relay.mode.serving.limits.overall.reload_rate": + return v.MacSettings.FieldIsZero("relay.mode.serving.limits.overall.reload_rate") + case "mac_settings.desired_relay": + return v.MacSettings.FieldIsZero("desired_relay") + case "mac_settings.desired_relay.mode": + return v.MacSettings.FieldIsZero("desired_relay.mode") + case "mac_settings.desired_relay.mode.served": + return v.MacSettings.FieldIsZero("desired_relay.mode.served") + case "mac_settings.desired_relay.mode.served.backoff": + return v.MacSettings.FieldIsZero("desired_relay.mode.served.backoff") + case "mac_settings.desired_relay.mode.served.mode": + return v.MacSettings.FieldIsZero("desired_relay.mode.served.mode") + case "mac_settings.desired_relay.mode.served.mode.always": + return v.MacSettings.FieldIsZero("desired_relay.mode.served.mode.always") + case "mac_settings.desired_relay.mode.served.mode.dynamic": + return v.MacSettings.FieldIsZero("desired_relay.mode.served.mode.dynamic") + case "mac_settings.desired_relay.mode.served.mode.dynamic.smart_enable_level": + return v.MacSettings.FieldIsZero("desired_relay.mode.served.mode.dynamic.smart_enable_level") + case "mac_settings.desired_relay.mode.served.mode.end_device_controlled": + return v.MacSettings.FieldIsZero("desired_relay.mode.served.mode.end_device_controlled") + case "mac_settings.desired_relay.mode.served.second_channel": + return v.MacSettings.FieldIsZero("desired_relay.mode.served.second_channel") + case "mac_settings.desired_relay.mode.served.second_channel.ack_offset": + return v.MacSettings.FieldIsZero("desired_relay.mode.served.second_channel.ack_offset") + case "mac_settings.desired_relay.mode.served.second_channel.data_rate_index": + return v.MacSettings.FieldIsZero("desired_relay.mode.served.second_channel.data_rate_index") + case "mac_settings.desired_relay.mode.served.second_channel.frequency": + return v.MacSettings.FieldIsZero("desired_relay.mode.served.second_channel.frequency") + case "mac_settings.desired_relay.mode.served.serving_device_id": + return v.MacSettings.FieldIsZero("desired_relay.mode.served.serving_device_id") + case "mac_settings.desired_relay.mode.serving": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving") + case "mac_settings.desired_relay.mode.serving.second_channel": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving.second_channel") + case "mac_settings.desired_relay.mode.serving.second_channel.ack_offset": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving.second_channel.ack_offset") + case "mac_settings.desired_relay.mode.serving.second_channel.data_rate_index": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving.second_channel.data_rate_index") + case "mac_settings.desired_relay.mode.serving.second_channel.frequency": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving.second_channel.frequency") + case "mac_settings.desired_relay.mode.serving.default_channel_index": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving.default_channel_index") + case "mac_settings.desired_relay.mode.serving.cad_periodicity": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving.cad_periodicity") + case "mac_settings.desired_relay.mode.serving.uplink_forwarding_rules": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving.uplink_forwarding_rules") + case "mac_settings.desired_relay.mode.serving.limits": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving.limits") + case "mac_settings.desired_relay.mode.serving.limits.reset_behavior": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving.limits.reset_behavior") + case "mac_settings.desired_relay.mode.serving.limits.join_requests": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving.limits.join_requests") + case "mac_settings.desired_relay.mode.serving.limits.join_requests.bucket_size": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving.limits.join_requests.bucket_size") + case "mac_settings.desired_relay.mode.serving.limits.join_requests.reload_rate": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving.limits.join_requests.reload_rate") + case "mac_settings.desired_relay.mode.serving.limits.notifications": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving.limits.notifications") + case "mac_settings.desired_relay.mode.serving.limits.notifications.bucket_size": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving.limits.notifications.bucket_size") + case "mac_settings.desired_relay.mode.serving.limits.notifications.reload_rate": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving.limits.notifications.reload_rate") + case "mac_settings.desired_relay.mode.serving.limits.uplink_messages": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving.limits.uplink_messages") + case "mac_settings.desired_relay.mode.serving.limits.uplink_messages.bucket_size": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving.limits.uplink_messages.bucket_size") + case "mac_settings.desired_relay.mode.serving.limits.uplink_messages.reload_rate": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving.limits.uplink_messages.reload_rate") + case "mac_settings.desired_relay.mode.serving.limits.overall": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving.limits.overall") + case "mac_settings.desired_relay.mode.serving.limits.overall.bucket_size": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving.limits.overall.bucket_size") + case "mac_settings.desired_relay.mode.serving.limits.overall.reload_rate": + return v.MacSettings.FieldIsZero("desired_relay.mode.serving.limits.overall.reload_rate") case "mac_settings.resets_f_cnt": return v.MacSettings.FieldIsZero("resets_f_cnt") case "mac_settings.resets_f_cnt.value": diff --git a/pkg/ttnpb/end_device.pb.go b/pkg/ttnpb/end_device.pb.go index ce9dffa44e..ac87e689e0 100644 --- a/pkg/ttnpb/end_device.pb.go +++ b/pkg/ttnpb/end_device.pb.go @@ -251,6 +251,300 @@ func (x *BoolValue) GetValue() bool { return false } +type ServingRelayParameters struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Second wake on radio channel configuration. + SecondChannel *RelaySecondChannel `protobuf:"bytes,1,opt,name=second_channel,json=secondChannel,proto3" json:"second_channel,omitempty"` + // Index of the default wake on radio channel. + DefaultChannelIndex uint32 `protobuf:"varint,2,opt,name=default_channel_index,json=defaultChannelIndex,proto3" json:"default_channel_index,omitempty"` + // Channel activity detection periodicity. + CadPeriodicity RelayCADPeriodicity `protobuf:"varint,3,opt,name=cad_periodicity,json=cadPeriodicity,proto3,enum=ttn.lorawan.v3.RelayCADPeriodicity" json:"cad_periodicity,omitempty"` + // Configured uplink forwarding rules. + UplinkForwardingRules []*ServingRelayParameters_UplinkForwardingRule `protobuf:"bytes,4,rep,name=uplink_forwarding_rules,json=uplinkForwardingRules,proto3" json:"uplink_forwarding_rules,omitempty"` + // Configured forwarding limits. + // If unset, the default value from Network Server configuration will be used. + Limits *ServingRelayParameters_ForwardingLimits `protobuf:"bytes,5,opt,name=limits,proto3" json:"limits,omitempty"` +} + +func (x *ServingRelayParameters) Reset() { + *x = ServingRelayParameters{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ServingRelayParameters) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServingRelayParameters) ProtoMessage() {} + +func (x *ServingRelayParameters) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ServingRelayParameters.ProtoReflect.Descriptor instead. +func (*ServingRelayParameters) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{2} +} + +func (x *ServingRelayParameters) GetSecondChannel() *RelaySecondChannel { + if x != nil { + return x.SecondChannel + } + return nil +} + +func (x *ServingRelayParameters) GetDefaultChannelIndex() uint32 { + if x != nil { + return x.DefaultChannelIndex + } + return 0 +} + +func (x *ServingRelayParameters) GetCadPeriodicity() RelayCADPeriodicity { + if x != nil { + return x.CadPeriodicity + } + return RelayCADPeriodicity_RELAY_CAD_PERIODICITY_1_SECOND +} + +func (x *ServingRelayParameters) GetUplinkForwardingRules() []*ServingRelayParameters_UplinkForwardingRule { + if x != nil { + return x.UplinkForwardingRules + } + return nil +} + +func (x *ServingRelayParameters) GetLimits() *ServingRelayParameters_ForwardingLimits { + if x != nil { + return x.Limits + } + return nil +} + +type ServedRelayParameters struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Mode: + // *ServedRelayParameters_Always + // *ServedRelayParameters_Dynamic + // *ServedRelayParameters_EndDeviceControlled + Mode isServedRelayParameters_Mode `protobuf_oneof:"mode"` + // Number of uplinks to be sent without a wake on radio frame. + Backoff uint32 `protobuf:"varint,4,opt,name=backoff,proto3" json:"backoff,omitempty"` + // Second wake on radio channel configuration. + SecondChannel *RelaySecondChannel `protobuf:"bytes,5,opt,name=second_channel,json=secondChannel,proto3" json:"second_channel,omitempty"` + // End device identifier of the serving end device. + ServingDeviceId string `protobuf:"bytes,6,opt,name=serving_device_id,json=servingDeviceId,proto3" json:"serving_device_id,omitempty"` +} + +func (x *ServedRelayParameters) Reset() { + *x = ServedRelayParameters{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ServedRelayParameters) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServedRelayParameters) ProtoMessage() {} + +func (x *ServedRelayParameters) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ServedRelayParameters.ProtoReflect.Descriptor instead. +func (*ServedRelayParameters) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{3} +} + +func (m *ServedRelayParameters) GetMode() isServedRelayParameters_Mode { + if m != nil { + return m.Mode + } + return nil +} + +func (x *ServedRelayParameters) GetAlways() *RelayEndDeviceAlwaysMode { + if x, ok := x.GetMode().(*ServedRelayParameters_Always); ok { + return x.Always + } + return nil +} + +func (x *ServedRelayParameters) GetDynamic() *RelayEndDeviceDynamicMode { + if x, ok := x.GetMode().(*ServedRelayParameters_Dynamic); ok { + return x.Dynamic + } + return nil +} + +func (x *ServedRelayParameters) GetEndDeviceControlled() *RelayEndDeviceControlledMode { + if x, ok := x.GetMode().(*ServedRelayParameters_EndDeviceControlled); ok { + return x.EndDeviceControlled + } + return nil +} + +func (x *ServedRelayParameters) GetBackoff() uint32 { + if x != nil { + return x.Backoff + } + return 0 +} + +func (x *ServedRelayParameters) GetSecondChannel() *RelaySecondChannel { + if x != nil { + return x.SecondChannel + } + return nil +} + +func (x *ServedRelayParameters) GetServingDeviceId() string { + if x != nil { + return x.ServingDeviceId + } + return "" +} + +type isServedRelayParameters_Mode interface { + isServedRelayParameters_Mode() +} + +type ServedRelayParameters_Always struct { + // The end device will always attempt to use the relay mode in order to send uplink messages. + Always *RelayEndDeviceAlwaysMode `protobuf:"bytes,1,opt,name=always,proto3,oneof"` +} + +type ServedRelayParameters_Dynamic struct { + // The end device will attempt to use relay mode only after a number of uplink messages have been sent without + // receiving a valid a downlink message. + Dynamic *RelayEndDeviceDynamicMode `protobuf:"bytes,2,opt,name=dynamic,proto3,oneof"` +} + +type ServedRelayParameters_EndDeviceControlled struct { + // The end device will control when it uses the relay mode. This is the default mode. + EndDeviceControlled *RelayEndDeviceControlledMode `protobuf:"bytes,3,opt,name=end_device_controlled,json=endDeviceControlled,proto3,oneof"` +} + +func (*ServedRelayParameters_Always) isServedRelayParameters_Mode() {} + +func (*ServedRelayParameters_Dynamic) isServedRelayParameters_Mode() {} + +func (*ServedRelayParameters_EndDeviceControlled) isServedRelayParameters_Mode() {} + +// RelayParameters represent the parameters of a relay. +// This is used internally by the Network Server. +type RelayParameters struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Mode: + // *RelayParameters_Serving + // *RelayParameters_Served + Mode isRelayParameters_Mode `protobuf_oneof:"mode"` +} + +func (x *RelayParameters) Reset() { + *x = RelayParameters{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RelayParameters) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RelayParameters) ProtoMessage() {} + +func (x *RelayParameters) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RelayParameters.ProtoReflect.Descriptor instead. +func (*RelayParameters) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{4} +} + +func (m *RelayParameters) GetMode() isRelayParameters_Mode { + if m != nil { + return m.Mode + } + return nil +} + +func (x *RelayParameters) GetServing() *ServingRelayParameters { + if x, ok := x.GetMode().(*RelayParameters_Serving); ok { + return x.Serving + } + return nil +} + +func (x *RelayParameters) GetServed() *ServedRelayParameters { + if x, ok := x.GetMode().(*RelayParameters_Served); ok { + return x.Served + } + return nil +} + +type isRelayParameters_Mode interface { + isRelayParameters_Mode() +} + +type RelayParameters_Serving struct { + // Parameters related to a relay which is serving end devices. + Serving *ServingRelayParameters `protobuf:"bytes,25,opt,name=serving,proto3,oneof"` +} + +type RelayParameters_Served struct { + // Parameters related to an end device served by a relay. + Served *ServedRelayParameters `protobuf:"bytes,26,opt,name=served,proto3,oneof"` +} + +func (*RelayParameters_Serving) isRelayParameters_Mode() {} + +func (*RelayParameters_Served) isRelayParameters_Mode() {} + // MACParameters represent the parameters of the device's MAC layer (active or desired). // This is used internally by the Network Server. type MACParameters struct { @@ -302,10 +596,10 @@ type MACParameters struct { // Configured uplink channels and optionally Rx1 frequency. Channels []*MACParameters_Channel `protobuf:"bytes,19,rep,name=channels,proto3" json:"channels,omitempty"` // Whether uplink dwell time is set (400ms). - // If this field is not set, then the value is either unknown or irrelevant(Network Server cannot modify it). + // If unset, then the value is either unknown or irrelevant(Network Server cannot modify it). UplinkDwellTime *BoolValue `protobuf:"bytes,20,opt,name=uplink_dwell_time,json=uplinkDwellTime,proto3" json:"uplink_dwell_time,omitempty"` // Whether downlink dwell time is set (400ms). - // If this field is not set, then the value is either unknown or irrelevant(Network Server cannot modify it). + // If unset, then the value is either unknown or irrelevant(Network Server cannot modify it). DownlinkDwellTime *BoolValue `protobuf:"bytes,21,opt,name=downlink_dwell_time,json=downlinkDwellTime,proto3" json:"downlink_dwell_time,omitempty"` // ADR: number of messages to wait before setting ADRAckReq. AdrAckLimitExponent *ADRAckLimitExponentValue `protobuf:"bytes,22,opt,name=adr_ack_limit_exponent,json=adrAckLimitExponent,proto3" json:"adr_ack_limit_exponent,omitempty"` @@ -313,12 +607,14 @@ type MACParameters struct { AdrAckDelayExponent *ADRAckDelayExponentValue `protobuf:"bytes,23,opt,name=adr_ack_delay_exponent,json=adrAckDelayExponent,proto3" json:"adr_ack_delay_exponent,omitempty"` // Data rate index of the class B ping slot. PingSlotDataRateIndexValue *DataRateIndexValue `protobuf:"bytes,24,opt,name=ping_slot_data_rate_index_value,json=pingSlotDataRateIndexValue,proto3" json:"ping_slot_data_rate_index_value,omitempty"` + // Relay parameters. + Relay *RelayParameters `protobuf:"bytes,25,opt,name=relay,proto3" json:"relay,omitempty"` } func (x *MACParameters) Reset() { *x = MACParameters{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[2] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -331,7 +627,7 @@ func (x *MACParameters) String() string { func (*MACParameters) ProtoMessage() {} func (x *MACParameters) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[2] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -344,7 +640,7 @@ func (x *MACParameters) ProtoReflect() protoreflect.Message { // Deprecated: Use MACParameters.ProtoReflect.Descriptor instead. func (*MACParameters) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{2} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{5} } func (x *MACParameters) GetMaxEirp() float32 { @@ -504,6 +800,13 @@ func (x *MACParameters) GetPingSlotDataRateIndexValue() *DataRateIndexValue { return nil } +func (x *MACParameters) GetRelay() *RelayParameters { + if x != nil { + return x.Relay + } + return nil +} + // Template for creating end devices. type EndDeviceVersion struct { state protoimpl.MessageState @@ -541,7 +844,7 @@ type EndDeviceVersion struct { func (x *EndDeviceVersion) Reset() { *x = EndDeviceVersion{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[3] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -554,7 +857,7 @@ func (x *EndDeviceVersion) String() string { func (*EndDeviceVersion) ProtoMessage() {} func (x *EndDeviceVersion) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[3] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -567,7 +870,7 @@ func (x *EndDeviceVersion) ProtoReflect() protoreflect.Message { // Deprecated: Use EndDeviceVersion.ProtoReflect.Descriptor instead. func (*EndDeviceVersion) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{3} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{6} } func (x *EndDeviceVersion) GetIds() *EndDeviceVersionIdentifiers { @@ -677,7 +980,7 @@ type ADRSettings struct { func (x *ADRSettings) Reset() { *x = ADRSettings{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[4] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -690,7 +993,7 @@ func (x *ADRSettings) String() string { func (*ADRSettings) ProtoMessage() {} func (x *ADRSettings) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[4] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -703,7 +1006,7 @@ func (x *ADRSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use ADRSettings.ProtoReflect.Descriptor instead. func (*ADRSettings) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{4} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{7} } func (m *ADRSettings) GetMode() isADRSettings_Mode { @@ -867,12 +1170,18 @@ type MACSettings struct { // This option can be used in order to disable any downlink interaction with the end device. It will affect all types // of downlink messages: data and MAC downlinks, and join accepts. ScheduleDownlinks *BoolValue `protobuf:"bytes,35,opt,name=schedule_downlinks,json=scheduleDownlinks,proto3" json:"schedule_downlinks,omitempty"` + // The relay parameters the end device is using. + // If unset, the default value from Network Server configuration or regional parameters specification will be used. + Relay *RelayParameters `protobuf:"bytes,36,opt,name=relay,proto3" json:"relay,omitempty"` + // The relay parameters the Network Server should configure device to use via MAC commands. + // If unset, the default value from Network Server configuration or regional parameters specification will be used. + DesiredRelay *RelayParameters `protobuf:"bytes,37,opt,name=desired_relay,json=desiredRelay,proto3" json:"desired_relay,omitempty"` } func (x *MACSettings) Reset() { *x = MACSettings{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[5] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -885,7 +1194,7 @@ func (x *MACSettings) String() string { func (*MACSettings) ProtoMessage() {} func (x *MACSettings) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[5] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -898,7 +1207,7 @@ func (x *MACSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use MACSettings.ProtoReflect.Descriptor instead. func (*MACSettings) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{5} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{8} } func (x *MACSettings) GetClassBTimeout() *durationpb.Duration { @@ -1141,6 +1450,20 @@ func (x *MACSettings) GetScheduleDownlinks() *BoolValue { return nil } +func (x *MACSettings) GetRelay() *RelayParameters { + if x != nil { + return x.Relay + } + return nil +} + +func (x *MACSettings) GetDesiredRelay() *RelayParameters { + if x != nil { + return x.DesiredRelay + } + return nil +} + // MACState represents the state of MAC layer of the device. // MACState is reset on each join for OTAA or ResetInd for ABP devices. // This is used internally by the Network Server. @@ -1211,12 +1534,16 @@ type MACState struct { // The Network Server may choose to store only certain types of MAC // command identifiers in the underlying implementation. RecentMacCommandIdentifiers []MACCommandIdentifier `protobuf:"varint,23,rep,packed,name=recent_mac_command_identifiers,json=recentMacCommandIdentifiers,proto3,enum=ttn.lorawan.v3.MACCommandIdentifier" json:"recent_mac_command_identifiers,omitempty"` + // Pending relay downlink contents. + // The pending downlink will be scheduled to the relay in either Rx1 or Rx2. + // The pending downlink will be cleared after the scheduling attempt. + PendingRelayDownlink *RelayForwardDownlinkReq `protobuf:"bytes,24,opt,name=pending_relay_downlink,json=pendingRelayDownlink,proto3" json:"pending_relay_downlink,omitempty"` } func (x *MACState) Reset() { *x = MACState{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[6] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1229,7 +1556,7 @@ func (x *MACState) String() string { func (*MACState) ProtoMessage() {} func (x *MACState) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[6] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1242,7 +1569,7 @@ func (x *MACState) ProtoReflect() protoreflect.Message { // Deprecated: Use MACState.ProtoReflect.Descriptor instead. func (*MACState) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{6} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{9} } func (x *MACState) GetCurrentParameters() *MACParameters { @@ -1406,6 +1733,13 @@ func (x *MACState) GetRecentMacCommandIdentifiers() []MACCommandIdentifier { return nil } +func (x *MACState) GetPendingRelayDownlink() *RelayForwardDownlinkReq { + if x != nil { + return x.PendingRelayDownlink + } + return nil +} + // Authentication code for end devices. type EndDeviceAuthenticationCode struct { state protoimpl.MessageState @@ -1420,7 +1754,7 @@ type EndDeviceAuthenticationCode struct { func (x *EndDeviceAuthenticationCode) Reset() { *x = EndDeviceAuthenticationCode{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[7] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1433,7 +1767,7 @@ func (x *EndDeviceAuthenticationCode) String() string { func (*EndDeviceAuthenticationCode) ProtoMessage() {} func (x *EndDeviceAuthenticationCode) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[7] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1446,7 +1780,7 @@ func (x *EndDeviceAuthenticationCode) ProtoReflect() protoreflect.Message { // Deprecated: Use EndDeviceAuthenticationCode.ProtoReflect.Descriptor instead. func (*EndDeviceAuthenticationCode) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{7} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{10} } func (x *EndDeviceAuthenticationCode) GetValue() string { @@ -1639,7 +1973,7 @@ type EndDevice struct { func (x *EndDevice) Reset() { *x = EndDevice{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[8] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1652,7 +1986,7 @@ func (x *EndDevice) String() string { func (*EndDevice) ProtoMessage() {} func (x *EndDevice) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[8] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1665,7 +1999,7 @@ func (x *EndDevice) ProtoReflect() protoreflect.Message { // Deprecated: Use EndDevice.ProtoReflect.Descriptor instead. func (*EndDevice) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{8} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{11} } func (x *EndDevice) GetIds() *EndDeviceIdentifiers { @@ -2050,7 +2384,7 @@ type EndDevices struct { func (x *EndDevices) Reset() { *x = EndDevices{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[9] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2063,7 +2397,7 @@ func (x *EndDevices) String() string { func (*EndDevices) ProtoMessage() {} func (x *EndDevices) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[9] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2076,7 +2410,7 @@ func (x *EndDevices) ProtoReflect() protoreflect.Message { // Deprecated: Use EndDevices.ProtoReflect.Descriptor instead. func (*EndDevices) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{9} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{12} } func (x *EndDevices) GetEndDevices() []*EndDevice { @@ -2100,7 +2434,7 @@ type DevAddrPrefix struct { func (x *DevAddrPrefix) Reset() { *x = DevAddrPrefix{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[10] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2113,7 +2447,7 @@ func (x *DevAddrPrefix) String() string { func (*DevAddrPrefix) ProtoMessage() {} func (x *DevAddrPrefix) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[10] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2126,7 +2460,7 @@ func (x *DevAddrPrefix) ProtoReflect() protoreflect.Message { // Deprecated: Use DevAddrPrefix.ProtoReflect.Descriptor instead. func (*DevAddrPrefix) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{10} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{13} } func (x *DevAddrPrefix) GetDevAddr() []byte { @@ -2154,7 +2488,7 @@ type CreateEndDeviceRequest struct { func (x *CreateEndDeviceRequest) Reset() { *x = CreateEndDeviceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[11] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2167,7 +2501,7 @@ func (x *CreateEndDeviceRequest) String() string { func (*CreateEndDeviceRequest) ProtoMessage() {} func (x *CreateEndDeviceRequest) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[11] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2180,7 +2514,7 @@ func (x *CreateEndDeviceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateEndDeviceRequest.ProtoReflect.Descriptor instead. func (*CreateEndDeviceRequest) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{11} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{14} } func (x *CreateEndDeviceRequest) GetEndDevice() *EndDevice { @@ -2204,7 +2538,7 @@ type UpdateEndDeviceRequest struct { func (x *UpdateEndDeviceRequest) Reset() { *x = UpdateEndDeviceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[12] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2217,7 +2551,7 @@ func (x *UpdateEndDeviceRequest) String() string { func (*UpdateEndDeviceRequest) ProtoMessage() {} func (x *UpdateEndDeviceRequest) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[12] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2230,7 +2564,7 @@ func (x *UpdateEndDeviceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateEndDeviceRequest.ProtoReflect.Descriptor instead. func (*UpdateEndDeviceRequest) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{12} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{15} } func (x *UpdateEndDeviceRequest) GetEndDevice() *EndDevice { @@ -2259,7 +2593,7 @@ type BatchUpdateEndDeviceLastSeenRequest struct { func (x *BatchUpdateEndDeviceLastSeenRequest) Reset() { *x = BatchUpdateEndDeviceLastSeenRequest{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[13] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2272,7 +2606,7 @@ func (x *BatchUpdateEndDeviceLastSeenRequest) String() string { func (*BatchUpdateEndDeviceLastSeenRequest) ProtoMessage() {} func (x *BatchUpdateEndDeviceLastSeenRequest) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[13] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2285,7 +2619,7 @@ func (x *BatchUpdateEndDeviceLastSeenRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use BatchUpdateEndDeviceLastSeenRequest.ProtoReflect.Descriptor instead. func (*BatchUpdateEndDeviceLastSeenRequest) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{13} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{16} } func (x *BatchUpdateEndDeviceLastSeenRequest) GetUpdates() []*BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate { @@ -2309,7 +2643,7 @@ type GetEndDeviceRequest struct { func (x *GetEndDeviceRequest) Reset() { *x = GetEndDeviceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[14] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2322,7 +2656,7 @@ func (x *GetEndDeviceRequest) String() string { func (*GetEndDeviceRequest) ProtoMessage() {} func (x *GetEndDeviceRequest) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[14] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2335,7 +2669,7 @@ func (x *GetEndDeviceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEndDeviceRequest.ProtoReflect.Descriptor instead. func (*GetEndDeviceRequest) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{14} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{17} } func (x *GetEndDeviceRequest) GetEndDeviceIds() *EndDeviceIdentifiers { @@ -2364,7 +2698,7 @@ type GetEndDeviceIdentifiersForEUIsRequest struct { func (x *GetEndDeviceIdentifiersForEUIsRequest) Reset() { *x = GetEndDeviceIdentifiersForEUIsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[15] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2377,7 +2711,7 @@ func (x *GetEndDeviceIdentifiersForEUIsRequest) String() string { func (*GetEndDeviceIdentifiersForEUIsRequest) ProtoMessage() {} func (x *GetEndDeviceIdentifiersForEUIsRequest) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[15] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2390,7 +2724,7 @@ func (x *GetEndDeviceIdentifiersForEUIsRequest) ProtoReflect() protoreflect.Mess // Deprecated: Use GetEndDeviceIdentifiersForEUIsRequest.ProtoReflect.Descriptor instead. func (*GetEndDeviceIdentifiersForEUIsRequest) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{15} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{18} } func (x *GetEndDeviceIdentifiersForEUIsRequest) GetJoinEui() []byte { @@ -2428,7 +2762,7 @@ type ListEndDevicesRequest struct { func (x *ListEndDevicesRequest) Reset() { *x = ListEndDevicesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[16] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2441,7 +2775,7 @@ func (x *ListEndDevicesRequest) String() string { func (*ListEndDevicesRequest) ProtoMessage() {} func (x *ListEndDevicesRequest) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[16] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2454,7 +2788,7 @@ func (x *ListEndDevicesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListEndDevicesRequest.ProtoReflect.Descriptor instead. func (*ListEndDevicesRequest) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{16} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{19} } func (x *ListEndDevicesRequest) GetApplicationIds() *ApplicationIdentifiers { @@ -2506,7 +2840,7 @@ type SetEndDeviceRequest struct { func (x *SetEndDeviceRequest) Reset() { *x = SetEndDeviceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[17] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2519,7 +2853,7 @@ func (x *SetEndDeviceRequest) String() string { func (*SetEndDeviceRequest) ProtoMessage() {} func (x *SetEndDeviceRequest) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[17] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2532,7 +2866,7 @@ func (x *SetEndDeviceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetEndDeviceRequest.ProtoReflect.Descriptor instead. func (*SetEndDeviceRequest) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{17} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{20} } func (x *SetEndDeviceRequest) GetEndDevice() *EndDevice { @@ -2563,7 +2897,7 @@ type ResetAndGetEndDeviceRequest struct { func (x *ResetAndGetEndDeviceRequest) Reset() { *x = ResetAndGetEndDeviceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[18] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2576,7 +2910,7 @@ func (x *ResetAndGetEndDeviceRequest) String() string { func (*ResetAndGetEndDeviceRequest) ProtoMessage() {} func (x *ResetAndGetEndDeviceRequest) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[18] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2589,7 +2923,7 @@ func (x *ResetAndGetEndDeviceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ResetAndGetEndDeviceRequest.ProtoReflect.Descriptor instead. func (*ResetAndGetEndDeviceRequest) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{18} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{21} } func (x *ResetAndGetEndDeviceRequest) GetEndDeviceIds() *EndDeviceIdentifiers { @@ -2619,7 +2953,7 @@ type EndDeviceTemplate struct { func (x *EndDeviceTemplate) Reset() { *x = EndDeviceTemplate{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[19] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2632,7 +2966,7 @@ func (x *EndDeviceTemplate) String() string { func (*EndDeviceTemplate) ProtoMessage() {} func (x *EndDeviceTemplate) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[19] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2645,7 +2979,7 @@ func (x *EndDeviceTemplate) ProtoReflect() protoreflect.Message { // Deprecated: Use EndDeviceTemplate.ProtoReflect.Descriptor instead. func (*EndDeviceTemplate) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{19} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{22} } func (x *EndDeviceTemplate) GetEndDevice() *EndDevice { @@ -2682,7 +3016,7 @@ type EndDeviceTemplateFormat struct { func (x *EndDeviceTemplateFormat) Reset() { *x = EndDeviceTemplateFormat{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[20] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2695,7 +3029,7 @@ func (x *EndDeviceTemplateFormat) String() string { func (*EndDeviceTemplateFormat) ProtoMessage() {} func (x *EndDeviceTemplateFormat) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[20] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2708,7 +3042,7 @@ func (x *EndDeviceTemplateFormat) ProtoReflect() protoreflect.Message { // Deprecated: Use EndDeviceTemplateFormat.ProtoReflect.Descriptor instead. func (*EndDeviceTemplateFormat) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{20} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{23} } func (x *EndDeviceTemplateFormat) GetName() string { @@ -2743,7 +3077,7 @@ type EndDeviceTemplateFormats struct { func (x *EndDeviceTemplateFormats) Reset() { *x = EndDeviceTemplateFormats{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[21] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2756,7 +3090,7 @@ func (x *EndDeviceTemplateFormats) String() string { func (*EndDeviceTemplateFormats) ProtoMessage() {} func (x *EndDeviceTemplateFormats) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[21] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2769,7 +3103,7 @@ func (x *EndDeviceTemplateFormats) ProtoReflect() protoreflect.Message { // Deprecated: Use EndDeviceTemplateFormats.ProtoReflect.Descriptor instead. func (*EndDeviceTemplateFormats) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{21} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{24} } func (x *EndDeviceTemplateFormats) GetFormats() map[string]*EndDeviceTemplateFormat { @@ -2795,7 +3129,7 @@ type ConvertEndDeviceTemplateRequest struct { func (x *ConvertEndDeviceTemplateRequest) Reset() { *x = ConvertEndDeviceTemplateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[22] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2808,7 +3142,7 @@ func (x *ConvertEndDeviceTemplateRequest) String() string { func (*ConvertEndDeviceTemplateRequest) ProtoMessage() {} func (x *ConvertEndDeviceTemplateRequest) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[22] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2821,7 +3155,7 @@ func (x *ConvertEndDeviceTemplateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ConvertEndDeviceTemplateRequest.ProtoReflect.Descriptor instead. func (*ConvertEndDeviceTemplateRequest) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{22} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{25} } func (x *ConvertEndDeviceTemplateRequest) GetFormatId() string { @@ -2857,7 +3191,7 @@ type BatchDeleteEndDevicesRequest struct { func (x *BatchDeleteEndDevicesRequest) Reset() { *x = BatchDeleteEndDevicesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[23] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2870,7 +3204,7 @@ func (x *BatchDeleteEndDevicesRequest) String() string { func (*BatchDeleteEndDevicesRequest) ProtoMessage() {} func (x *BatchDeleteEndDevicesRequest) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[23] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2883,7 +3217,7 @@ func (x *BatchDeleteEndDevicesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BatchDeleteEndDevicesRequest.ProtoReflect.Descriptor instead. func (*BatchDeleteEndDevicesRequest) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{23} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{26} } func (x *BatchDeleteEndDevicesRequest) GetApplicationIds() *ApplicationIdentifiers { @@ -2916,7 +3250,7 @@ type BatchGetEndDevicesRequest struct { func (x *BatchGetEndDevicesRequest) Reset() { *x = BatchGetEndDevicesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[24] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2929,7 +3263,7 @@ func (x *BatchGetEndDevicesRequest) String() string { func (*BatchGetEndDevicesRequest) ProtoMessage() {} func (x *BatchGetEndDevicesRequest) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[24] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2942,7 +3276,7 @@ func (x *BatchGetEndDevicesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BatchGetEndDevicesRequest.ProtoReflect.Descriptor instead. func (*BatchGetEndDevicesRequest) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{24} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{27} } func (x *BatchGetEndDevicesRequest) GetApplicationIds() *ApplicationIdentifiers { @@ -2966,6 +3300,172 @@ func (x *BatchGetEndDevicesRequest) GetFieldMask() *fieldmaskpb.FieldMask { return nil } +type ServingRelayParameters_UplinkForwardingRule struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Bucket configuration for the served end device. + // If unset, no individual limits will apply to the end device, but the relay global limitations will apply. + Limits *RelayUplinkForwardLimits `protobuf:"bytes,1,opt,name=limits,proto3" json:"limits,omitempty"` + // Last wake on radio frame counter used by the served end device. + LastWFCnt uint32 `protobuf:"varint,2,opt,name=last_w_f_cnt,json=lastWFCnt,proto3" json:"last_w_f_cnt,omitempty"` + // End device identifier of the served end device. + DeviceId string `protobuf:"bytes,3,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` + // Session key ID of the session keys used to derive the root relay session key. + SessionKeyId []byte `protobuf:"bytes,4,opt,name=session_key_id,json=sessionKeyId,proto3" json:"session_key_id,omitempty"` +} + +func (x *ServingRelayParameters_UplinkForwardingRule) Reset() { + *x = ServingRelayParameters_UplinkForwardingRule{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ServingRelayParameters_UplinkForwardingRule) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServingRelayParameters_UplinkForwardingRule) ProtoMessage() {} + +func (x *ServingRelayParameters_UplinkForwardingRule) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ServingRelayParameters_UplinkForwardingRule.ProtoReflect.Descriptor instead. +func (*ServingRelayParameters_UplinkForwardingRule) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{2, 0} +} + +func (x *ServingRelayParameters_UplinkForwardingRule) GetLimits() *RelayUplinkForwardLimits { + if x != nil { + return x.Limits + } + return nil +} + +func (x *ServingRelayParameters_UplinkForwardingRule) GetLastWFCnt() uint32 { + if x != nil { + return x.LastWFCnt + } + return 0 +} + +func (x *ServingRelayParameters_UplinkForwardingRule) GetDeviceId() string { + if x != nil { + return x.DeviceId + } + return "" +} + +func (x *ServingRelayParameters_UplinkForwardingRule) GetSessionKeyId() []byte { + if x != nil { + return x.SessionKeyId + } + return nil +} + +type ServingRelayParameters_ForwardingLimits struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Reset behavior of the buckets upon limit update. + ResetBehavior RelayResetLimitCounter `protobuf:"varint,1,opt,name=reset_behavior,json=resetBehavior,proto3,enum=ttn.lorawan.v3.RelayResetLimitCounter" json:"reset_behavior,omitempty"` + // Bucket configuration for join requests. + // If unset, no individual limits will apply to join requests, but the relay overall limitations will apply. + JoinRequests *RelayForwardLimits `protobuf:"bytes,2,opt,name=join_requests,json=joinRequests,proto3" json:"join_requests,omitempty"` + // Bucket configuration for unknown device notifications. + // If unset, no individual limits will apply to unknown end device notifications, but the relay overall + // limitations will still apply. + Notifications *RelayForwardLimits `protobuf:"bytes,3,opt,name=notifications,proto3" json:"notifications,omitempty"` + // Bucket configuration for uplink messages across all served end devices. + // If unset, no individual limits will apply to uplink messages across all served end devices, but the relay + // overall limitations will still apply. + UplinkMessages *RelayForwardLimits `protobuf:"bytes,4,opt,name=uplink_messages,json=uplinkMessages,proto3" json:"uplink_messages,omitempty"` + // Bucket configuration for all relay messages. + // If unset, no overall limits will apply to the relay, but individual limitations will still apply. + Overall *RelayForwardLimits `protobuf:"bytes,5,opt,name=overall,proto3" json:"overall,omitempty"` +} + +func (x *ServingRelayParameters_ForwardingLimits) Reset() { + *x = ServingRelayParameters_ForwardingLimits{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ServingRelayParameters_ForwardingLimits) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServingRelayParameters_ForwardingLimits) ProtoMessage() {} + +func (x *ServingRelayParameters_ForwardingLimits) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ServingRelayParameters_ForwardingLimits.ProtoReflect.Descriptor instead. +func (*ServingRelayParameters_ForwardingLimits) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{2, 1} +} + +func (x *ServingRelayParameters_ForwardingLimits) GetResetBehavior() RelayResetLimitCounter { + if x != nil { + return x.ResetBehavior + } + return RelayResetLimitCounter_RELAY_RESET_LIMIT_COUNTER_ZERO +} + +func (x *ServingRelayParameters_ForwardingLimits) GetJoinRequests() *RelayForwardLimits { + if x != nil { + return x.JoinRequests + } + return nil +} + +func (x *ServingRelayParameters_ForwardingLimits) GetNotifications() *RelayForwardLimits { + if x != nil { + return x.Notifications + } + return nil +} + +func (x *ServingRelayParameters_ForwardingLimits) GetUplinkMessages() *RelayForwardLimits { + if x != nil { + return x.UplinkMessages + } + return nil +} + +func (x *ServingRelayParameters_ForwardingLimits) GetOverall() *RelayForwardLimits { + if x != nil { + return x.Overall + } + return nil +} + type MACParameters_Channel struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2986,7 +3486,7 @@ type MACParameters_Channel struct { func (x *MACParameters_Channel) Reset() { *x = MACParameters_Channel{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[25] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2999,7 +3499,7 @@ func (x *MACParameters_Channel) String() string { func (*MACParameters_Channel) ProtoMessage() {} func (x *MACParameters_Channel) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[25] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3012,7 +3512,7 @@ func (x *MACParameters_Channel) ProtoReflect() protoreflect.Message { // Deprecated: Use MACParameters_Channel.ProtoReflect.Descriptor instead. func (*MACParameters_Channel) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{2, 0} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{5, 0} } func (x *MACParameters_Channel) GetUplinkFrequency() uint64 { @@ -3067,7 +3567,7 @@ type ADRSettings_StaticMode struct { func (x *ADRSettings_StaticMode) Reset() { *x = ADRSettings_StaticMode{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[26] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3080,7 +3580,7 @@ func (x *ADRSettings_StaticMode) String() string { func (*ADRSettings_StaticMode) ProtoMessage() {} func (x *ADRSettings_StaticMode) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[26] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3093,7 +3593,7 @@ func (x *ADRSettings_StaticMode) ProtoReflect() protoreflect.Message { // Deprecated: Use ADRSettings_StaticMode.ProtoReflect.Descriptor instead. func (*ADRSettings_StaticMode) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{4, 0} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{7, 0} } func (x *ADRSettings_StaticMode) GetDataRateIndex() DataRateIndex { @@ -3151,7 +3651,7 @@ type ADRSettings_DynamicMode struct { func (x *ADRSettings_DynamicMode) Reset() { *x = ADRSettings_DynamicMode{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[27] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3164,7 +3664,7 @@ func (x *ADRSettings_DynamicMode) String() string { func (*ADRSettings_DynamicMode) ProtoMessage() {} func (x *ADRSettings_DynamicMode) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[27] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3177,7 +3677,7 @@ func (x *ADRSettings_DynamicMode) ProtoReflect() protoreflect.Message { // Deprecated: Use ADRSettings_DynamicMode.ProtoReflect.Descriptor instead. func (*ADRSettings_DynamicMode) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{4, 1} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{7, 1} } func (x *ADRSettings_DynamicMode) GetMargin() *wrapperspb.FloatValue { @@ -3247,7 +3747,7 @@ type ADRSettings_DisabledMode struct { func (x *ADRSettings_DisabledMode) Reset() { *x = ADRSettings_DisabledMode{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[28] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3260,7 +3760,7 @@ func (x *ADRSettings_DisabledMode) String() string { func (*ADRSettings_DisabledMode) ProtoMessage() {} func (x *ADRSettings_DisabledMode) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[28] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3273,7 +3773,7 @@ func (x *ADRSettings_DisabledMode) ProtoReflect() protoreflect.Message { // Deprecated: Use ADRSettings_DisabledMode.ProtoReflect.Descriptor instead. func (*ADRSettings_DisabledMode) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{4, 2} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{7, 2} } // EXPERIMENTAL: Channel steering settings. @@ -3291,7 +3791,7 @@ type ADRSettings_DynamicMode_ChannelSteeringSettings struct { func (x *ADRSettings_DynamicMode_ChannelSteeringSettings) Reset() { *x = ADRSettings_DynamicMode_ChannelSteeringSettings{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[29] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3304,7 +3804,7 @@ func (x *ADRSettings_DynamicMode_ChannelSteeringSettings) String() string { func (*ADRSettings_DynamicMode_ChannelSteeringSettings) ProtoMessage() {} func (x *ADRSettings_DynamicMode_ChannelSteeringSettings) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[29] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3317,7 +3817,7 @@ func (x *ADRSettings_DynamicMode_ChannelSteeringSettings) ProtoReflect() protore // Deprecated: Use ADRSettings_DynamicMode_ChannelSteeringSettings.ProtoReflect.Descriptor instead. func (*ADRSettings_DynamicMode_ChannelSteeringSettings) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{4, 1, 0} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{7, 1, 0} } func (m *ADRSettings_DynamicMode_ChannelSteeringSettings) GetMode() isADRSettings_DynamicMode_ChannelSteeringSettings_Mode { @@ -3371,7 +3871,7 @@ type ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode struct { func (x *ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode) Reset() { *x = ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[30] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3384,7 +3884,7 @@ func (x *ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode) String( func (*ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode) ProtoMessage() {} func (x *ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[30] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3397,7 +3897,7 @@ func (x *ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode) ProtoRe // Deprecated: Use ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode.ProtoReflect.Descriptor instead. func (*ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{4, 1, 0, 0} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{7, 1, 0, 0} } // Configuration options for cases in which ADR is not supposed to steer the end device @@ -3411,7 +3911,7 @@ type ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode struct { func (x *ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode) Reset() { *x = ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[31] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3424,7 +3924,7 @@ func (x *ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode) String() func (*ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode) ProtoMessage() {} func (x *ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[31] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3437,7 +3937,7 @@ func (x *ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode) ProtoRefl // Deprecated: Use ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode.ProtoReflect.Descriptor instead. func (*ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{4, 1, 0, 1} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{7, 1, 0, 1} } type MACState_JoinRequest struct { @@ -3453,7 +3953,7 @@ type MACState_JoinRequest struct { func (x *MACState_JoinRequest) Reset() { *x = MACState_JoinRequest{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[32] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3466,7 +3966,7 @@ func (x *MACState_JoinRequest) String() string { func (*MACState_JoinRequest) ProtoMessage() {} func (x *MACState_JoinRequest) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[32] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3479,7 +3979,7 @@ func (x *MACState_JoinRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MACState_JoinRequest.ProtoReflect.Descriptor instead. func (*MACState_JoinRequest) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{6, 0} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{9, 0} } func (x *MACState_JoinRequest) GetDownlinkSettings() *DLSettings { @@ -3521,7 +4021,7 @@ type MACState_JoinAccept struct { func (x *MACState_JoinAccept) Reset() { *x = MACState_JoinAccept{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[33] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3534,7 +4034,7 @@ func (x *MACState_JoinAccept) String() string { func (*MACState_JoinAccept) ProtoMessage() {} func (x *MACState_JoinAccept) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[33] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3547,7 +4047,7 @@ func (x *MACState_JoinAccept) ProtoReflect() protoreflect.Message { // Deprecated: Use MACState_JoinAccept.ProtoReflect.Descriptor instead. func (*MACState_JoinAccept) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{6, 1} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{9, 1} } func (x *MACState_JoinAccept) GetPayload() []byte { @@ -3610,7 +4110,7 @@ type MACState_UplinkMessage struct { func (x *MACState_UplinkMessage) Reset() { *x = MACState_UplinkMessage{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[34] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3623,7 +4123,7 @@ func (x *MACState_UplinkMessage) String() string { func (*MACState_UplinkMessage) ProtoMessage() {} func (x *MACState_UplinkMessage) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[34] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3636,7 +4136,7 @@ func (x *MACState_UplinkMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use MACState_UplinkMessage.ProtoReflect.Descriptor instead. func (*MACState_UplinkMessage) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{6, 2} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{9, 2} } func (x *MACState_UplinkMessage) GetPayload() *Message { @@ -3695,7 +4195,7 @@ type MACState_DownlinkMessage struct { func (x *MACState_DownlinkMessage) Reset() { *x = MACState_DownlinkMessage{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[35] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3708,7 +4208,7 @@ func (x *MACState_DownlinkMessage) String() string { func (*MACState_DownlinkMessage) ProtoMessage() {} func (x *MACState_DownlinkMessage) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[35] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3721,7 +4221,7 @@ func (x *MACState_DownlinkMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use MACState_DownlinkMessage.ProtoReflect.Descriptor instead. func (*MACState_DownlinkMessage) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{6, 3} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{9, 3} } func (x *MACState_DownlinkMessage) GetPayload() *MACState_DownlinkMessage_Message { @@ -3750,7 +4250,7 @@ type MACState_DataRateRange struct { func (x *MACState_DataRateRange) Reset() { *x = MACState_DataRateRange{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[36] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3763,7 +4263,7 @@ func (x *MACState_DataRateRange) String() string { func (*MACState_DataRateRange) ProtoMessage() {} func (x *MACState_DataRateRange) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[36] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3776,7 +4276,7 @@ func (x *MACState_DataRateRange) ProtoReflect() protoreflect.Message { // Deprecated: Use MACState_DataRateRange.ProtoReflect.Descriptor instead. func (*MACState_DataRateRange) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{6, 4} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{9, 4} } func (x *MACState_DataRateRange) GetMinDataRateIndex() DataRateIndex { @@ -3804,7 +4304,7 @@ type MACState_DataRateRanges struct { func (x *MACState_DataRateRanges) Reset() { *x = MACState_DataRateRanges{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[37] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3817,7 +4317,7 @@ func (x *MACState_DataRateRanges) String() string { func (*MACState_DataRateRanges) ProtoMessage() {} func (x *MACState_DataRateRanges) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[37] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3830,7 +4330,7 @@ func (x *MACState_DataRateRanges) ProtoReflect() protoreflect.Message { // Deprecated: Use MACState_DataRateRanges.ProtoReflect.Descriptor instead. func (*MACState_DataRateRanges) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{6, 5} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{9, 5} } func (x *MACState_DataRateRanges) GetRanges() []*MACState_DataRateRange { @@ -3851,7 +4351,7 @@ type MACState_UplinkMessage_TxSettings struct { func (x *MACState_UplinkMessage_TxSettings) Reset() { *x = MACState_UplinkMessage_TxSettings{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[39] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3864,7 +4364,7 @@ func (x *MACState_UplinkMessage_TxSettings) String() string { func (*MACState_UplinkMessage_TxSettings) ProtoMessage() {} func (x *MACState_UplinkMessage_TxSettings) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[39] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3877,7 +4377,7 @@ func (x *MACState_UplinkMessage_TxSettings) ProtoReflect() protoreflect.Message // Deprecated: Use MACState_UplinkMessage_TxSettings.ProtoReflect.Descriptor instead. func (*MACState_UplinkMessage_TxSettings) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{6, 2, 0} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{9, 2, 0} } func (x *MACState_UplinkMessage_TxSettings) GetDataRate() *DataRate { @@ -3898,12 +4398,13 @@ type MACState_UplinkMessage_RxMetadata struct { DownlinkPathConstraint DownlinkPathConstraint `protobuf:"varint,14,opt,name=downlink_path_constraint,json=downlinkPathConstraint,proto3,enum=ttn.lorawan.v3.DownlinkPathConstraint" json:"downlink_path_constraint,omitempty"` UplinkToken []byte `protobuf:"bytes,15,opt,name=uplink_token,json=uplinkToken,proto3" json:"uplink_token,omitempty"` PacketBroker *MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata `protobuf:"bytes,18,opt,name=packet_broker,json=packetBroker,proto3" json:"packet_broker,omitempty"` + Relay *MACState_UplinkMessage_RxMetadata_RelayMetadata `protobuf:"bytes,23,opt,name=relay,proto3" json:"relay,omitempty"` } func (x *MACState_UplinkMessage_RxMetadata) Reset() { *x = MACState_UplinkMessage_RxMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[40] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3916,7 +4417,7 @@ func (x *MACState_UplinkMessage_RxMetadata) String() string { func (*MACState_UplinkMessage_RxMetadata) ProtoMessage() {} func (x *MACState_UplinkMessage_RxMetadata) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[40] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3929,7 +4430,7 @@ func (x *MACState_UplinkMessage_RxMetadata) ProtoReflect() protoreflect.Message // Deprecated: Use MACState_UplinkMessage_RxMetadata.ProtoReflect.Descriptor instead. func (*MACState_UplinkMessage_RxMetadata) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{6, 2, 1} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{9, 2, 1} } func (x *MACState_UplinkMessage_RxMetadata) GetGatewayIds() *GatewayIdentifiers { @@ -3974,6 +4475,13 @@ func (x *MACState_UplinkMessage_RxMetadata) GetPacketBroker() *MACState_UplinkMe return nil } +func (x *MACState_UplinkMessage_RxMetadata) GetRelay() *MACState_UplinkMessage_RxMetadata_RelayMetadata { + if x != nil { + return x.Relay + } + return nil +} + type MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3983,7 +4491,7 @@ type MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata struct { func (x *MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata) Reset() { *x = MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[41] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3996,7 +4504,7 @@ func (x *MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata) String() string func (*MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata) ProtoMessage() {} func (x *MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[41] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4009,10 +4517,48 @@ func (x *MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata) ProtoReflect() // Deprecated: Use MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata.ProtoReflect.Descriptor instead. func (*MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{6, 2, 1, 0} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{9, 2, 1, 0} } -type MACState_DownlinkMessage_Message struct { +type MACState_UplinkMessage_RxMetadata_RelayMetadata struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *MACState_UplinkMessage_RxMetadata_RelayMetadata) Reset() { + *x = MACState_UplinkMessage_RxMetadata_RelayMetadata{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MACState_UplinkMessage_RxMetadata_RelayMetadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MACState_UplinkMessage_RxMetadata_RelayMetadata) ProtoMessage() {} + +func (x *MACState_UplinkMessage_RxMetadata_RelayMetadata) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[47] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MACState_UplinkMessage_RxMetadata_RelayMetadata.ProtoReflect.Descriptor instead. +func (*MACState_UplinkMessage_RxMetadata_RelayMetadata) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{9, 2, 1, 1} +} + +type MACState_DownlinkMessage_Message struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -4024,7 +4570,7 @@ type MACState_DownlinkMessage_Message struct { func (x *MACState_DownlinkMessage_Message) Reset() { *x = MACState_DownlinkMessage_Message{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[42] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4037,7 +4583,7 @@ func (x *MACState_DownlinkMessage_Message) String() string { func (*MACState_DownlinkMessage_Message) ProtoMessage() {} func (x *MACState_DownlinkMessage_Message) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[42] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4050,7 +4596,7 @@ func (x *MACState_DownlinkMessage_Message) ProtoReflect() protoreflect.Message { // Deprecated: Use MACState_DownlinkMessage_Message.ProtoReflect.Descriptor instead. func (*MACState_DownlinkMessage_Message) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{6, 3, 0} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{9, 3, 0} } func (x *MACState_DownlinkMessage_Message) GetMHdr() *MACState_DownlinkMessage_Message_MHDR { @@ -4078,7 +4624,7 @@ type MACState_DownlinkMessage_Message_MHDR struct { func (x *MACState_DownlinkMessage_Message_MHDR) Reset() { *x = MACState_DownlinkMessage_Message_MHDR{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[43] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4091,7 +4637,7 @@ func (x *MACState_DownlinkMessage_Message_MHDR) String() string { func (*MACState_DownlinkMessage_Message_MHDR) ProtoMessage() {} func (x *MACState_DownlinkMessage_Message_MHDR) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[43] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4104,7 +4650,7 @@ func (x *MACState_DownlinkMessage_Message_MHDR) ProtoReflect() protoreflect.Mess // Deprecated: Use MACState_DownlinkMessage_Message_MHDR.ProtoReflect.Descriptor instead. func (*MACState_DownlinkMessage_Message_MHDR) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{6, 3, 0, 0} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{9, 3, 0, 0} } func (x *MACState_DownlinkMessage_Message_MHDR) GetMType() MType { @@ -4126,7 +4672,7 @@ type MACState_DownlinkMessage_Message_MACPayload struct { func (x *MACState_DownlinkMessage_Message_MACPayload) Reset() { *x = MACState_DownlinkMessage_Message_MACPayload{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[44] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4139,7 +4685,7 @@ func (x *MACState_DownlinkMessage_Message_MACPayload) String() string { func (*MACState_DownlinkMessage_Message_MACPayload) ProtoMessage() {} func (x *MACState_DownlinkMessage_Message_MACPayload) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[44] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4152,7 +4698,7 @@ func (x *MACState_DownlinkMessage_Message_MACPayload) ProtoReflect() protoreflec // Deprecated: Use MACState_DownlinkMessage_Message_MACPayload.ProtoReflect.Descriptor instead. func (*MACState_DownlinkMessage_Message_MACPayload) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{6, 3, 0, 1} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{9, 3, 0, 1} } func (x *MACState_DownlinkMessage_Message_MACPayload) GetFPort() uint32 { @@ -4181,7 +4727,7 @@ type BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate struct { func (x *BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate) Reset() { *x = BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[47] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4194,7 +4740,7 @@ func (x *BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate) String() s func (*BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate) ProtoMessage() {} func (x *BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[47] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4207,7 +4753,7 @@ func (x *BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate) ProtoRefle // Deprecated: Use BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate.ProtoReflect.Descriptor instead. func (*BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{13, 0} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{16, 0} } func (x *BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate) GetIds() *EndDeviceIdentifiers { @@ -4314,1059 +4860,1046 @@ var file_ttn_lorawan_v3_end_device_proto_rawDesc = []byte{ 0x01, 0x10, 0x02, 0x22, 0x33, 0x0a, 0x09, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x10, 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0xf2, 0xaa, - 0x19, 0x06, 0x08, 0x01, 0x10, 0x01, 0x18, 0x01, 0x22, 0xc5, 0x0f, 0x0a, 0x0d, 0x4d, 0x41, 0x43, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, - 0x78, 0x5f, 0x65, 0x69, 0x72, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x6d, 0x61, - 0x78, 0x45, 0x69, 0x72, 0x70, 0x12, 0x56, 0x0a, 0x13, 0x61, 0x64, 0x72, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, - 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x10, 0x61, 0x64, 0x72, - 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x34, 0x0a, - 0x12, 0x61, 0x64, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, - 0x18, 0x0f, 0x52, 0x0f, 0x61, 0x64, 0x72, 0x54, 0x78, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x29, 0x0a, 0x0c, 0x61, 0x64, 0x72, 0x5f, 0x6e, 0x62, 0x5f, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, - 0x18, 0x0f, 0x52, 0x0a, 0x61, 0x64, 0x72, 0x4e, 0x62, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x12, 0x26, - 0x0a, 0x0d, 0x61, 0x64, 0x72, 0x5f, 0x61, 0x63, 0x6b, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x61, 0x64, 0x72, 0x41, 0x63, - 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x26, 0x0a, 0x0d, 0x61, 0x64, 0x72, 0x5f, 0x61, 0x63, - 0x6b, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x02, 0x18, - 0x01, 0x52, 0x0b, 0x61, 0x64, 0x72, 0x41, 0x63, 0x6b, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x3e, - 0x0a, 0x09, 0x72, 0x78, 0x31, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x52, 0x78, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, - 0x01, 0x02, 0x10, 0x01, 0x52, 0x08, 0x72, 0x78, 0x31, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x59, - 0x0a, 0x14, 0x72, 0x78, 0x31, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, - 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x74, + 0x19, 0x06, 0x08, 0x01, 0x10, 0x01, 0x18, 0x01, 0x22, 0xc0, 0x08, 0x0a, 0x16, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x12, 0x49, 0x0a, 0x0e, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x63, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, + 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, + 0x61, 0x79, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, + 0x0d, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x3c, + 0x0a, 0x15, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x08, 0xfa, + 0x42, 0x05, 0x2a, 0x03, 0x18, 0xff, 0x01, 0x52, 0x13, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x56, 0x0a, 0x0f, + 0x63, 0x61, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, + 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x41, 0x44, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, + 0x01, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x63, 0x61, 0x64, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, + 0x63, 0x69, 0x74, 0x79, 0x12, 0x7d, 0x0a, 0x17, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x66, + 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, + 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x6c, 0x61, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x55, 0x70, + 0x6c, 0x69, 0x6e, 0x6b, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x75, + 0x6c, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x10, 0x10, 0x52, 0x15, 0x75, 0x70, + 0x6c, 0x69, 0x6e, 0x6b, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6c, 0x61, + 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x46, 0x6f, 0x72, 0x77, + 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x06, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x73, 0x1a, 0xe8, 0x01, 0x0a, 0x14, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x46, + 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x40, 0x0a, + 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, + 0x65, 0x6c, 0x61, 0x79, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, + 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, + 0x1f, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x77, 0x5f, 0x66, 0x5f, 0x63, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x57, 0x46, 0x43, 0x6e, 0x74, + 0x12, 0x47, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x2a, 0xfa, 0x42, 0x27, 0x72, 0x25, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, + 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, + 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0xd0, 0x01, 0x01, 0x52, + 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x1a, + 0xff, 0x02, 0x0a, 0x10, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x65, + 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x74, + 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, + 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x74, 0x42, 0x65, 0x68, 0x61, 0x76, + 0x69, 0x6f, 0x72, 0x12, 0x47, 0x0a, 0x0d, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, + 0x79, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x0c, + 0x6a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x48, 0x0a, 0x0d, + 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, + 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x0d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4b, 0x0a, 0x0f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, + 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x73, 0x52, 0x0e, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x07, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, + 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x6f, 0x72, 0x77, 0x61, + 0x72, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x07, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x6c, + 0x6c, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0xe2, 0x03, 0x0a, 0x15, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x42, 0x0a, 0x06, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, + 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x48, + 0x00, 0x52, 0x06, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x12, 0x45, 0x0a, 0x07, 0x64, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, + 0x79, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, + 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x07, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, + 0x12, 0x62, 0x0a, 0x15, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2c, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, + 0x13, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x18, 0x3f, 0x52, 0x07, + 0x62, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x12, 0x49, 0x0a, 0x0e, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x52, 0x0d, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x12, 0x53, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xfa, + 0x42, 0x24, 0x72, 0x22, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, + 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, + 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x3a, 0x0a, 0xf2, 0xaa, 0x19, 0x06, 0x08, 0x01, 0x10, + 0x01, 0x20, 0x01, 0x42, 0x0b, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x03, 0xf8, 0x42, 0x01, + 0x22, 0xaf, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x12, 0x42, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, + 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, + 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x6c, 0x61, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, + 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x12, 0x3f, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x64, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, + 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x52, 0x65, 0x6c, 0x61, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x48, + 0x00, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x3a, 0x0a, 0xf2, 0xaa, 0x19, 0x06, 0x08, + 0x01, 0x10, 0x01, 0x20, 0x01, 0x42, 0x0b, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x03, 0xf8, + 0x42, 0x01, 0x22, 0xfc, 0x0f, 0x0a, 0x0d, 0x4d, 0x41, 0x43, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x69, 0x72, 0x70, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x45, 0x69, 0x72, 0x70, 0x12, + 0x56, 0x0a, 0x13, 0x61, 0x64, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x08, 0xfa, 0x42, - 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x11, 0x72, 0x78, 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x61, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x56, 0x0a, 0x13, 0x72, 0x78, 0x32, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x08, 0xfa, 0x42, 0x05, + 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x10, 0x61, 0x64, 0x72, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, + 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x34, 0x0a, 0x12, 0x61, 0x64, 0x72, 0x5f, 0x74, + 0x78, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x18, 0x0f, 0x52, 0x0f, 0x61, 0x64, + 0x72, 0x54, 0x78, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x29, 0x0a, + 0x0c, 0x61, 0x64, 0x72, 0x5f, 0x6e, 0x62, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x18, 0x0f, 0x52, 0x0a, 0x61, 0x64, + 0x72, 0x4e, 0x62, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0d, 0x61, 0x64, 0x72, 0x5f, + 0x61, 0x63, 0x6b, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x0b, 0x61, 0x64, 0x72, 0x41, 0x63, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x26, 0x0a, 0x0d, 0x61, 0x64, 0x72, 0x5f, 0x61, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x6c, 0x61, + 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x61, 0x64, 0x72, + 0x41, 0x63, 0x6b, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x78, 0x31, 0x5f, + 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x74, + 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x78, 0x44, + 0x65, 0x6c, 0x61, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x08, + 0x72, 0x78, 0x31, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x59, 0x0a, 0x14, 0x72, 0x78, 0x31, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, - 0x10, 0x72, 0x78, 0x32, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x12, 0x2e, 0x0a, 0x0d, 0x72, 0x78, 0x32, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x04, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x32, 0x04, 0x28, - 0xa0, 0x8d, 0x06, 0x52, 0x0c, 0x72, 0x78, 0x32, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x79, 0x12, 0x53, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x75, 0x74, 0x79, 0x5f, 0x63, 0x79, - 0x63, 0x6c, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, - 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, - 0x67, 0x61, 0x74, 0x65, 0x64, 0x44, 0x75, 0x74, 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x42, 0x08, - 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x44, 0x75, 0x74, - 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x12, 0x64, 0x0a, 0x17, 0x72, 0x65, 0x6a, 0x6f, 0x69, 0x6e, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, - 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, - 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x54, - 0x69, 0x6d, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, - 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x15, 0x72, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x69, 0x6d, - 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x12, 0x67, 0x0a, 0x18, - 0x72, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, + 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, + 0x52, 0x11, 0x72, 0x78, 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x4f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x12, 0x56, 0x0a, 0x13, 0x72, 0x78, 0x32, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, + 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x10, 0x72, 0x78, 0x32, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2e, 0x0a, 0x0d, 0x72, + 0x78, 0x32, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x04, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x32, 0x04, 0x28, 0xa0, 0x8d, 0x06, 0x52, 0x0c, 0x72, + 0x78, 0x32, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x53, 0x0a, 0x0e, 0x6d, + 0x61, 0x78, 0x5f, 0x64, 0x75, 0x74, 0x79, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x44, + 0x75, 0x74, 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, + 0x10, 0x01, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x44, 0x75, 0x74, 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, + 0x12, 0x64, 0x0a, 0x17, 0x72, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, + 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x45, 0x78, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, + 0x15, 0x72, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x12, 0x67, 0x0a, 0x18, 0x72, 0x65, 0x6a, 0x6f, 0x69, 0x6e, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, + 0x74, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, + 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x42, 0x08, 0xfa, + 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x16, 0x72, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x12, + 0x3b, 0x0a, 0x13, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x66, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x04, 0x42, 0x0b, 0xfa, 0x42, + 0x08, 0x32, 0x06, 0x18, 0x00, 0x28, 0xa0, 0x8d, 0x06, 0x52, 0x11, 0x70, 0x69, 0x6e, 0x67, 0x53, + 0x6c, 0x6f, 0x74, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x5b, 0x0a, 0x19, + 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, + 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x02, + 0x18, 0x01, 0x52, 0x15, 0x70, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x36, 0x0a, 0x10, 0x62, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x04, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x32, 0x06, 0x18, 0x00, 0x28, 0xa0, 0x8d, 0x06, + 0x52, 0x0f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x79, 0x12, 0x4b, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x13, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, + 0x01, 0x02, 0x08, 0x01, 0x52, 0x08, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x45, + 0x0a, 0x11, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x64, 0x77, 0x65, 0x6c, 0x6c, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, + 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x44, 0x77, 0x65, 0x6c, + 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x49, 0x0a, 0x13, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, + 0x6b, 0x5f, 0x64, 0x77, 0x65, 0x6c, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x15, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x11, 0x64, + 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x44, 0x77, 0x65, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, + 0x12, 0x5d, 0x0a, 0x16, 0x61, 0x64, 0x72, 0x5f, 0x61, 0x63, 0x6b, 0x5f, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x41, 0x44, 0x52, 0x41, 0x63, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x78, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x13, 0x61, 0x64, 0x72, 0x41, + 0x63, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, + 0x5d, 0x0a, 0x16, 0x61, 0x64, 0x72, 0x5f, 0x61, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, + 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x41, 0x44, 0x52, 0x41, 0x63, 0x6b, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x78, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x13, 0x61, 0x64, 0x72, 0x41, 0x63, + 0x6b, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x67, + 0x0a, 0x1f, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, + 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x1a, 0x70, 0x69, 0x6e, + 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x72, 0x65, 0x6c, 0x61, 0x79, + 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x05, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x1a, 0xda, + 0x02, 0x0a, 0x07, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x36, 0x0a, 0x10, 0x75, 0x70, + 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x32, 0x06, 0x18, 0x00, 0x28, 0xa0, 0x8d, + 0x06, 0x52, 0x0f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x79, 0x12, 0x38, 0x0a, 0x12, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x66, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x09, + 0xfa, 0x42, 0x06, 0x32, 0x04, 0x28, 0xa0, 0x8d, 0x06, 0x52, 0x11, 0x64, 0x6f, 0x77, 0x6e, 0x6c, + 0x69, 0x6e, 0x6b, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x56, 0x0a, 0x13, + 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, + 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, + 0x10, 0x01, 0x52, 0x10, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x56, 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, + 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x44, + 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x23, 0x0a, 0x0d, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0c, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x70, 0x6c, 0x69, 0x6e, + 0x6b, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x3a, 0x08, 0xf2, 0xaa, 0x19, + 0x04, 0x08, 0x01, 0x10, 0x01, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, + 0x04, 0x22, 0xfa, 0x05, 0x0a, 0x10, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, + 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, + 0x4d, 0x0a, 0x0f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, + 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0e, + 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x54, + 0x0a, 0x13, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x5f, 0x70, 0x68, 0x79, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, 0x74, + 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x48, 0x59, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, + 0x01, 0x52, 0x11, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x50, 0x68, 0x79, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x11, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x79, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x40, 0x52, 0x0f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x79, 0x50, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x06, 0x70, 0x68, 0x6f, + 0x74, 0x6f, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, + 0x02, 0x10, 0x0a, 0x52, 0x06, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x73, + 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x62, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x42, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, + 0x73, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x12, + 0x4d, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x5f, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, + 0x41, 0x43, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x12, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x4d, 0x61, 0x63, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x23, + 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x46, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0c, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x2c, 0x0a, + 0x12, 0x72, 0x65, 0x73, 0x65, 0x74, 0x73, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x6e, 0x6f, 0x6e, + 0x63, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x72, 0x65, 0x73, 0x65, 0x74, + 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x61, 0x0a, 0x12, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, + 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x11, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x73, 0x22, 0xad, + 0x0b, 0x0a, 0x0b, 0x41, 0x44, 0x52, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x40, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, - 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x78, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x16, 0x72, - 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, - 0x69, 0x63, 0x69, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x13, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x6c, - 0x6f, 0x74, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x04, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x32, 0x06, 0x18, 0x00, 0x28, 0xa0, 0x8d, 0x06, 0x52, - 0x11, 0x70, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x79, 0x12, 0x5b, 0x0a, 0x19, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, + 0x41, 0x44, 0x52, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x69, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, + 0x12, 0x43, 0x0a, 0x07, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, + 0x76, 0x33, 0x2e, 0x41, 0x44, 0x52, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x44, + 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x07, 0x64, 0x79, + 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x12, 0x46, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, + 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x44, 0x52, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x4d, 0x6f, 0x64, + 0x65, 0x48, 0x00, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x1a, 0xbc, 0x01, + 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x4f, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x11, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x42, 0x02, 0x18, 0x01, 0x52, 0x15, 0x70, 0x69, 0x6e, 0x67, 0x53, 0x6c, - 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x36, 0x0a, 0x10, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x79, 0x18, 0x12, 0x20, 0x01, 0x28, 0x04, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x32, 0x06, - 0x18, 0x00, 0x28, 0xa0, 0x8d, 0x06, 0x52, 0x0f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x46, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x4b, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x74, 0x6e, 0x2e, - 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x08, 0x63, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x45, 0x0a, 0x11, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x64, - 0x77, 0x65, 0x6c, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, - 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x75, 0x70, 0x6c, 0x69, - 0x6e, 0x6b, 0x44, 0x77, 0x65, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x49, 0x0a, 0x13, 0x64, - 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x64, 0x77, 0x65, 0x6c, 0x6c, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, - 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x11, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x44, 0x77, 0x65, - 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x5d, 0x0a, 0x16, 0x61, 0x64, 0x72, 0x5f, 0x61, 0x63, - 0x6b, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, - 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x44, 0x52, 0x41, 0x63, 0x6b, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x13, 0x61, 0x64, 0x72, 0x41, 0x63, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x78, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x5d, 0x0a, 0x16, 0x61, 0x64, 0x72, 0x5f, 0x61, 0x63, 0x6b, - 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, - 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, - 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x44, 0x52, 0x41, 0x63, 0x6b, 0x44, 0x65, 0x6c, - 0x61, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x13, 0x61, 0x64, 0x72, 0x41, 0x63, 0x6b, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x78, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x67, 0x0a, 0x1f, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x6c, 0x6f, - 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x1a, 0x70, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0xda, 0x02, - 0x0a, 0x07, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x36, 0x0a, 0x10, 0x75, 0x70, 0x6c, - 0x69, 0x6e, 0x6b, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x32, 0x06, 0x18, 0x00, 0x28, 0xa0, 0x8d, 0x06, - 0x52, 0x0f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x79, 0x12, 0x38, 0x0a, 0x12, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x66, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x09, 0xfa, - 0x42, 0x06, 0x32, 0x04, 0x28, 0xa0, 0x8d, 0x06, 0x52, 0x11, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, - 0x6e, 0x6b, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x56, 0x0a, 0x13, 0x6d, - 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, - 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, - 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, - 0x01, 0x52, 0x10, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x56, 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, - 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, - 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, - 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x44, 0x61, - 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x23, 0x0a, 0x0d, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, - 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, - 0x08, 0x01, 0x10, 0x01, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, - 0x22, 0xfa, 0x05, 0x0a, 0x10, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, - 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, - 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x4d, - 0x0a, 0x0f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, - 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x6c, - 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, - 0x13, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x5f, 0x70, 0x68, 0x79, 0x5f, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, 0x74, 0x6e, - 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x48, 0x59, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, - 0x52, 0x11, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x50, 0x68, 0x79, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x11, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, - 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x40, 0x52, 0x0f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x79, 0x50, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x06, 0x70, 0x68, 0x6f, 0x74, - 0x6f, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, - 0x10, 0x0a, 0x52, 0x06, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x75, - 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x62, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x42, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, - 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, - 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x12, 0x4d, - 0x0a, 0x14, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x5f, 0x73, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, - 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, - 0x43, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x4d, 0x61, 0x63, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x23, 0x0a, - 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x46, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x75, 0x70, 0x70, 0x6f, - 0x72, 0x74, 0x73, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x2c, 0x0a, 0x12, - 0x72, 0x65, 0x73, 0x65, 0x74, 0x73, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, - 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x72, 0x65, 0x73, 0x65, 0x74, 0x73, - 0x4a, 0x6f, 0x69, 0x6e, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x61, 0x0a, 0x12, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x73, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, - 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x73, - 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x11, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x73, 0x22, 0xad, 0x0b, - 0x0a, 0x0b, 0x41, 0x44, 0x52, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x40, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, - 0x44, 0x52, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, - 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x12, - 0x43, 0x0a, 0x07, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x27, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, - 0x33, 0x2e, 0x41, 0x44, 0x52, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x44, 0x79, - 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x07, 0x64, 0x79, 0x6e, - 0x61, 0x6d, 0x69, 0x63, 0x12, 0x46, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, - 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x44, 0x52, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0d, + 0x64, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2d, 0x0a, + 0x0e, 0x74, 0x78, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x18, 0x0f, 0x52, 0x0c, + 0x74, 0x78, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x24, 0x0a, 0x08, + 0x6e, 0x62, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x09, + 0xfa, 0x42, 0x06, 0x2a, 0x04, 0x18, 0x0f, 0x28, 0x01, 0x52, 0x07, 0x6e, 0x62, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x1a, 0xe1, 0x07, 0x0a, + 0x0b, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x33, 0x0a, 0x06, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, + 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x12, 0x51, 0x0a, 0x13, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, + 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x10, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x51, 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, + 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, + 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x52, 0x0a, 0x12, 0x6d, 0x69, 0x6e, 0x5f, 0x74, + 0x78, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x18, 0x0f, 0x52, 0x0f, 0x6d, 0x69, 0x6e, 0x54, + 0x78, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x52, 0x0a, 0x12, 0x6d, + 0x61, 0x78, 0x5f, 0x74, 0x78, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x18, 0x0f, 0x52, 0x0f, + 0x6d, 0x61, 0x78, 0x54, 0x78, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x49, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x6e, 0x62, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x2a, 0x04, 0x18, 0x03, 0x28, 0x01, 0x52, 0x0a, + 0x6d, 0x69, 0x6e, 0x4e, 0x62, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x0c, 0x6d, 0x61, + 0x78, 0x5f, 0x6e, 0x62, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x09, + 0xfa, 0x42, 0x06, 0x2a, 0x04, 0x18, 0x03, 0x28, 0x01, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x4e, 0x62, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x12, 0x6a, 0x0a, 0x10, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x5f, 0x73, 0x74, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x3f, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x41, 0x44, 0x52, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x44, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x53, 0x74, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x74, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x1a, 0xc2, 0x02, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x74, 0x65, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x71, 0x0a, + 0x0b, 0x6c, 0x6f, 0x72, 0x61, 0x5f, 0x6e, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x4e, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x44, 0x52, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, + 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x53, 0x74, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x2e, 0x4c, 0x6f, 0x52, 0x61, 0x4e, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x4d, 0x6f, + 0x64, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x6c, 0x6f, 0x72, 0x61, 0x4e, 0x61, 0x72, 0x72, 0x6f, 0x77, + 0x12, 0x6a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x44, 0x52, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, + 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x53, 0x74, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, - 0x48, 0x00, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x1a, 0xbc, 0x01, 0x0a, - 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x4f, 0x0a, 0x0f, 0x64, - 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, - 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x64, - 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2d, 0x0a, 0x0e, - 0x74, 0x78, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x18, 0x0f, 0x52, 0x0c, 0x74, - 0x78, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x24, 0x0a, 0x08, 0x6e, - 0x62, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x09, 0xfa, - 0x42, 0x06, 0x2a, 0x04, 0x18, 0x0f, 0x28, 0x01, 0x52, 0x07, 0x6e, 0x62, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x1a, 0xe1, 0x07, 0x0a, 0x0b, - 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x6d, - 0x61, 0x72, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x6c, - 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, - 0x12, 0x51, 0x0a, 0x13, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, - 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x48, 0x00, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x1a, 0x1a, 0x0a, 0x0e, + 0x4c, 0x6f, 0x52, 0x61, 0x4e, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x08, + 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x1a, 0x18, 0x0a, 0x0c, 0x44, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, + 0x10, 0x01, 0x3a, 0x0a, 0xf2, 0xaa, 0x19, 0x06, 0x08, 0x01, 0x10, 0x01, 0x20, 0x01, 0x42, 0x06, + 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, + 0x1a, 0x18, 0x0a, 0x0c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, + 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x3a, 0x0a, 0xf2, 0xaa, 0x19, 0x06, + 0x08, 0x01, 0x10, 0x01, 0x20, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0xef, + 0x16, 0x0a, 0x0b, 0x4d, 0x41, 0x43, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x41, + 0x0a, 0x0f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x62, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x42, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x12, 0x57, 0x0a, 0x15, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x70, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x13, 0x70, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x12, 0x5c, 0x0a, 0x19, 0x70, 0x69, + 0x6e, 0x67, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, + 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x10, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x51, 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, - 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, - 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x52, 0x0a, 0x12, 0x6d, 0x69, 0x6e, 0x5f, 0x74, 0x78, - 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x18, 0x0f, 0x52, 0x0f, 0x6d, 0x69, 0x6e, 0x54, 0x78, - 0x50, 0x6f, 0x77, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x52, 0x0a, 0x12, 0x6d, 0x61, - 0x78, 0x5f, 0x74, 0x78, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x18, 0x0f, 0x52, 0x0f, 0x6d, - 0x61, 0x78, 0x54, 0x78, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x49, - 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x6e, 0x62, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x2a, 0x04, 0x18, 0x03, 0x28, 0x01, 0x52, 0x0a, 0x6d, - 0x69, 0x6e, 0x4e, 0x62, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x0c, 0x6d, 0x61, 0x78, - 0x5f, 0x6e, 0x62, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x09, 0xfa, - 0x42, 0x06, 0x2a, 0x04, 0x18, 0x03, 0x28, 0x01, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x4e, 0x62, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x12, 0x6a, 0x0a, 0x10, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, - 0x73, 0x74, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, + 0x65, 0x52, 0x15, 0x70, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x56, 0x0a, 0x13, 0x70, 0x69, 0x6e, 0x67, + 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, + 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x5a, 0x65, 0x72, 0x6f, 0x61, 0x62, 0x6c, 0x65, 0x46, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x11, 0x70, + 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, + 0x12, 0x51, 0x0a, 0x10, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x79, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x5a, 0x65, 0x72, 0x6f, + 0x61, 0x62, 0x6c, 0x65, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x0f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x79, 0x12, 0x41, 0x0a, 0x0f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x63, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x54, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x39, 0x0a, 0x09, 0x72, 0x78, 0x31, 0x5f, 0x64, 0x65, + 0x6c, 0x61, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x74, 0x6e, 0x2e, + 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x78, 0x44, 0x65, 0x6c, + 0x61, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x72, 0x78, 0x31, 0x44, 0x65, 0x6c, 0x61, + 0x79, 0x12, 0x54, 0x0a, 0x14, 0x72, 0x78, 0x31, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, + 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x11, 0x72, 0x78, 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, + 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x51, 0x0a, 0x13, 0x72, 0x78, 0x32, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, + 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x72, 0x78, 0x32, 0x44, 0x61, 0x74, + 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x43, 0x0a, 0x0d, 0x72, 0x78, + 0x32, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, + 0x76, 0x33, 0x2e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x0c, 0x72, 0x78, 0x32, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, + 0x46, 0x0a, 0x1a, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, + 0x74, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x18, 0x0a, 0x20, + 0x03, 0x28, 0x04, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x10, 0x60, 0x52, 0x18, 0x66, + 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x46, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x64, + 0x75, 0x74, 0x79, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x44, 0x75, 0x74, 0x79, 0x43, + 0x79, 0x63, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x44, 0x75, + 0x74, 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x12, 0x4b, 0x0a, 0x15, 0x73, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x73, 0x5f, 0x33, 0x32, 0x5f, 0x62, 0x69, 0x74, 0x5f, 0x66, 0x5f, 0x63, 0x6e, 0x74, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x11, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x33, 0x32, 0x42, 0x69, 0x74, + 0x46, 0x43, 0x6e, 0x74, 0x12, 0x36, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x72, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, + 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x41, 0x64, 0x72, 0x12, 0x3e, 0x0a, 0x0a, + 0x61, 0x64, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x02, 0x18, + 0x01, 0x52, 0x09, 0x61, 0x64, 0x72, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x12, 0x3b, 0x0a, 0x0c, + 0x72, 0x65, 0x73, 0x65, 0x74, 0x73, 0x5f, 0x66, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x72, + 0x65, 0x73, 0x65, 0x74, 0x73, 0x46, 0x43, 0x6e, 0x74, 0x12, 0x51, 0x0a, 0x17, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, + 0x63, 0x69, 0x74, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x15, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, + 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x12, 0x56, 0x0a, 0x18, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x16, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, + 0x63, 0x69, 0x74, 0x79, 0x12, 0x48, 0x0a, 0x11, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, + 0x72, 0x78, 0x31, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x52, 0x78, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x64, + 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x52, 0x78, 0x31, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x63, + 0x0a, 0x1c, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x78, 0x31, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x13, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, + 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x4f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x18, 0x64, 0x65, 0x73, 0x69, 0x72, + 0x65, 0x64, 0x52, 0x78, 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x4f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x12, 0x60, 0x0a, 0x1b, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x72, + 0x78, 0x32, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, + 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, + 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x17, 0x64, 0x65, + 0x73, 0x69, 0x72, 0x65, 0x64, 0x52, 0x78, 0x32, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x52, 0x0a, 0x15, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, + 0x5f, 0x72, 0x78, 0x32, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x15, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, + 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x13, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x52, 0x78, 0x32, + 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x5d, 0x0a, 0x16, 0x64, 0x65, 0x73, + 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x75, 0x74, 0x79, 0x5f, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, + 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, + 0x67, 0x61, 0x74, 0x65, 0x64, 0x44, 0x75, 0x74, 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x13, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x4d, 0x61, 0x78, 0x44, + 0x75, 0x74, 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x12, 0x6c, 0x0a, 0x1e, 0x64, 0x65, 0x73, 0x69, + 0x72, 0x65, 0x64, 0x5f, 0x61, 0x64, 0x72, 0x5f, 0x61, 0x63, 0x6b, 0x5f, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x41, 0x44, 0x52, 0x41, 0x63, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x78, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x1a, 0x64, 0x65, 0x73, 0x69, + 0x72, 0x65, 0x64, 0x41, 0x64, 0x72, 0x41, 0x63, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x78, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x6c, 0x0a, 0x1e, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, + 0x64, 0x5f, 0x61, 0x64, 0x72, 0x5f, 0x61, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, + 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, - 0x41, 0x44, 0x52, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x44, 0x79, 0x6e, 0x61, - 0x6d, 0x69, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x53, - 0x74, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, - 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x74, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, - 0x1a, 0xc2, 0x02, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x74, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x71, 0x0a, 0x0b, - 0x6c, 0x6f, 0x72, 0x61, 0x5f, 0x6e, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x4e, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x41, 0x44, 0x52, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x44, - 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x53, 0x74, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x2e, 0x4c, 0x6f, 0x52, 0x61, 0x4e, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x4d, 0x6f, 0x64, - 0x65, 0x48, 0x00, 0x52, 0x0a, 0x6c, 0x6f, 0x72, 0x61, 0x4e, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x12, - 0x6a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x4c, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x41, 0x44, 0x52, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x44, - 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x53, 0x74, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x2e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x48, - 0x00, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x1a, 0x1a, 0x0a, 0x0e, 0x4c, - 0x6f, 0x52, 0x61, 0x4e, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x08, 0xf2, - 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x1a, 0x18, 0x0a, 0x0c, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, - 0x01, 0x3a, 0x0a, 0xf2, 0xaa, 0x19, 0x06, 0x08, 0x01, 0x10, 0x01, 0x20, 0x01, 0x42, 0x06, 0x0a, - 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x1a, - 0x18, 0x0a, 0x0c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x3a, - 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x3a, 0x0a, 0xf2, 0xaa, 0x19, 0x06, 0x08, - 0x01, 0x10, 0x01, 0x20, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0xf2, 0x15, - 0x0a, 0x0b, 0x4d, 0x41, 0x43, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x41, 0x0a, - 0x0f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x62, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x42, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x41, 0x44, 0x52, 0x41, 0x63, 0x6b, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x1a, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, + 0x64, 0x41, 0x64, 0x72, 0x41, 0x63, 0x6b, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x78, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x6b, 0x0a, 0x21, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, + 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, + 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x1c, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x50, 0x69, 0x6e, 0x67, + 0x53, 0x6c, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x65, 0x0a, 0x1b, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x69, 0x6e, + 0x67, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, + 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x5a, 0x65, 0x72, 0x6f, 0x61, 0x62, 0x6c, 0x65, + 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x18, + 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x50, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x46, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x60, 0x0a, 0x18, 0x64, 0x65, 0x73, 0x69, + 0x72, 0x65, 0x64, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x79, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x5a, 0x65, 0x72, 0x6f, + 0x61, 0x62, 0x6c, 0x65, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x16, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x10, 0x64, 0x65, + 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x69, 0x72, 0x70, 0x18, 0x1e, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, + 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, 0x49, 0x52, 0x50, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x4d, 0x61, + 0x78, 0x45, 0x69, 0x72, 0x70, 0x12, 0x57, 0x0a, 0x1b, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x62, + 0x5f, 0x63, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x42, 0x43, 0x44, 0x6f, + 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x45, + 0x0a, 0x11, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x64, 0x77, 0x65, 0x6c, 0x6c, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, + 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x44, 0x77, 0x65, 0x6c, + 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x49, 0x0a, 0x13, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, + 0x6b, 0x5f, 0x64, 0x77, 0x65, 0x6c, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x21, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x11, 0x64, + 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x44, 0x77, 0x65, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, + 0x12, 0x2d, 0x0a, 0x03, 0x61, 0x64, 0x72, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, + 0x44, 0x52, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x03, 0x61, 0x64, 0x72, 0x12, + 0x48, 0x0a, 0x12, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, + 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, + 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x6f, 0x6f, + 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x12, 0x35, 0x0a, 0x05, 0x72, 0x65, 0x6c, + 0x61, 0x79, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, + 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x05, 0x72, 0x65, 0x6c, 0x61, 0x79, + 0x12, 0x44, 0x0a, 0x0d, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x6c, 0x61, + 0x79, 0x18, 0x25, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, + 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, + 0x64, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, + 0x22, 0xef, 0x29, 0x0a, 0x08, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x56, 0x0a, + 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, + 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, + 0x10, 0x01, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x56, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, + 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x11, 0x64, 0x65, 0x73, 0x69, + 0x72, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x42, 0x0a, + 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, + 0x01, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, + 0x52, 0x0e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x57, 0x0a, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, + 0x65, 0x64, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x61, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x17, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x44, + 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x74, 0x12, 0x35, 0x0a, 0x18, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x64, 0x65, 0x76, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x66, 0x5f, 0x63, + 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6c, 0x61, 0x73, + 0x74, 0x44, 0x65, 0x76, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x46, 0x43, 0x6e, 0x74, 0x55, 0x70, 0x12, 0x57, 0x0a, 0x15, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x70, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x13, 0x70, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x50, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x12, 0x5c, 0x0a, 0x19, 0x70, 0x69, 0x6e, - 0x67, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, - 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, - 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x15, 0x70, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, - 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x56, 0x0a, 0x13, 0x70, 0x69, 0x6e, 0x67, 0x5f, - 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, - 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x5a, 0x65, 0x72, 0x6f, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x11, 0x70, 0x69, - 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, - 0x51, 0x0a, 0x10, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x79, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, - 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x5a, 0x65, 0x72, 0x6f, 0x61, - 0x62, 0x6c, 0x65, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x0f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x79, 0x12, 0x41, 0x0a, 0x0f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x63, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x39, 0x0a, 0x09, 0x72, 0x78, 0x31, 0x5f, 0x64, 0x65, 0x6c, - 0x61, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, - 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x78, 0x44, 0x65, 0x6c, 0x61, - 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x72, 0x78, 0x31, 0x44, 0x65, 0x6c, 0x61, 0x79, - 0x12, 0x54, 0x0a, 0x14, 0x72, 0x78, 0x31, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, - 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x11, 0x72, 0x78, 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, - 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x51, 0x0a, 0x13, 0x72, 0x78, 0x32, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, - 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x72, 0x78, 0x32, 0x44, 0x61, 0x74, 0x61, - 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x43, 0x0a, 0x0d, 0x72, 0x78, 0x32, - 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, - 0x33, 0x2e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x0c, 0x72, 0x78, 0x32, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x46, - 0x0a, 0x1a, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, 0x74, - 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, - 0x28, 0x04, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x10, 0x60, 0x52, 0x18, 0x66, 0x61, - 0x63, 0x74, 0x6f, 0x72, 0x79, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x46, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x75, - 0x74, 0x79, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, - 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, - 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x44, 0x75, 0x74, 0x79, 0x43, 0x79, - 0x63, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x44, 0x75, 0x74, - 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x12, 0x4b, 0x0a, 0x15, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, - 0x74, 0x73, 0x5f, 0x33, 0x32, 0x5f, 0x62, 0x69, 0x74, 0x5f, 0x66, 0x5f, 0x63, 0x6e, 0x74, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, - 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x11, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x33, 0x32, 0x42, 0x69, 0x74, 0x46, - 0x43, 0x6e, 0x74, 0x12, 0x36, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x72, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, - 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, - 0x02, 0x18, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x41, 0x64, 0x72, 0x12, 0x3e, 0x0a, 0x0a, 0x61, - 0x64, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x02, 0x18, 0x01, - 0x52, 0x09, 0x61, 0x64, 0x72, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x12, 0x3b, 0x0a, 0x0c, 0x72, - 0x65, 0x73, 0x65, 0x74, 0x73, 0x5f, 0x66, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x72, 0x65, - 0x73, 0x65, 0x74, 0x73, 0x46, 0x43, 0x6e, 0x74, 0x12, 0x51, 0x0a, 0x17, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, - 0x69, 0x74, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x15, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, - 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x12, 0x56, 0x0a, 0x18, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x16, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, - 0x69, 0x74, 0x79, 0x12, 0x48, 0x0a, 0x11, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x72, - 0x78, 0x31, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, - 0x52, 0x78, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x64, 0x65, - 0x73, 0x69, 0x72, 0x65, 0x64, 0x52, 0x78, 0x31, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x63, 0x0a, - 0x1c, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x78, 0x31, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x13, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, - 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x4f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x18, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, - 0x64, 0x52, 0x78, 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x12, 0x60, 0x0a, 0x1b, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x78, - 0x32, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, - 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x17, 0x64, 0x65, 0x73, - 0x69, 0x72, 0x65, 0x64, 0x52, 0x78, 0x32, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x52, 0x0a, 0x15, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, - 0x72, 0x78, 0x32, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x15, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, - 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x13, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x52, 0x78, 0x32, 0x46, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x5d, 0x0a, 0x16, 0x64, 0x65, 0x73, 0x69, - 0x72, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x75, 0x74, 0x79, 0x5f, 0x63, 0x79, 0x63, - 0x6c, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, - 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, - 0x61, 0x74, 0x65, 0x64, 0x44, 0x75, 0x74, 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x13, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x4d, 0x61, 0x78, 0x44, 0x75, - 0x74, 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x12, 0x6c, 0x0a, 0x1e, 0x64, 0x65, 0x73, 0x69, 0x72, - 0x65, 0x64, 0x5f, 0x61, 0x64, 0x72, 0x5f, 0x61, 0x63, 0x6b, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, - 0x2e, 0x41, 0x44, 0x52, 0x41, 0x63, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x78, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x1a, 0x64, 0x65, 0x73, 0x69, 0x72, - 0x65, 0x64, 0x41, 0x64, 0x72, 0x41, 0x63, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x78, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x6c, 0x0a, 0x1e, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, - 0x5f, 0x61, 0x64, 0x72, 0x5f, 0x61, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, - 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, - 0x44, 0x52, 0x41, 0x63, 0x6b, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x1a, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, - 0x41, 0x64, 0x72, 0x41, 0x63, 0x6b, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x12, 0x6b, 0x0a, 0x21, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x70, - 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, - 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, - 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x1c, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x50, 0x69, 0x6e, 0x67, 0x53, - 0x6c, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x12, 0x65, 0x0a, 0x1b, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x69, 0x6e, 0x67, - 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, - 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, - 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x5a, 0x65, 0x72, 0x6f, 0x61, 0x62, 0x6c, 0x65, 0x46, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x18, 0x64, - 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x50, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x46, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x60, 0x0a, 0x18, 0x64, 0x65, 0x73, 0x69, 0x72, - 0x65, 0x64, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x79, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, - 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x5a, 0x65, 0x72, 0x6f, 0x61, - 0x62, 0x6c, 0x65, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x16, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x10, 0x64, 0x65, 0x73, - 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x69, 0x72, 0x70, 0x18, 0x1e, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, - 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, 0x49, 0x52, 0x50, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x4d, 0x61, 0x78, - 0x45, 0x69, 0x72, 0x70, 0x12, 0x57, 0x0a, 0x1b, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x62, 0x5f, - 0x63, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x42, 0x43, 0x44, 0x6f, 0x77, - 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x45, 0x0a, - 0x11, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x64, 0x77, 0x65, 0x6c, 0x6c, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, - 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x44, 0x77, 0x65, 0x6c, 0x6c, - 0x54, 0x69, 0x6d, 0x65, 0x12, 0x49, 0x0a, 0x13, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, - 0x5f, 0x64, 0x77, 0x65, 0x6c, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x21, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x11, 0x64, 0x6f, - 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x44, 0x77, 0x65, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x12, - 0x2d, 0x0a, 0x03, 0x61, 0x64, 0x72, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, - 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x44, - 0x52, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x03, 0x61, 0x64, 0x72, 0x12, 0x48, - 0x0a, 0x12, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, - 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, - 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x44, - 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, - 0x10, 0x01, 0x22, 0x96, 0x28, 0x0a, 0x08, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x56, 0x0a, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x74, - 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, - 0x01, 0x02, 0x10, 0x01, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x56, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x69, 0x72, - 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, - 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x11, 0x64, 0x65, - 0x73, 0x69, 0x72, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, - 0x42, 0x0a, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, - 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x42, 0x08, 0xfa, 0x42, - 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x5f, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, - 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, - 0x43, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, - 0x10, 0x01, 0x52, 0x0e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x57, 0x0a, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x61, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x17, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, - 0x64, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x74, 0x12, 0x35, 0x0a, 0x18, 0x6c, - 0x61, 0x73, 0x74, 0x5f, 0x64, 0x65, 0x76, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x66, - 0x5f, 0x63, 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6c, - 0x61, 0x73, 0x74, 0x44, 0x65, 0x76, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x46, 0x43, 0x6e, 0x74, - 0x55, 0x70, 0x12, 0x57, 0x0a, 0x15, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, - 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x13, 0x70, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, - 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x12, 0x65, 0x0a, 0x1c, 0x70, - 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x6f, - 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x52, 0x1a, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, - 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, - 0x6e, 0x6b, 0x12, 0x45, 0x0a, 0x10, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, - 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, - 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x10, 0x70, 0x65, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x0a, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, - 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, - 0x12, 0x51, 0x0a, 0x12, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, - 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, - 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, - 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x65, 0x70, - 0x74, 0x52, 0x10, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x63, 0x63, - 0x65, 0x70, 0x74, 0x12, 0x56, 0x0a, 0x14, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6a, - 0x6f, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x12, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x72, - 0x78, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x72, 0x78, 0x57, 0x69, 0x6e, - 0x64, 0x6f, 0x77, 0x73, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x4d, 0x0a, - 0x0e, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, - 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, - 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, - 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0d, 0x72, - 0x65, 0x63, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x12, 0x53, 0x0a, 0x10, - 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x73, - 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, - 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x52, 0x0f, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, - 0x73, 0x12, 0x66, 0x0a, 0x22, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x6f, 0x77, 0x6e, - 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x61, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x1e, 0x6c, 0x61, 0x73, 0x74, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x44, - 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x74, 0x12, 0x72, 0x0a, 0x1e, 0x72, 0x65, 0x6a, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x64, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, - 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, - 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x42, 0x0f, 0xfa, 0x42, 0x0c, 0x92, 0x01, 0x09, 0x10, 0x0f, 0x22, 0x05, 0x82, 0x01, 0x02, 0x10, - 0x01, 0x52, 0x1a, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x64, 0x72, 0x44, 0x61, - 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x50, 0x0a, - 0x1d, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x64, 0x72, 0x5f, 0x74, 0x78, - 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x12, - 0x20, 0x03, 0x28, 0x0d, 0x42, 0x0e, 0xfa, 0x42, 0x0b, 0x92, 0x01, 0x08, 0x10, 0x0f, 0x22, 0x04, - 0x2a, 0x02, 0x18, 0x0f, 0x52, 0x19, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x64, - 0x72, 0x54, 0x78, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, - 0x41, 0x0a, 0x14, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x04, 0x42, 0x0e, 0xfa, - 0x42, 0x0b, 0x92, 0x01, 0x08, 0x22, 0x06, 0x32, 0x04, 0x28, 0xa0, 0x8d, 0x06, 0x52, 0x13, 0x72, - 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x69, - 0x65, 0x73, 0x12, 0x44, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, - 0x69, 0x6e, 0x6b, 0x5f, 0x61, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x44, 0x6f, - 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x74, 0x12, 0x6f, 0x0a, 0x19, 0x72, 0x65, 0x6a, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x72, - 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x74, 0x74, - 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x61, - 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x16, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x18, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x61, 0x64, 0x72, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x66, 0x5f, 0x63, - 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6c, 0x61, 0x73, - 0x74, 0x41, 0x64, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x46, 0x43, 0x6e, 0x74, 0x55, 0x70, - 0x12, 0x69, 0x0a, 0x1e, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x5f, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x73, 0x18, 0x17, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, - 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x1b, - 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x1a, 0x83, 0x02, 0x0a, 0x0b, - 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, 0x11, 0x64, - 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, - 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x4c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x10, 0x64, 0x6f, - 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3c, - 0x0a, 0x08, 0x72, 0x78, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x17, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, - 0x33, 0x2e, 0x52, 0x78, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, - 0x02, 0x10, 0x01, 0x52, 0x07, 0x72, 0x78, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x2f, 0x0a, 0x07, - 0x63, 0x66, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x43, - 0x46, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x06, 0x63, 0x66, 0x4c, 0x69, 0x73, 0x74, 0x3a, 0x08, 0xf2, - 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, - 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, - 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x4a, 0x04, 0x08, 0x0a, 0x10, - 0x0b, 0x1a, 0xd1, 0x07, 0x0a, 0x0a, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, - 0x12, 0x23, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x7a, 0x04, 0x10, 0x11, 0x18, 0x21, 0x52, 0x07, 0x70, 0x61, - 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x48, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, - 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x08, 0xfa, 0x42, - 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x39, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, - 0x01, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x35, 0x0a, 0x0f, 0x63, 0x6f, - 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x09, 0x42, 0x0c, 0xfa, 0x42, 0x09, 0x92, 0x01, 0x06, 0x22, 0x04, 0x72, 0x02, 0x18, - 0x64, 0x52, 0x0e, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x73, 0x12, 0xed, 0x02, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0c, 0x42, 0xd1, 0x02, 0x92, 0x41, 0x19, 0x4a, 0x0a, 0x22, 0x32, 0x36, 0x30, - 0x30, 0x41, 0x42, 0x43, 0x44, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0xfa, 0x42, 0x06, 0x7a, 0x04, 0x68, 0x04, 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, - 0x01, 0x0a, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x12, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, - 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, - 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x34, 0x42, 0x79, - 0x74, 0x65, 0x73, 0xf2, 0xaa, 0x19, 0xa0, 0x01, 0x1a, 0x4e, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, - 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, - 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, - 0x63, 0x6d, 0x64, 0x2f, 0x74, 0x74, 0x6e, 0x2d, 0x6c, 0x77, 0x2d, 0x63, 0x6c, 0x69, 0x2f, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2e, 0x4e, 0x65, 0x77, 0x34, 0x42, - 0x79, 0x74, 0x65, 0x73, 0x46, 0x6c, 0x61, 0x67, 0x22, 0x4e, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, - 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, - 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, - 0x63, 0x6d, 0x64, 0x2f, 0x74, 0x74, 0x6e, 0x2d, 0x6c, 0x77, 0x2d, 0x63, 0x6c, 0x69, 0x2f, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, - 0x61, 0x63, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x07, 0x64, 0x65, 0x76, 0x41, 0x64, 0x64, - 0x72, 0x12, 0xe7, 0x02, 0x0a, 0x06, 0x6e, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0c, 0x42, 0xcf, 0x02, 0x92, 0x41, 0x17, 0x4a, 0x08, 0x22, 0x30, 0x30, 0x30, 0x30, 0x31, - 0x33, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, - 0x42, 0x06, 0x7a, 0x04, 0x68, 0x03, 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, - 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, - 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, + 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x12, 0x65, 0x0a, 0x1c, 0x70, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x77, 0x6e, + 0x6c, 0x69, 0x6e, 0x6b, 0x52, 0x1a, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, + 0x12, 0x45, 0x0a, 0x10, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x10, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, + 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0f, 0x70, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x51, + 0x0a, 0x12, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x61, 0x63, + 0x63, 0x65, 0x70, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x52, + 0x10, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x65, 0x70, + 0x74, 0x12, 0x56, 0x0a, 0x14, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6a, 0x6f, 0x69, + 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x12, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4a, 0x6f, + 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x72, 0x78, 0x5f, + 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x72, 0x78, 0x57, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x73, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x4d, 0x0a, 0x0e, 0x72, + 0x65, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x0e, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x55, 0x70, + 0x6c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0d, 0x72, 0x65, 0x63, + 0x65, 0x6e, 0x74, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x12, 0x53, 0x0a, 0x10, 0x72, 0x65, + 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x0f, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, + 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, + 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0f, + 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x12, + 0x66, 0x0a, 0x22, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, + 0x6e, 0x6b, 0x5f, 0x61, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x1e, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x77, + 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x74, 0x12, 0x72, 0x0a, 0x1e, 0x72, 0x65, 0x6a, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x64, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, + 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0e, 0x32, + 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x0f, + 0xfa, 0x42, 0x0c, 0x92, 0x01, 0x09, 0x10, 0x0f, 0x22, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, + 0x1a, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x64, 0x72, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x1d, 0x72, + 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x64, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x70, + 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x12, 0x20, 0x03, + 0x28, 0x0d, 0x42, 0x0e, 0xfa, 0x42, 0x0b, 0x92, 0x01, 0x08, 0x10, 0x0f, 0x22, 0x04, 0x2a, 0x02, + 0x18, 0x0f, 0x52, 0x19, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x64, 0x72, 0x54, + 0x78, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x41, 0x0a, + 0x14, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x69, 0x65, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x04, 0x42, 0x0e, 0xfa, 0x42, 0x0b, + 0x92, 0x01, 0x08, 0x22, 0x06, 0x32, 0x04, 0x28, 0xa0, 0x8d, 0x06, 0x52, 0x13, 0x72, 0x65, 0x6a, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, + 0x12, 0x44, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, + 0x6b, 0x5f, 0x61, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x44, 0x6f, 0x77, 0x6e, + 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x74, 0x12, 0x6f, 0x0a, 0x19, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x74, 0x74, 0x6e, 0x2e, + 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x16, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, + 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x18, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x61, 0x64, 0x72, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x66, 0x5f, 0x63, 0x6e, 0x74, + 0x5f, 0x75, 0x70, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x41, + 0x64, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x46, 0x43, 0x6e, 0x74, 0x55, 0x70, 0x12, 0x69, + 0x0a, 0x1e, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x5f, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, + 0x18, 0x17, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x1b, 0x72, 0x65, + 0x63, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x5d, 0x0a, 0x16, 0x70, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, + 0x69, 0x6e, 0x6b, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x74, 0x6e, 0x2e, + 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, + 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x52, + 0x65, 0x71, 0x52, 0x14, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6c, 0x61, 0x79, + 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x1a, 0x83, 0x02, 0x0a, 0x0b, 0x4a, 0x6f, 0x69, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, 0x11, 0x64, 0x6f, 0x77, 0x6e, + 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x4c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, + 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x10, 0x64, 0x6f, 0x77, 0x6e, 0x6c, + 0x69, 0x6e, 0x6b, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3c, 0x0a, 0x08, 0x72, + 0x78, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, + 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, + 0x78, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, + 0x52, 0x07, 0x72, 0x78, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x66, 0x5f, + 0x6c, 0x69, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x46, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x06, 0x63, 0x66, 0x4c, 0x69, 0x73, 0x74, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, + 0x08, 0x01, 0x10, 0x01, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, + 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, + 0x10, 0x06, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x4a, 0x04, 0x08, 0x0a, 0x10, 0x0b, 0x1a, 0xd1, + 0x07, 0x0a, 0x0a, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x12, 0x23, 0x0a, + 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x09, + 0xfa, 0x42, 0x06, 0x7a, 0x04, 0x10, 0x11, 0x18, 0x21, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x12, 0x48, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4a, 0x6f, + 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, + 0x02, 0x10, 0x01, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x04, + 0x6b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, + 0x01, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x35, 0x0a, 0x0f, 0x63, 0x6f, 0x72, 0x72, 0x65, + 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, + 0x42, 0x0c, 0xfa, 0x42, 0x09, 0x92, 0x01, 0x06, 0x22, 0x04, 0x72, 0x02, 0x18, 0x64, 0x52, 0x0e, + 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0xed, + 0x02, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0c, 0x42, 0xd1, 0x02, 0x92, 0x41, 0x19, 0x4a, 0x0a, 0x22, 0x32, 0x36, 0x30, 0x30, 0x41, 0x42, + 0x43, 0x44, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0xfa, 0x42, 0x06, 0x7a, 0x04, 0x68, 0x04, 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x33, 0x42, 0x79, 0x74, 0x65, 0x73, 0xf2, - 0xaa, 0x19, 0xa0, 0x01, 0x1a, 0x4e, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, - 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, - 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6d, 0x64, 0x2f, - 0x74, 0x74, 0x6e, 0x2d, 0x6c, 0x77, 0x2d, 0x63, 0x6c, 0x69, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2e, 0x4e, 0x65, 0x77, 0x33, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x46, 0x6c, 0x61, 0x67, 0x22, 0x4e, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, - 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, - 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6d, 0x64, 0x2f, - 0x74, 0x74, 0x6e, 0x2d, 0x6c, 0x77, 0x2d, 0x63, 0x6c, 0x69, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x61, 0x63, 0x74, 0x42, - 0x79, 0x74, 0x65, 0x73, 0x52, 0x05, 0x6e, 0x65, 0x74, 0x49, 0x64, 0x3a, 0x08, 0xf2, 0xaa, 0x19, - 0x04, 0x08, 0x01, 0x10, 0x01, 0x1a, 0xf9, 0x07, 0x0a, 0x0d, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3b, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, - 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x07, 0x70, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x57, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, - 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x2e, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, - 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, - 0x02, 0x10, 0x01, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x52, 0x0a, - 0x0b, 0x72, 0x78, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, - 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x55, 0x70, 0x6c, - 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x78, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0a, 0x72, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x3b, 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x35, - 0x0a, 0x0f, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x42, 0x0c, 0xfa, 0x42, 0x09, 0x92, 0x01, 0x06, 0x22, - 0x04, 0x72, 0x02, 0x18, 0x64, 0x52, 0x0e, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x3a, 0x0a, 0x14, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0d, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x2a, 0x03, 0x18, 0xff, 0x01, 0x52, 0x12, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x1a, 0x53, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x3f, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, - 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x42, 0x08, 0xfa, 0x42, - 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, - 0x4a, 0x04, 0x08, 0x02, 0x10, 0x0a, 0x1a, 0xe0, 0x03, 0x0a, 0x0a, 0x52, 0x78, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x4d, 0x0a, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, - 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, - 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x49, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, - 0x72, 0x73, 0x73, 0x69, 0x18, 0x09, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x52, 0x73, 0x73, 0x69, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x6e, 0x72, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x73, 0x6e, 0x72, 0x12, 0x6a, 0x0a, 0x18, 0x64, 0x6f, 0x77, - 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x72, 0x61, 0x69, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x74, 0x74, - 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x6f, 0x77, - 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, - 0x69, 0x6e, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x16, 0x64, - 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x73, 0x74, - 0x72, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x75, 0x70, 0x6c, - 0x69, 0x6e, 0x6b, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x6b, 0x0a, 0x0d, 0x70, 0x61, 0x63, 0x6b, - 0x65, 0x74, 0x5f, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x46, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, + 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x34, 0x42, 0x79, 0x74, 0x65, 0x73, + 0xf2, 0xaa, 0x19, 0xa0, 0x01, 0x1a, 0x4e, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, + 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, + 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6d, 0x64, + 0x2f, 0x74, 0x74, 0x6e, 0x2d, 0x6c, 0x77, 0x2d, 0x63, 0x6c, 0x69, 0x2f, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2e, 0x4e, 0x65, 0x77, 0x34, 0x42, 0x79, 0x74, 0x65, + 0x73, 0x46, 0x6c, 0x61, 0x67, 0x22, 0x4e, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, + 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, + 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6d, 0x64, + 0x2f, 0x74, 0x74, 0x6e, 0x2d, 0x6c, 0x77, 0x2d, 0x63, 0x6c, 0x69, 0x2f, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x61, 0x63, 0x74, + 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x07, 0x64, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x12, 0xe7, + 0x02, 0x0a, 0x06, 0x6e, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x42, + 0xcf, 0x02, 0x92, 0x41, 0x17, 0x4a, 0x08, 0x22, 0x30, 0x30, 0x30, 0x30, 0x31, 0x33, 0x22, 0x9a, + 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, 0x42, 0x06, 0x7a, + 0x04, 0x68, 0x03, 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, 0x6f, 0x2e, 0x74, + 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, + 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x72, 0x73, + 0x68, 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x67, 0x6f, 0x2e, + 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, + 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x6d, + 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x33, 0x42, 0x79, 0x74, 0x65, 0x73, 0xf2, 0xaa, 0x19, 0xa0, + 0x01, 0x1a, 0x4e, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6d, 0x64, 0x2f, 0x74, 0x74, 0x6e, + 0x2d, 0x6c, 0x77, 0x2d, 0x63, 0x6c, 0x69, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x66, 0x6c, + 0x61, 0x67, 0x73, 0x2e, 0x4e, 0x65, 0x77, 0x33, 0x42, 0x79, 0x74, 0x65, 0x73, 0x46, 0x6c, 0x61, + 0x67, 0x22, 0x4e, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6d, 0x64, 0x2f, 0x74, 0x74, 0x6e, + 0x2d, 0x6c, 0x77, 0x2d, 0x63, 0x6c, 0x69, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x66, 0x6c, + 0x61, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x61, 0x63, 0x74, 0x42, 0x79, 0x74, 0x65, + 0x73, 0x52, 0x05, 0x6e, 0x65, 0x74, 0x49, 0x64, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, + 0x10, 0x01, 0x1a, 0xf3, 0x08, 0x0a, 0x0d, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x3b, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, + 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x08, + 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x12, 0x57, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x55, 0x70, + 0x6c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x78, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, + 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x52, 0x0a, 0x0b, 0x72, 0x78, + 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x31, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0c, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, - 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x1a, 0x1c, 0x0a, 0x14, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, - 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4a, 0x04, 0x08, - 0x01, 0x10, 0x0b, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x0a, 0x10, 0x0b, 0x4a, - 0x04, 0x08, 0x0c, 0x10, 0x0d, 0x4a, 0x04, 0x08, 0x0d, 0x10, 0x0e, 0x4a, 0x04, 0x08, 0x10, 0x10, - 0x11, 0x4a, 0x04, 0x08, 0x11, 0x10, 0x12, 0x4a, 0x04, 0x08, 0x13, 0x10, 0x14, 0x4a, 0x04, 0x08, - 0x14, 0x10, 0x15, 0x4a, 0x04, 0x08, 0x63, 0x10, 0x64, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, - 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x0a, 0x10, - 0x0b, 0x1a, 0x97, 0x04, 0x0a, 0x0f, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x4a, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x74, 0x61, 0x52, 0x0a, 0x72, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3b, + 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x35, 0x0a, 0x0f, 0x63, + 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x09, 0x42, 0x0c, 0xfa, 0x42, 0x09, 0x92, 0x01, 0x06, 0x22, 0x04, 0x72, 0x02, + 0x18, 0x64, 0x52, 0x0e, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x73, 0x12, 0x3a, 0x0a, 0x14, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, + 0x42, 0x08, 0xfa, 0x42, 0x05, 0x2a, 0x03, 0x18, 0xff, 0x01, 0x52, 0x12, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x1a, 0x53, + 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3f, 0x0a, 0x09, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, + 0x02, 0x10, 0x01, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x4a, 0x04, 0x08, + 0x02, 0x10, 0x0a, 0x1a, 0xda, 0x04, 0x0a, 0x0a, 0x52, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x4d, 0x0a, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, + 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, + 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, + 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x72, 0x73, 0x73, + 0x69, 0x18, 0x09, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x52, 0x73, 0x73, 0x69, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x6e, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x03, 0x73, 0x6e, 0x72, 0x12, 0x6a, 0x0a, 0x18, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, + 0x6e, 0x6b, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, + 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, + 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, + 0x6e, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, + 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x16, 0x64, 0x6f, 0x77, 0x6e, + 0x6c, 0x69, 0x6e, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, + 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x6b, 0x0a, 0x0d, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x5f, + 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x74, + 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, + 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x52, 0x0c, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x72, 0x6f, 0x6b, + 0x65, 0x72, 0x12, 0x55, 0x0a, 0x05, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x3f, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, + 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x55, 0x70, 0x6c, 0x69, + 0x6e, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x78, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x05, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x1a, 0x1c, 0x0a, 0x14, 0x50, 0x61, 0x63, + 0x6b, 0x65, 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x0b, 0x1a, 0x15, 0x0a, 0x0d, 0x52, 0x65, 0x6c, 0x61, 0x79, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x04, 0x4a, 0x04, + 0x08, 0x02, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x0a, 0x10, 0x0b, 0x4a, 0x04, 0x08, 0x0c, 0x10, 0x0d, + 0x4a, 0x04, 0x08, 0x0d, 0x10, 0x0e, 0x4a, 0x04, 0x08, 0x10, 0x10, 0x11, 0x4a, 0x04, 0x08, 0x11, + 0x10, 0x12, 0x4a, 0x04, 0x08, 0x13, 0x10, 0x14, 0x4a, 0x04, 0x08, 0x14, 0x10, 0x15, 0x4a, 0x04, + 0x08, 0x15, 0x10, 0x16, 0x4a, 0x04, 0x08, 0x16, 0x10, 0x17, 0x4a, 0x04, 0x08, 0x63, 0x10, 0x64, + 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x08, + 0x10, 0x09, 0x4a, 0x04, 0x08, 0x0a, 0x10, 0x0b, 0x1a, 0x97, 0x04, 0x0a, 0x0f, 0x44, 0x6f, 0x77, + 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x4a, 0x0a, 0x07, + 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, + 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, + 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x35, 0x0a, 0x0f, 0x63, 0x6f, 0x72, 0x72, + 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x09, 0x42, 0x0c, 0xfa, 0x42, 0x09, 0x92, 0x01, 0x06, 0x22, 0x04, 0x72, 0x02, 0x18, 0x64, 0x52, + 0x0e, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x1a, + 0xee, 0x02, 0x0a, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x54, 0x0a, 0x05, 0x6d, + 0x5f, 0x68, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x48, 0x44, + 0x52, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6d, 0x48, 0x64, + 0x72, 0x12, 0x5c, 0x0a, 0x0b, 0x6d, 0x61, 0x63, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x12, 0x35, 0x0a, 0x0f, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x42, 0x0c, 0xfa, 0x42, 0x09, 0x92, - 0x01, 0x06, 0x22, 0x04, 0x72, 0x02, 0x18, 0x64, 0x52, 0x0e, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x1a, 0xee, 0x02, 0x0a, 0x07, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x54, 0x0a, 0x05, 0x6d, 0x5f, 0x68, 0x64, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, - 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x6f, - 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x48, 0x44, 0x52, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, - 0x01, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6d, 0x48, 0x64, 0x72, 0x12, 0x5c, 0x0a, 0x0b, 0x6d, 0x61, - 0x63, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x3b, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, - 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, - 0x6e, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x2e, 0x4d, 0x41, 0x43, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x0a, 0x6d, 0x61, - 0x63, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x1a, 0x44, 0x0a, 0x04, 0x4d, 0x48, 0x44, 0x52, - 0x12, 0x36, 0x0a, 0x06, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x15, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, - 0x33, 0x2e, 0x4d, 0x54, 0x79, 0x70, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, - 0x01, 0x52, 0x05, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x1a, 0x5d, - 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1f, 0x0a, 0x06, - 0x66, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x08, 0xfa, 0x42, - 0x05, 0x2a, 0x03, 0x18, 0xff, 0x01, 0x52, 0x05, 0x66, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1c, 0x0a, - 0x0a, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x66, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x46, 0x43, 0x6e, 0x74, 0x4a, 0x04, 0x08, 0x01, 0x10, - 0x02, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, - 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x08, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, - 0x04, 0x08, 0x03, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x1a, 0xc9, 0x01, 0x0a, 0x0d, - 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x56, 0x0a, - 0x13, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, - 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, - 0x02, 0x10, 0x01, 0x52, 0x10, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x56, 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, - 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x10, 0x6d, 0x61, 0x78, - 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x08, 0xf2, - 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x1a, 0x64, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x06, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, - 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, - 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x06, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x1a, 0x72, 0x0a, - 0x1b, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, - 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, - 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, - 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0xcb, 0x01, 0x0a, 0x1b, - 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1a, 0xfa, 0x42, 0x17, 0x72, - 0x15, 0x32, 0x13, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, - 0x31, 0x2c, 0x33, 0x32, 0x7d, 0x24, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x39, 0x0a, - 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x41, 0x43, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x0a, 0x6d, 0x61, 0x63, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x1a, + 0x44, 0x0a, 0x04, 0x4d, 0x48, 0x44, 0x52, 0x12, 0x36, 0x0a, 0x06, 0x6d, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, + 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x54, 0x79, 0x70, 0x65, 0x42, 0x08, + 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x4a, + 0x04, 0x08, 0x02, 0x10, 0x03, 0x1a, 0x5d, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x12, 0x1f, 0x0a, 0x06, 0x66, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x2a, 0x03, 0x18, 0xff, 0x01, 0x52, 0x05, 0x66, + 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x0a, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x66, 0x5f, 0x63, + 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x46, 0x43, + 0x6e, 0x74, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, + 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x08, + 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x07, + 0x10, 0x08, 0x1a, 0xc9, 0x01, 0x0a, 0x0d, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x12, 0x56, 0x0a, 0x13, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, + 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x10, 0x6d, 0x69, 0x6e, 0x44, + 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x56, 0x0a, 0x13, + 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, + 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, + 0x10, 0x01, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x1a, 0x64, + 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x12, 0x48, 0x0a, 0x06, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, + 0x08, 0x01, 0x52, 0x06, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, + 0x08, 0x01, 0x10, 0x01, 0x1a, 0x72, 0x0a, 0x1b, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, + 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, + 0x10, 0x01, 0x22, 0xcb, 0x01, 0x0a, 0x1b, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x64, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x1a, 0xfa, 0x42, 0x17, 0x72, 0x15, 0x32, 0x13, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, + 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x32, 0x7d, 0x24, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x66, 0x72, + 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x12, + 0x35, 0x0a, 0x08, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x35, 0x0a, 0x08, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x5f, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x6f, 0x3a, - 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0xd7, 0x21, 0x0a, 0x09, 0x45, 0x6e, - 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x48, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, - 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x10, 0xfa, 0x42, 0x05, 0x8a, - 0x01, 0x02, 0x10, 0x01, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x00, 0x28, 0x01, 0x52, 0x03, 0x69, 0x64, - 0x73, 0x12, 0x43, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x42, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x00, 0x10, 0x00, 0x52, 0x09, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x43, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x00, 0x10, 0x00, - 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x18, 0x32, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, - 0x42, 0x05, 0x72, 0x03, 0x18, 0xd0, 0x0f, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x80, 0x01, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x74, 0x6e, 0x2e, - 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x42, 0x35, 0xfa, 0x42, 0x32, 0x9a, 0x01, 0x2f, 0x10, 0x0a, 0x22, 0x24, - 0x72, 0x22, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, - 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, - 0x32, 0x2c, 0x7d, 0x24, 0x2a, 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, 0x0a, 0x61, 0x74, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x4c, 0x0a, 0x0b, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, - 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, - 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x35, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x40, 0x52, 0x10, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0xc5, 0x01, 0x0a, - 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x8e, 0x01, - 0xfa, 0x42, 0x8a, 0x01, 0x72, 0x87, 0x01, 0x32, 0x84, 0x01, 0x5e, 0x28, 0x3f, 0x3a, 0x28, 0x3f, - 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7c, 0x5b, 0x61, 0x2d, - 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, - 0x2d, 0x39, 0x5c, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, - 0x5d, 0x29, 0x5c, 0x2e, 0x29, 0x2a, 0x28, 0x3f, 0x3a, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, - 0x30, 0x2d, 0x39, 0x5d, 0x7c, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, - 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5c, 0x2d, 0x5d, 0x2a, 0x5b, 0x41, - 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x28, 0x3f, 0x3a, 0x3a, 0x5b, 0x30, - 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x35, 0x7d, 0x29, 0x3f, 0x24, 0x7c, 0x5e, 0x24, 0x52, 0x14, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x41, 0x0a, 0x18, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x6b, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x18, 0x2f, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0x80, 0x10, - 0x52, 0x15, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4b, - 0x65, 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0xcd, 0x01, 0x0a, 0x1a, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x8e, 0x01, 0xfa, - 0x42, 0x8a, 0x01, 0x72, 0x87, 0x01, 0x32, 0x84, 0x01, 0x5e, 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x3a, - 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7c, 0x5b, 0x61, 0x2d, 0x7a, - 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, - 0x39, 0x5c, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, - 0x29, 0x5c, 0x2e, 0x29, 0x2a, 0x28, 0x3f, 0x3a, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, - 0x2d, 0x39, 0x5d, 0x7c, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x5b, - 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5c, 0x2d, 0x5d, 0x2a, 0x5b, 0x41, 0x2d, - 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x28, 0x3f, 0x3a, 0x3a, 0x5b, 0x30, 0x2d, - 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x35, 0x7d, 0x29, 0x3f, 0x24, 0x7c, 0x5e, 0x24, 0x52, 0x18, 0x61, - 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x49, 0x0a, 0x1c, 0x61, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6b, 0x65, - 0x6b, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x30, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, - 0x42, 0x05, 0x72, 0x03, 0x18, 0x80, 0x10, 0x52, 0x19, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4b, 0x65, 0x6b, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x12, 0x3b, 0x0a, 0x15, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x31, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x64, 0x52, 0x13, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x64, 0x12, - 0xbf, 0x01, 0x0a, 0x13, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x42, 0x8e, 0x01, - 0xfa, 0x42, 0x8a, 0x01, 0x72, 0x87, 0x01, 0x32, 0x84, 0x01, 0x5e, 0x28, 0x3f, 0x3a, 0x28, 0x3f, - 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7c, 0x5b, 0x61, 0x2d, - 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, - 0x2d, 0x39, 0x5c, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, - 0x5d, 0x29, 0x5c, 0x2e, 0x29, 0x2a, 0x28, 0x3f, 0x3a, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, - 0x30, 0x2d, 0x39, 0x5d, 0x7c, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, - 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5c, 0x2d, 0x5d, 0x2a, 0x5b, 0x41, - 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x28, 0x3f, 0x3a, 0x3a, 0x5b, 0x30, - 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x35, 0x7d, 0x29, 0x3f, 0x24, 0x7c, 0x5e, 0x24, 0x52, 0x11, - 0x6a, 0x6f, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x74, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, - 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, - 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x2c, - 0xfa, 0x42, 0x29, 0x9a, 0x01, 0x26, 0x22, 0x24, 0x72, 0x22, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, - 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, - 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0x52, 0x09, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x31, 0x0a, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, - 0x72, 0x65, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, - 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x69, 0x63, 0x74, 0x75, 0x72, - 0x65, 0x52, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x75, - 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x62, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x42, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, - 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x63, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, - 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x12, 0x4d, - 0x0a, 0x0f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, - 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x6c, - 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, - 0x13, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x5f, 0x70, 0x68, 0x79, 0x5f, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, 0x74, 0x6e, - 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x48, 0x59, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, - 0x52, 0x11, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x50, 0x68, 0x79, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x11, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, - 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x40, 0x52, 0x0f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x79, 0x50, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, - 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x12, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0c, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x23, 0x0a, - 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x13, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x6a, - 0x6f, 0x69, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x73, 0x75, 0x70, 0x70, 0x6f, - 0x72, 0x74, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x73, 0x65, 0x74, - 0x73, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x15, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x10, 0x72, 0x65, 0x73, 0x65, 0x74, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x4e, - 0x6f, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x6b, 0x65, - 0x79, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, - 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x6f, 0x6f, 0x74, 0x4b, 0x65, - 0x79, 0x73, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x12, 0xe7, 0x02, 0x0a, - 0x06, 0x6e, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0c, 0x42, 0xcf, 0x02, - 0x92, 0x41, 0x17, 0x4a, 0x08, 0x22, 0x30, 0x30, 0x30, 0x30, 0x31, 0x33, 0x22, 0x9a, 0x02, 0x01, - 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, 0x42, 0x06, 0x7a, 0x04, 0x68, - 0x03, 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, - 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, - 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, - 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, - 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, - 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, - 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, - 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, - 0x73, 0x68, 0x61, 0x6c, 0x33, 0x42, 0x79, 0x74, 0x65, 0x73, 0xf2, 0xaa, 0x19, 0xa0, 0x01, 0x1a, - 0x4e, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, - 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6d, 0x64, 0x2f, 0x74, 0x74, 0x6e, 0x2d, 0x6c, - 0x77, 0x2d, 0x63, 0x6c, 0x69, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x66, 0x6c, 0x61, 0x67, - 0x73, 0x2e, 0x4e, 0x65, 0x77, 0x33, 0x42, 0x79, 0x74, 0x65, 0x73, 0x46, 0x6c, 0x61, 0x67, 0x22, - 0x4e, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, - 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6d, 0x64, 0x2f, 0x74, 0x74, 0x6e, 0x2d, 0x6c, - 0x77, 0x2d, 0x63, 0x6c, 0x69, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x66, 0x6c, 0x61, 0x67, - 0x73, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x61, 0x63, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, - 0x05, 0x6e, 0x65, 0x74, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0c, 0x6d, 0x61, 0x63, 0x5f, 0x73, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, - 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, - 0x43, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0b, 0x6d, 0x61, 0x63, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x09, 0x6d, 0x61, 0x63, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x74, 0x6e, 0x2e, - 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x44, 0x0a, - 0x11, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x61, 0x63, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, - 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x52, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x63, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x1a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, - 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x73, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, - 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x64, 0x65, 0x76, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x44, 0x65, 0x76, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x26, - 0x0a, 0x0f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, - 0x73, 0x18, 0x1d, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x64, 0x44, 0x65, 0x76, - 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6a, - 0x6f, 0x69, 0x6e, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x25, - 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x6a, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, - 0x30, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x6a, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x30, 0x12, 0x25, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x6a, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x31, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, - 0x6c, 0x61, 0x73, 0x74, 0x52, 0x6a, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x31, 0x12, 0x58, 0x0a, 0x1b, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x64, 0x65, 0x76, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, - 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x21, 0x20, 0x01, 0x28, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x54, 0x6f, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, + 0x22, 0xd7, 0x21, 0x0a, 0x09, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x48, + 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, 0x74, + 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x73, 0x42, 0x10, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0xf2, 0xaa, 0x19, 0x04, 0x08, + 0x00, 0x28, 0x01, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x43, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x00, + 0x10, 0x00, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x43, 0x0a, + 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x17, 0x6c, - 0x61, 0x73, 0x74, 0x44, 0x65, 0x76, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x63, 0x65, - 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x4b, 0x0a, 0x0b, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, 0x74, - 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x6f, 0x77, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x0e, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, - 0x01, 0xf2, 0xaa, 0x19, 0x02, 0x10, 0x00, 0x52, 0x0a, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x70, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0f, 0xfa, 0x42, - 0x0c, 0x0a, 0x0a, 0x1d, 0x00, 0x00, 0x80, 0x3f, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x52, 0x11, 0x62, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, - 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x6d, 0x61, 0x72, - 0x67, 0x69, 0x6e, 0x18, 0x24, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x64, 0x6f, 0x77, 0x6e, 0x6c, - 0x69, 0x6e, 0x6b, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x12, 0x65, 0x0a, 0x1c, 0x71, 0x75, 0x65, - 0x75, 0x65, 0x64, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x28, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, - 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x77, 0x6e, - 0x6c, 0x69, 0x6e, 0x6b, 0x52, 0x1a, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x41, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x73, - 0x12, 0x48, 0x0a, 0x0a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x73, 0x18, 0x29, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, - 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0a, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x73, 0x12, 0x51, 0x0a, 0x0e, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x2a, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x2a, 0xfa, 0x42, 0x27, 0x72, 0x25, 0x18, 0x24, 0x32, 0x21, 0x5e, 0x5b, 0x61, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x08, 0xf2, + 0xaa, 0x19, 0x04, 0x08, 0x00, 0x10, 0x00, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x32, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x2a, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xd0, 0x0f, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x80, 0x01, 0x0a, 0x0a, + 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x29, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x41, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x35, 0xfa, 0x42, 0x32, + 0x9a, 0x01, 0x2f, 0x10, 0x0a, 0x22, 0x24, 0x72, 0x22, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, - 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0x7c, 0x5e, 0x24, 0x52, 0x0d, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x44, 0x0a, - 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x73, 0x74, - 0x18, 0x2d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x73, - 0x74, 0x12, 0x67, 0x0a, 0x19, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x65, - 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x2e, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, - 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, - 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, - 0x65, 0x52, 0x17, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x6b, - 0x69, 0x70, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x72, 0x79, 0x70, 0x74, - 0x6f, 0x18, 0x33, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x73, 0x6b, 0x69, 0x70, 0x50, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x12, 0x5b, 0x0a, 0x1c, 0x73, 0x6b, - 0x69, 0x70, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x72, 0x79, 0x70, 0x74, - 0x6f, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x19, 0x73, 0x6b, - 0x69, 0x70, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4f, - 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, - 0x65, 0x65, 0x6e, 0x5f, 0x61, 0x74, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, - 0x65, 0x6e, 0x41, 0x74, 0x12, 0x4f, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x37, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2a, 0xfa, 0x42, 0x27, - 0x72, 0x25, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, - 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, - 0x32, 0x2c, 0x7d, 0x24, 0xd0, 0x01, 0x01, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x69, 0x0a, 0x19, 0x6c, 0x6f, 0x72, 0x61, 0x5f, 0x61, 0x6c, - 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, - 0x64, 0x73, 0x18, 0x38, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, - 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x6f, 0x52, 0x61, 0x41, 0x6c, - 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x16, 0x6c, 0x6f, 0x72, 0x61, 0x41, 0x6c, - 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x73, - 0x1a, 0x3d, 0x0a, 0x0f, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x56, 0x0a, 0x0e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, - 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, - 0x01, 0x4a, 0x04, 0x08, 0x25, 0x10, 0x26, 0x4a, 0x04, 0x08, 0x26, 0x10, 0x27, 0x4a, 0x04, 0x08, - 0x27, 0x10, 0x28, 0x22, 0x48, 0x0a, 0x0a, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x12, 0x3a, 0x0a, 0x0b, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, - 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x0a, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0xf2, 0x01, - 0x0a, 0x0d, 0x44, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, - 0xc8, 0x01, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x42, 0xac, 0x01, 0x92, 0x41, 0x19, 0x4a, 0x0a, 0x22, 0x32, 0x36, 0x30, 0x30, 0x41, - 0x42, 0x43, 0x44, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0xfa, 0x42, 0x06, 0x7a, 0x04, 0x68, 0x04, 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, + 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0x2a, 0x05, 0x72, 0x03, 0x18, + 0xc8, 0x01, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x4c, + 0x0a, 0x0b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, + 0x52, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x35, 0x0a, 0x12, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, + 0x40, 0x52, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x49, 0x64, 0x12, 0xc5, 0x01, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x8e, 0x01, 0xfa, 0x42, 0x8a, 0x01, 0x72, 0x87, 0x01, 0x32, 0x84, + 0x01, 0x5e, 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, + 0x2d, 0x39, 0x5d, 0x7c, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x5b, + 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5c, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, 0x2d, + 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x5c, 0x2e, 0x29, 0x2a, 0x28, 0x3f, 0x3a, + 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x7c, 0x5b, 0x41, 0x2d, 0x5a, + 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, + 0x39, 0x5c, 0x2d, 0x5d, 0x2a, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, + 0x29, 0x28, 0x3f, 0x3a, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x35, 0x7d, 0x29, + 0x3f, 0x24, 0x7c, 0x5e, 0x24, 0x52, 0x14, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x41, 0x0a, 0x18, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6b, 0x65, + 0x6b, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, + 0x42, 0x05, 0x72, 0x03, 0x18, 0x80, 0x10, 0x52, 0x15, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4b, 0x65, 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0xcd, + 0x01, 0x0a, 0x1a, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x8e, 0x01, 0xfa, 0x42, 0x8a, 0x01, 0x72, 0x87, 0x01, 0x32, 0x84, 0x01, + 0x5e, 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, + 0x39, 0x5d, 0x7c, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x5b, 0x61, + 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5c, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, + 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x5c, 0x2e, 0x29, 0x2a, 0x28, 0x3f, 0x3a, 0x5b, + 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x7c, 0x5b, 0x41, 0x2d, 0x5a, 0x61, + 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, + 0x5c, 0x2d, 0x5d, 0x2a, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, + 0x28, 0x3f, 0x3a, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x35, 0x7d, 0x29, 0x3f, + 0x24, 0x7c, 0x5e, 0x24, 0x52, 0x18, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x49, + 0x0a, 0x1c, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x6b, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x30, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0x80, 0x10, 0x52, 0x19, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x4b, 0x65, 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x3b, 0x0a, 0x15, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x31, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, + 0x64, 0x52, 0x13, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x49, 0x64, 0x12, 0xbf, 0x01, 0x0a, 0x13, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x8e, 0x01, 0xfa, 0x42, 0x8a, 0x01, 0x72, 0x87, 0x01, 0x32, 0x84, + 0x01, 0x5e, 0x28, 0x3f, 0x3a, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, + 0x2d, 0x39, 0x5d, 0x7c, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x5b, + 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5c, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, 0x2d, + 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x5c, 0x2e, 0x29, 0x2a, 0x28, 0x3f, 0x3a, + 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x7c, 0x5b, 0x41, 0x2d, 0x5a, + 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, + 0x39, 0x5c, 0x2d, 0x5d, 0x2a, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, + 0x29, 0x28, 0x3f, 0x3a, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x35, 0x7d, 0x29, + 0x3f, 0x24, 0x7c, 0x5e, 0x24, 0x52, 0x11, 0x6a, 0x6f, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x74, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, + 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x2c, 0xfa, 0x42, 0x29, 0x9a, 0x01, 0x26, 0x22, 0x24, 0x72, + 0x22, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, + 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, + 0x2c, 0x7d, 0x24, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x31, + 0x0a, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x50, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x52, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, + 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x5f, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x42, 0x12, 0x28, 0x0a, 0x10, 0x73, + 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x63, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x43, 0x12, 0x4d, 0x0a, 0x0f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, + 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, + 0x4d, 0x41, 0x43, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, + 0x01, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x13, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x5f, + 0x70, 0x68, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, + 0x76, 0x33, 0x2e, 0x50, 0x48, 0x59, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, + 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x11, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x50, 0x68, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x11, 0x66, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x40, 0x52, 0x0f, + 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x12, + 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, + 0x18, 0x12, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6d, 0x61, 0x78, + 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0c, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x2c, + 0x0a, 0x12, 0x72, 0x65, 0x73, 0x65, 0x74, 0x73, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x6e, 0x6f, + 0x6e, 0x63, 0x65, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x72, 0x65, 0x73, 0x65, + 0x74, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x09, + 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x52, 0x6f, 0x6f, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x4b, + 0x65, 0x79, 0x73, 0x12, 0xe7, 0x02, 0x0a, 0x06, 0x6e, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x17, + 0x20, 0x01, 0x28, 0x0c, 0x42, 0xcf, 0x02, 0x92, 0x41, 0x17, 0x4a, 0x08, 0x22, 0x30, 0x30, 0x30, + 0x30, 0x31, 0x33, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0xfa, 0x42, 0x06, 0x7a, 0x04, 0x68, 0x03, 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, @@ -5374,17 +5907,278 @@ var file_ttn_lorawan_v3_end_device_proto_rawDesc = []byte{ 0x12, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x34, 0x42, 0x79, 0x74, 0x65, - 0x73, 0x52, 0x07, 0x64, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65, - 0x6e, 0x67, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x22, 0x5c, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x64, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0a, - 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, - 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, - 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x22, 0x97, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x64, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0a, 0x65, + 0x73, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x33, 0x42, 0x79, 0x74, 0x65, + 0x73, 0xf2, 0xaa, 0x19, 0xa0, 0x01, 0x1a, 0x4e, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, + 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6d, + 0x64, 0x2f, 0x74, 0x74, 0x6e, 0x2d, 0x6c, 0x77, 0x2d, 0x63, 0x6c, 0x69, 0x2f, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2e, 0x4e, 0x65, 0x77, 0x33, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x46, 0x6c, 0x61, 0x67, 0x22, 0x4e, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, + 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6d, + 0x64, 0x2f, 0x74, 0x74, 0x6e, 0x2d, 0x6c, 0x77, 0x2d, 0x63, 0x6c, 0x69, 0x2f, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x61, 0x63, + 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x05, 0x6e, 0x65, 0x74, 0x49, 0x64, 0x12, 0x3e, 0x0a, + 0x0c, 0x6d, 0x61, 0x63, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x18, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x0b, 0x6d, 0x61, 0x63, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, + 0x09, 0x6d, 0x61, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x63, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x44, 0x0a, 0x11, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, + 0x6d, 0x61, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x4d, 0x41, 0x43, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x4d, 0x61, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x73, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x74, + 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, + 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x0e, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x24, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x64, 0x65, 0x76, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, + 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x44, 0x65, 0x76, + 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x64, 0x65, + 0x76, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x1d, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0d, + 0x75, 0x73, 0x65, 0x64, 0x44, 0x65, 0x76, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x26, 0x0a, + 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, + 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x4a, 0x6f, 0x69, 0x6e, + 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x6a, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x30, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, + 0x6c, 0x61, 0x73, 0x74, 0x52, 0x6a, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x30, 0x12, 0x25, 0x0a, 0x0f, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x6a, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x31, 0x18, + 0x20, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x6a, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x31, 0x12, 0x58, 0x0a, 0x1b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x64, 0x65, 0x76, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x17, 0x6c, 0x61, 0x73, 0x74, 0x44, 0x65, 0x76, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x4b, 0x0a, + 0x0b, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x22, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x0e, + 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0xf2, 0xaa, 0x19, 0x02, 0x10, 0x00, 0x52, 0x0a, + 0x70, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x62, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, + 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x42, 0x0f, 0xfa, 0x42, 0x0c, 0x0a, 0x0a, 0x1d, 0x00, 0x00, 0x80, 0x3f, 0x2d, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x11, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x50, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, + 0x69, 0x6e, 0x6b, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x18, 0x24, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0e, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x12, 0x65, 0x0a, 0x1c, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x73, + 0x18, 0x28, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x52, 0x1a, 0x71, 0x75, 0x65, + 0x75, 0x65, 0x64, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x6f, + 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x12, 0x48, 0x0a, 0x0a, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x73, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, + 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x73, 0x12, 0x51, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2a, 0xfa, 0x42, 0x27, 0x72, 0x25, + 0x18, 0x24, 0x32, 0x21, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, + 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, + 0x7d, 0x24, 0x7c, 0x5e, 0x24, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x44, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x63, 0x61, 0x73, 0x74, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x73, 0x74, 0x12, 0x67, 0x0a, 0x19, 0x63, 0x6c, 0x61, 0x69, + 0x6d, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x74, + 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x17, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x41, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, + 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x18, 0x33, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, + 0x73, 0x6b, 0x69, 0x70, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x72, 0x79, 0x70, 0x74, + 0x6f, 0x12, 0x5b, 0x0a, 0x1c, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, + 0x65, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x19, 0x73, 0x6b, 0x69, 0x70, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x3d, + 0x0a, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x35, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3c, 0x0a, + 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x61, 0x74, 0x18, 0x36, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x41, 0x74, 0x12, 0x4f, 0x0a, 0x0d, 0x73, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x37, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x2a, 0xfa, 0x42, 0x27, 0x72, 0x25, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, + 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, + 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0xd0, 0x01, 0x01, 0x52, 0x0c, + 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x69, 0x0a, 0x19, + 0x6c, 0x6f, 0x72, 0x61, 0x5f, 0x61, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x38, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2e, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x4c, 0x6f, 0x52, 0x61, 0x41, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, + 0x16, 0x6c, 0x6f, 0x72, 0x61, 0x41, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x41, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x56, 0x0a, 0x0e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x74, 0x6e, 0x2e, + 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x08, + 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x4a, 0x04, 0x08, 0x25, 0x10, 0x26, 0x4a, 0x04, + 0x08, 0x26, 0x10, 0x27, 0x4a, 0x04, 0x08, 0x27, 0x10, 0x28, 0x22, 0x48, 0x0a, 0x0a, 0x45, 0x6e, + 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x0b, 0x65, 0x6e, 0x64, 0x5f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, + 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0a, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x22, 0xf2, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, + 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0xc8, 0x01, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0xac, 0x01, 0x92, 0x41, 0x19, 0x4a, + 0x0a, 0x22, 0x32, 0x36, 0x30, 0x30, 0x41, 0x42, 0x43, 0x44, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, + 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, 0x42, 0x06, 0x7a, 0x04, 0x68, 0x04, 0x70, + 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, + 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, + 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x48, + 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, + 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, + 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, + 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, + 0x61, 0x6c, 0x34, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x07, 0x64, 0x65, 0x76, 0x41, 0x64, 0x64, + 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x5c, 0x0a, 0x16, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, + 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x09, 0x65, 0x6e, + 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x97, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x09, 0x65, 0x6e, 0x64, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, + 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, + 0x6b, 0x22, 0xa8, 0x02, 0x0a, 0x23, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, + 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x65, 0x0a, 0x07, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4b, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, + 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, + 0x1a, 0x99, 0x01, 0x0a, 0x17, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x61, + 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x40, 0x0a, 0x03, + 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, + 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, + 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x3c, + 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x61, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x41, 0x74, 0x22, 0xa6, 0x01, 0x0a, + 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x0e, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, + 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, + 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x65, 0x6e, + 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0xcb, 0x03, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x73, 0x46, 0x6f, 0x72, 0x45, 0x55, 0x49, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0xd0, 0x01, 0x0a, 0x08, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x42, 0xb4, 0x01, 0x92, 0x41, 0x21, 0x4a, 0x12, 0x22, 0x37, 0x30, 0x42, 0x33, 0x44, + 0x35, 0x37, 0x45, 0x44, 0x30, 0x30, 0x30, 0x41, 0x42, 0x43, 0x44, 0x22, 0x9a, 0x02, 0x01, 0x07, + 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, 0x42, 0x06, 0x7a, 0x04, 0x68, 0x08, + 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, + 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, + 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, + 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, + 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, + 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, + 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, + 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, + 0x68, 0x61, 0x6c, 0x38, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x07, 0x6a, 0x6f, 0x69, 0x6e, 0x45, + 0x75, 0x69, 0x12, 0xce, 0x01, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x42, 0xb4, 0x01, 0x92, 0x41, 0x21, 0x4a, 0x12, 0x22, 0x37, 0x30, 0x42, + 0x33, 0x44, 0x35, 0x37, 0x45, 0x44, 0x30, 0x30, 0x30, 0x41, 0x42, 0x43, 0x44, 0x22, 0x9a, 0x02, + 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, 0x42, 0x06, 0x7a, 0x04, + 0x68, 0x08, 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, + 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, + 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, + 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x72, 0x73, 0x68, + 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x67, 0x6f, 0x2e, 0x74, + 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, + 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x6d, 0x61, + 0x72, 0x73, 0x68, 0x61, 0x6c, 0x38, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x06, 0x64, 0x65, 0x76, + 0x45, 0x75, 0x69, 0x22, 0x97, 0x03, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4f, 0x0a, + 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x0e, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x39, + 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x09, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0xbd, 0x01, 0x0a, 0x05, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0xa6, 0x01, 0xfa, 0x42, 0xa2, 0x01, + 0x72, 0x9f, 0x01, 0x52, 0x00, 0x52, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x52, 0x0a, 0x2d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x52, 0x08, 0x6a, 0x6f, + 0x69, 0x6e, 0x5f, 0x65, 0x75, 0x69, 0x52, 0x09, 0x2d, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x65, 0x75, + 0x69, 0x52, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x52, 0x08, 0x2d, 0x64, 0x65, 0x76, + 0x5f, 0x65, 0x75, 0x69, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x05, 0x2d, 0x6e, 0x61, 0x6d, + 0x65, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, + 0x2d, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x52, 0x0b, 0x2d, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, + 0x5f, 0x61, 0x74, 0x52, 0x0d, 0x2d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, + 0x61, 0x74, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x2a, 0x03, 0x18, + 0xe8, 0x07, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x22, 0x94, 0x01, + 0x0a, 0x13, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, + 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x09, + 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x4d, 0x61, 0x73, 0x6b, 0x22, 0xae, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x73, 0x65, 0x74, 0x41, 0x6e, + 0x64, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x0e, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, + 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, + 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x65, 0x6e, + 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0xbc, 0x01, 0x0a, 0x11, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, @@ -5392,206 +6186,92 @@ var file_ttn_lorawan_v3_end_device_proto_rawDesc = []byte{ 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, - 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0xa8, 0x02, 0x0a, 0x23, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x65, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x4b, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, - 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x1a, 0x99, 0x01, 0x0a, 0x17, 0x45, 0x6e, - 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x40, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, - 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, - 0x10, 0x01, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x53, - 0x65, 0x65, 0x6e, 0x41, 0x74, 0x22, 0xa6, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x54, 0x0a, - 0x0e, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, - 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, - 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, - 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, - 0x61, 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0xcb, - 0x03, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x46, 0x6f, 0x72, 0x45, 0x55, 0x49, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xd0, 0x01, 0x0a, 0x08, 0x6a, 0x6f, 0x69, - 0x6e, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0xb4, 0x01, 0x92, 0x41, - 0x21, 0x4a, 0x12, 0x22, 0x37, 0x30, 0x42, 0x33, 0x44, 0x35, 0x37, 0x45, 0x44, 0x30, 0x30, 0x30, - 0x41, 0x42, 0x43, 0x44, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0xfa, 0x42, 0x06, 0x7a, 0x04, 0x68, 0x08, 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, - 0x0a, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, - 0x73, 0x12, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x38, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x52, 0x07, 0x6a, 0x6f, 0x69, 0x6e, 0x45, 0x75, 0x69, 0x12, 0xce, 0x01, 0x0a, 0x07, - 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0xb4, 0x01, - 0x92, 0x41, 0x21, 0x4a, 0x12, 0x22, 0x37, 0x30, 0x42, 0x33, 0x44, 0x35, 0x37, 0x45, 0x44, 0x30, - 0x30, 0x30, 0x41, 0x42, 0x43, 0x44, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0xfa, 0x42, 0x06, 0x7a, 0x04, 0x68, 0x08, 0x70, 0x01, 0xea, 0xaa, 0x19, - 0x82, 0x01, 0x0a, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, - 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, - 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, - 0x74, 0x65, 0x73, 0x12, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, - 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, - 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x38, 0x42, - 0x79, 0x74, 0x65, 0x73, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x22, 0x97, 0x03, 0x0a, - 0x15, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4f, 0x0a, 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, - 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x28, 0x0a, 0x0b, 0x6d, 0x61, + 0x70, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x64, 0x52, 0x0a, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x4b, 0x65, 0x79, 0x22, 0xb8, 0x01, 0x0a, 0x17, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x64, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x0f, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x09, 0x42, 0x2b, 0xfa, 0x42, 0x28, 0x92, 0x01, 0x25, 0x10, 0x64, 0x18, 0x01, 0x22, 0x1f, + 0x72, 0x1d, 0x32, 0x1b, 0x5e, 0x28, 0x3f, 0x3a, 0x5c, 0x2e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, + 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x31, 0x36, 0x7d, 0x29, 0x7b, 0x31, 0x2c, 0x32, 0x7d, 0x24, 0x52, + 0x0e, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0xfe, 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x12, 0x7d, 0x0a, 0x07, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, + 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, + 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x42, 0x2c, 0xfa, 0x42, 0x29, 0x9a, 0x01, 0x26, 0x22, 0x24, 0x72, 0x22, + 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, + 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, + 0x7d, 0x24, 0x52, 0x07, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x1a, 0x63, 0x0a, 0x0c, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, + 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, + 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0xdd, 0x01, 0x0a, 0x1f, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x45, 0x6e, 0x64, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x09, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xfa, 0x42, 0x24, 0x72, 0x22, 0x18, 0x24, + 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x2d, + 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, + 0x52, 0x08, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x60, + 0x0a, 0x16, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, + 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, + 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x13, 0x65, 0x6e, 0x64, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, + 0x22, 0xca, 0x01, 0x0a, 0x1c, 0x42, 0x61, 0x74, 0x63, 0x68, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x59, 0x0a, 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x4f, 0x0a, 0x0a, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x42, 0x30, 0xfa, 0x42, 0x2d, 0x92, 0x01, 0x2a, 0x08, 0x01, 0x10, 0x14, 0x22, 0x24, 0x72, 0x22, + 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, + 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, + 0x7d, 0x24, 0x52, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x73, 0x22, 0xa8, 0x02, + 0x0a, 0x19, 0x42, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x59, 0x0a, 0x0f, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, + 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, + 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x4f, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x30, 0xfa, 0x42, 0x2d, 0x92, + 0x01, 0x2a, 0x08, 0x01, 0x10, 0x14, 0x22, 0x24, 0x72, 0x22, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, + 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, + 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0x52, 0x09, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, - 0x73, 0x6b, 0x12, 0xbd, 0x01, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x42, 0xa6, 0x01, 0xfa, 0x42, 0xa2, 0x01, 0x72, 0x9f, 0x01, 0x52, 0x00, 0x52, 0x09, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x52, 0x0a, 0x2d, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x52, 0x08, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x65, 0x75, 0x69, 0x52, - 0x09, 0x2d, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x65, 0x75, 0x69, 0x52, 0x07, 0x64, 0x65, 0x76, 0x5f, - 0x65, 0x75, 0x69, 0x52, 0x08, 0x2d, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x52, 0x05, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x2d, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, - 0x74, 0x52, 0x0b, 0x2d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x52, 0x0c, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x61, 0x74, 0x52, 0x0d, 0x2d, 0x6c, - 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x61, 0x74, 0x52, 0x05, 0x6f, 0x72, 0x64, - 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0d, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x2a, 0x03, 0x18, 0xe8, 0x07, 0x52, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x45, 0x6e, - 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, - 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, - 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x08, 0xfa, - 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, - 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0xae, 0x01, - 0x0a, 0x1b, 0x52, 0x65, 0x73, 0x65, 0x74, 0x41, 0x6e, 0x64, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x54, 0x0a, - 0x0e, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, - 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, - 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, - 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, - 0x61, 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0xbc, - 0x01, 0x0a, 0x11, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, - 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x09, 0x65, - 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, - 0x61, 0x73, 0x6b, 0x12, 0x28, 0x0a, 0x0b, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, - 0x64, 0x52, 0x0a, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x22, 0xb8, 0x01, - 0x0a, 0x17, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x64, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, - 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x0f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, 0x2b, 0xfa, 0x42, 0x28, - 0x92, 0x01, 0x25, 0x10, 0x64, 0x18, 0x01, 0x22, 0x1f, 0x72, 0x1d, 0x32, 0x1b, 0x5e, 0x28, 0x3f, - 0x3a, 0x5c, 0x2e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x31, 0x36, - 0x7d, 0x29, 0x7b, 0x31, 0x2c, 0x32, 0x7d, 0x24, 0x52, 0x0e, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xfe, 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x64, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x46, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x73, 0x12, 0x7d, 0x0a, 0x07, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, - 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, - 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x2c, 0xfa, - 0x42, 0x29, 0x9a, 0x01, 0x26, 0x22, 0x24, 0x72, 0x22, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, - 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, - 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0x52, 0x07, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x73, 0x1a, 0x63, 0x0a, 0x0c, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, - 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xdd, 0x01, 0x0a, 0x1f, 0x43, 0x6f, - 0x6e, 0x76, 0x65, 0x72, 0x74, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x44, 0x0a, - 0x09, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x27, 0xfa, 0x42, 0x24, 0x72, 0x22, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, - 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, - 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0x52, 0x08, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x60, 0x0a, 0x16, 0x65, 0x6e, 0x64, 0x5f, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, - 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x73, 0x52, 0x13, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x22, 0xca, 0x01, 0x0a, 0x1c, 0x42, 0x61, - 0x74, 0x63, 0x68, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x59, 0x0a, 0x0f, 0x61, 0x70, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, - 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, - 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x4f, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x30, 0xfa, 0x42, 0x2d, 0x92, 0x01, - 0x2a, 0x08, 0x01, 0x10, 0x14, 0x22, 0x24, 0x72, 0x22, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, - 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, - 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0x52, 0x09, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x64, 0x73, 0x22, 0xa8, 0x02, 0x0a, 0x19, 0x42, 0x61, 0x74, 0x63, 0x68, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x59, 0x0a, 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, - 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, - 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, - 0x4f, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x42, 0x30, 0xfa, 0x42, 0x2d, 0x92, 0x01, 0x2a, 0x08, 0x01, 0x10, 0x14, 0x22, - 0x24, 0x72, 0x22, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, - 0x28, 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, - 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0x52, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x73, - 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, - 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x4a, 0x04, 0x08, 0x04, 0x10, - 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x52, 0x05, 0x6f, - 0x72, 0x64, 0x65, 0x72, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x04, 0x70, 0x61, 0x67, - 0x65, 0x2a, 0x55, 0x0a, 0x0a, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x11, 0x0a, 0x0d, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, - 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x42, 0x41, 0x54, 0x54, - 0x45, 0x52, 0x59, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x45, - 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x02, 0x1a, 0x0d, 0xea, 0xaa, 0x19, 0x09, 0x18, - 0x01, 0x2a, 0x05, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x6f, 0x2e, 0x74, - 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, - 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x74, 0x6e, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x73, 0x6b, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, + 0x08, 0x06, 0x10, 0x07, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x2a, 0x55, 0x0a, 0x0a, 0x50, 0x6f, 0x77, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x4f, 0x57, + 0x45, 0x52, 0x5f, 0x42, 0x41, 0x54, 0x54, 0x45, 0x52, 0x59, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, + 0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x02, + 0x1a, 0x0d, 0xea, 0xaa, 0x19, 0x09, 0x18, 0x01, 0x2a, 0x05, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x42, + 0x31, 0x5a, 0x2f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x74, 0x6e, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5607,272 +6287,308 @@ func file_ttn_lorawan_v3_end_device_proto_rawDescGZIP() []byte { } var file_ttn_lorawan_v3_end_device_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_ttn_lorawan_v3_end_device_proto_msgTypes = make([]protoimpl.MessageInfo, 49) +var file_ttn_lorawan_v3_end_device_proto_msgTypes = make([]protoimpl.MessageInfo, 55) var file_ttn_lorawan_v3_end_device_proto_goTypes = []interface{}{ (PowerState)(0), // 0: ttn.lorawan.v3.PowerState (*Session)(nil), // 1: ttn.lorawan.v3.Session (*BoolValue)(nil), // 2: ttn.lorawan.v3.BoolValue - (*MACParameters)(nil), // 3: ttn.lorawan.v3.MACParameters - (*EndDeviceVersion)(nil), // 4: ttn.lorawan.v3.EndDeviceVersion - (*ADRSettings)(nil), // 5: ttn.lorawan.v3.ADRSettings - (*MACSettings)(nil), // 6: ttn.lorawan.v3.MACSettings - (*MACState)(nil), // 7: ttn.lorawan.v3.MACState - (*EndDeviceAuthenticationCode)(nil), // 8: ttn.lorawan.v3.EndDeviceAuthenticationCode - (*EndDevice)(nil), // 9: ttn.lorawan.v3.EndDevice - (*EndDevices)(nil), // 10: ttn.lorawan.v3.EndDevices - (*DevAddrPrefix)(nil), // 11: ttn.lorawan.v3.DevAddrPrefix - (*CreateEndDeviceRequest)(nil), // 12: ttn.lorawan.v3.CreateEndDeviceRequest - (*UpdateEndDeviceRequest)(nil), // 13: ttn.lorawan.v3.UpdateEndDeviceRequest - (*BatchUpdateEndDeviceLastSeenRequest)(nil), // 14: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest - (*GetEndDeviceRequest)(nil), // 15: ttn.lorawan.v3.GetEndDeviceRequest - (*GetEndDeviceIdentifiersForEUIsRequest)(nil), // 16: ttn.lorawan.v3.GetEndDeviceIdentifiersForEUIsRequest - (*ListEndDevicesRequest)(nil), // 17: ttn.lorawan.v3.ListEndDevicesRequest - (*SetEndDeviceRequest)(nil), // 18: ttn.lorawan.v3.SetEndDeviceRequest - (*ResetAndGetEndDeviceRequest)(nil), // 19: ttn.lorawan.v3.ResetAndGetEndDeviceRequest - (*EndDeviceTemplate)(nil), // 20: ttn.lorawan.v3.EndDeviceTemplate - (*EndDeviceTemplateFormat)(nil), // 21: ttn.lorawan.v3.EndDeviceTemplateFormat - (*EndDeviceTemplateFormats)(nil), // 22: ttn.lorawan.v3.EndDeviceTemplateFormats - (*ConvertEndDeviceTemplateRequest)(nil), // 23: ttn.lorawan.v3.ConvertEndDeviceTemplateRequest - (*BatchDeleteEndDevicesRequest)(nil), // 24: ttn.lorawan.v3.BatchDeleteEndDevicesRequest - (*BatchGetEndDevicesRequest)(nil), // 25: ttn.lorawan.v3.BatchGetEndDevicesRequest - (*MACParameters_Channel)(nil), // 26: ttn.lorawan.v3.MACParameters.Channel - (*ADRSettings_StaticMode)(nil), // 27: ttn.lorawan.v3.ADRSettings.StaticMode - (*ADRSettings_DynamicMode)(nil), // 28: ttn.lorawan.v3.ADRSettings.DynamicMode - (*ADRSettings_DisabledMode)(nil), // 29: ttn.lorawan.v3.ADRSettings.DisabledMode - (*ADRSettings_DynamicMode_ChannelSteeringSettings)(nil), // 30: ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings - (*ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode)(nil), // 31: ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.LoRaNarrowMode - (*ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode)(nil), // 32: ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.DisabledMode - (*MACState_JoinRequest)(nil), // 33: ttn.lorawan.v3.MACState.JoinRequest - (*MACState_JoinAccept)(nil), // 34: ttn.lorawan.v3.MACState.JoinAccept - (*MACState_UplinkMessage)(nil), // 35: ttn.lorawan.v3.MACState.UplinkMessage - (*MACState_DownlinkMessage)(nil), // 36: ttn.lorawan.v3.MACState.DownlinkMessage - (*MACState_DataRateRange)(nil), // 37: ttn.lorawan.v3.MACState.DataRateRange - (*MACState_DataRateRanges)(nil), // 38: ttn.lorawan.v3.MACState.DataRateRanges - nil, // 39: ttn.lorawan.v3.MACState.RejectedDataRateRangesEntry - (*MACState_UplinkMessage_TxSettings)(nil), // 40: ttn.lorawan.v3.MACState.UplinkMessage.TxSettings - (*MACState_UplinkMessage_RxMetadata)(nil), // 41: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata - (*MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata)(nil), // 42: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.PacketBrokerMetadata - (*MACState_DownlinkMessage_Message)(nil), // 43: ttn.lorawan.v3.MACState.DownlinkMessage.Message - (*MACState_DownlinkMessage_Message_MHDR)(nil), // 44: ttn.lorawan.v3.MACState.DownlinkMessage.Message.MHDR - (*MACState_DownlinkMessage_Message_MACPayload)(nil), // 45: ttn.lorawan.v3.MACState.DownlinkMessage.Message.MACPayload - nil, // 46: ttn.lorawan.v3.EndDevice.AttributesEntry - nil, // 47: ttn.lorawan.v3.EndDevice.LocationsEntry - (*BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate)(nil), // 48: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest.EndDeviceLastSeenUpdate - nil, // 49: ttn.lorawan.v3.EndDeviceTemplateFormats.FormatsEntry - (*SessionKeys)(nil), // 50: ttn.lorawan.v3.SessionKeys - (*timestamppb.Timestamp)(nil), // 51: google.protobuf.Timestamp - (*ApplicationDownlink)(nil), // 52: ttn.lorawan.v3.ApplicationDownlink - (DataRateIndex)(0), // 53: ttn.lorawan.v3.DataRateIndex - (RxDelay)(0), // 54: ttn.lorawan.v3.RxDelay - (DataRateOffset)(0), // 55: ttn.lorawan.v3.DataRateOffset - (AggregatedDutyCycle)(0), // 56: ttn.lorawan.v3.AggregatedDutyCycle - (RejoinTimeExponent)(0), // 57: ttn.lorawan.v3.RejoinTimeExponent - (RejoinCountExponent)(0), // 58: ttn.lorawan.v3.RejoinCountExponent - (*ADRAckLimitExponentValue)(nil), // 59: ttn.lorawan.v3.ADRAckLimitExponentValue - (*ADRAckDelayExponentValue)(nil), // 60: ttn.lorawan.v3.ADRAckDelayExponentValue - (*DataRateIndexValue)(nil), // 61: ttn.lorawan.v3.DataRateIndexValue - (*EndDeviceVersionIdentifiers)(nil), // 62: ttn.lorawan.v3.EndDeviceVersionIdentifiers - (MACVersion)(0), // 63: ttn.lorawan.v3.MACVersion - (PHYVersion)(0), // 64: ttn.lorawan.v3.PHYVersion - (*MessagePayloadFormatters)(nil), // 65: ttn.lorawan.v3.MessagePayloadFormatters - (*durationpb.Duration)(nil), // 66: google.protobuf.Duration - (*PingSlotPeriodValue)(nil), // 67: ttn.lorawan.v3.PingSlotPeriodValue - (*ZeroableFrequencyValue)(nil), // 68: ttn.lorawan.v3.ZeroableFrequencyValue - (*RxDelayValue)(nil), // 69: ttn.lorawan.v3.RxDelayValue - (*DataRateOffsetValue)(nil), // 70: ttn.lorawan.v3.DataRateOffsetValue - (*FrequencyValue)(nil), // 71: ttn.lorawan.v3.FrequencyValue - (*AggregatedDutyCycleValue)(nil), // 72: ttn.lorawan.v3.AggregatedDutyCycleValue - (*wrapperspb.FloatValue)(nil), // 73: google.protobuf.FloatValue - (*wrapperspb.UInt32Value)(nil), // 74: google.protobuf.UInt32Value - (*DeviceEIRPValue)(nil), // 75: ttn.lorawan.v3.DeviceEIRPValue - (Class)(0), // 76: ttn.lorawan.v3.Class - (*MACCommand)(nil), // 77: ttn.lorawan.v3.MACCommand - (MACCommandIdentifier)(0), // 78: ttn.lorawan.v3.MACCommandIdentifier - (*EndDeviceIdentifiers)(nil), // 79: ttn.lorawan.v3.EndDeviceIdentifiers - (*Picture)(nil), // 80: ttn.lorawan.v3.Picture - (*RootKeys)(nil), // 81: ttn.lorawan.v3.RootKeys - (*structpb.Struct)(nil), // 82: google.protobuf.Struct - (*wrapperspb.BoolValue)(nil), // 83: google.protobuf.BoolValue - (*LoRaAllianceProfileIdentifiers)(nil), // 84: ttn.lorawan.v3.LoRaAllianceProfileIdentifiers - (*fieldmaskpb.FieldMask)(nil), // 85: google.protobuf.FieldMask - (*ApplicationIdentifiers)(nil), // 86: ttn.lorawan.v3.ApplicationIdentifiers - (*DLSettings)(nil), // 87: ttn.lorawan.v3.DLSettings - (*CFList)(nil), // 88: ttn.lorawan.v3.CFList - (*Message)(nil), // 89: ttn.lorawan.v3.Message - (*DataRate)(nil), // 90: ttn.lorawan.v3.DataRate - (*GatewayIdentifiers)(nil), // 91: ttn.lorawan.v3.GatewayIdentifiers - (DownlinkPathConstraint)(0), // 92: ttn.lorawan.v3.DownlinkPathConstraint - (MType)(0), // 93: ttn.lorawan.v3.MType - (*Location)(nil), // 94: ttn.lorawan.v3.Location + (*ServingRelayParameters)(nil), // 3: ttn.lorawan.v3.ServingRelayParameters + (*ServedRelayParameters)(nil), // 4: ttn.lorawan.v3.ServedRelayParameters + (*RelayParameters)(nil), // 5: ttn.lorawan.v3.RelayParameters + (*MACParameters)(nil), // 6: ttn.lorawan.v3.MACParameters + (*EndDeviceVersion)(nil), // 7: ttn.lorawan.v3.EndDeviceVersion + (*ADRSettings)(nil), // 8: ttn.lorawan.v3.ADRSettings + (*MACSettings)(nil), // 9: ttn.lorawan.v3.MACSettings + (*MACState)(nil), // 10: ttn.lorawan.v3.MACState + (*EndDeviceAuthenticationCode)(nil), // 11: ttn.lorawan.v3.EndDeviceAuthenticationCode + (*EndDevice)(nil), // 12: ttn.lorawan.v3.EndDevice + (*EndDevices)(nil), // 13: ttn.lorawan.v3.EndDevices + (*DevAddrPrefix)(nil), // 14: ttn.lorawan.v3.DevAddrPrefix + (*CreateEndDeviceRequest)(nil), // 15: ttn.lorawan.v3.CreateEndDeviceRequest + (*UpdateEndDeviceRequest)(nil), // 16: ttn.lorawan.v3.UpdateEndDeviceRequest + (*BatchUpdateEndDeviceLastSeenRequest)(nil), // 17: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest + (*GetEndDeviceRequest)(nil), // 18: ttn.lorawan.v3.GetEndDeviceRequest + (*GetEndDeviceIdentifiersForEUIsRequest)(nil), // 19: ttn.lorawan.v3.GetEndDeviceIdentifiersForEUIsRequest + (*ListEndDevicesRequest)(nil), // 20: ttn.lorawan.v3.ListEndDevicesRequest + (*SetEndDeviceRequest)(nil), // 21: ttn.lorawan.v3.SetEndDeviceRequest + (*ResetAndGetEndDeviceRequest)(nil), // 22: ttn.lorawan.v3.ResetAndGetEndDeviceRequest + (*EndDeviceTemplate)(nil), // 23: ttn.lorawan.v3.EndDeviceTemplate + (*EndDeviceTemplateFormat)(nil), // 24: ttn.lorawan.v3.EndDeviceTemplateFormat + (*EndDeviceTemplateFormats)(nil), // 25: ttn.lorawan.v3.EndDeviceTemplateFormats + (*ConvertEndDeviceTemplateRequest)(nil), // 26: ttn.lorawan.v3.ConvertEndDeviceTemplateRequest + (*BatchDeleteEndDevicesRequest)(nil), // 27: ttn.lorawan.v3.BatchDeleteEndDevicesRequest + (*BatchGetEndDevicesRequest)(nil), // 28: ttn.lorawan.v3.BatchGetEndDevicesRequest + (*ServingRelayParameters_UplinkForwardingRule)(nil), // 29: ttn.lorawan.v3.ServingRelayParameters.UplinkForwardingRule + (*ServingRelayParameters_ForwardingLimits)(nil), // 30: ttn.lorawan.v3.ServingRelayParameters.ForwardingLimits + (*MACParameters_Channel)(nil), // 31: ttn.lorawan.v3.MACParameters.Channel + (*ADRSettings_StaticMode)(nil), // 32: ttn.lorawan.v3.ADRSettings.StaticMode + (*ADRSettings_DynamicMode)(nil), // 33: ttn.lorawan.v3.ADRSettings.DynamicMode + (*ADRSettings_DisabledMode)(nil), // 34: ttn.lorawan.v3.ADRSettings.DisabledMode + (*ADRSettings_DynamicMode_ChannelSteeringSettings)(nil), // 35: ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings + (*ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode)(nil), // 36: ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.LoRaNarrowMode + (*ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode)(nil), // 37: ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.DisabledMode + (*MACState_JoinRequest)(nil), // 38: ttn.lorawan.v3.MACState.JoinRequest + (*MACState_JoinAccept)(nil), // 39: ttn.lorawan.v3.MACState.JoinAccept + (*MACState_UplinkMessage)(nil), // 40: ttn.lorawan.v3.MACState.UplinkMessage + (*MACState_DownlinkMessage)(nil), // 41: ttn.lorawan.v3.MACState.DownlinkMessage + (*MACState_DataRateRange)(nil), // 42: ttn.lorawan.v3.MACState.DataRateRange + (*MACState_DataRateRanges)(nil), // 43: ttn.lorawan.v3.MACState.DataRateRanges + nil, // 44: ttn.lorawan.v3.MACState.RejectedDataRateRangesEntry + (*MACState_UplinkMessage_TxSettings)(nil), // 45: ttn.lorawan.v3.MACState.UplinkMessage.TxSettings + (*MACState_UplinkMessage_RxMetadata)(nil), // 46: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata + (*MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata)(nil), // 47: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.PacketBrokerMetadata + (*MACState_UplinkMessage_RxMetadata_RelayMetadata)(nil), // 48: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.RelayMetadata + (*MACState_DownlinkMessage_Message)(nil), // 49: ttn.lorawan.v3.MACState.DownlinkMessage.Message + (*MACState_DownlinkMessage_Message_MHDR)(nil), // 50: ttn.lorawan.v3.MACState.DownlinkMessage.Message.MHDR + (*MACState_DownlinkMessage_Message_MACPayload)(nil), // 51: ttn.lorawan.v3.MACState.DownlinkMessage.Message.MACPayload + nil, // 52: ttn.lorawan.v3.EndDevice.AttributesEntry + nil, // 53: ttn.lorawan.v3.EndDevice.LocationsEntry + (*BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate)(nil), // 54: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest.EndDeviceLastSeenUpdate + nil, // 55: ttn.lorawan.v3.EndDeviceTemplateFormats.FormatsEntry + (*SessionKeys)(nil), // 56: ttn.lorawan.v3.SessionKeys + (*timestamppb.Timestamp)(nil), // 57: google.protobuf.Timestamp + (*ApplicationDownlink)(nil), // 58: ttn.lorawan.v3.ApplicationDownlink + (*RelaySecondChannel)(nil), // 59: ttn.lorawan.v3.RelaySecondChannel + (RelayCADPeriodicity)(0), // 60: ttn.lorawan.v3.RelayCADPeriodicity + (*RelayEndDeviceAlwaysMode)(nil), // 61: ttn.lorawan.v3.RelayEndDeviceAlwaysMode + (*RelayEndDeviceDynamicMode)(nil), // 62: ttn.lorawan.v3.RelayEndDeviceDynamicMode + (*RelayEndDeviceControlledMode)(nil), // 63: ttn.lorawan.v3.RelayEndDeviceControlledMode + (DataRateIndex)(0), // 64: ttn.lorawan.v3.DataRateIndex + (RxDelay)(0), // 65: ttn.lorawan.v3.RxDelay + (DataRateOffset)(0), // 66: ttn.lorawan.v3.DataRateOffset + (AggregatedDutyCycle)(0), // 67: ttn.lorawan.v3.AggregatedDutyCycle + (RejoinTimeExponent)(0), // 68: ttn.lorawan.v3.RejoinTimeExponent + (RejoinCountExponent)(0), // 69: ttn.lorawan.v3.RejoinCountExponent + (*ADRAckLimitExponentValue)(nil), // 70: ttn.lorawan.v3.ADRAckLimitExponentValue + (*ADRAckDelayExponentValue)(nil), // 71: ttn.lorawan.v3.ADRAckDelayExponentValue + (*DataRateIndexValue)(nil), // 72: ttn.lorawan.v3.DataRateIndexValue + (*EndDeviceVersionIdentifiers)(nil), // 73: ttn.lorawan.v3.EndDeviceVersionIdentifiers + (MACVersion)(0), // 74: ttn.lorawan.v3.MACVersion + (PHYVersion)(0), // 75: ttn.lorawan.v3.PHYVersion + (*MessagePayloadFormatters)(nil), // 76: ttn.lorawan.v3.MessagePayloadFormatters + (*durationpb.Duration)(nil), // 77: google.protobuf.Duration + (*PingSlotPeriodValue)(nil), // 78: ttn.lorawan.v3.PingSlotPeriodValue + (*ZeroableFrequencyValue)(nil), // 79: ttn.lorawan.v3.ZeroableFrequencyValue + (*RxDelayValue)(nil), // 80: ttn.lorawan.v3.RxDelayValue + (*DataRateOffsetValue)(nil), // 81: ttn.lorawan.v3.DataRateOffsetValue + (*FrequencyValue)(nil), // 82: ttn.lorawan.v3.FrequencyValue + (*AggregatedDutyCycleValue)(nil), // 83: ttn.lorawan.v3.AggregatedDutyCycleValue + (*wrapperspb.FloatValue)(nil), // 84: google.protobuf.FloatValue + (*wrapperspb.UInt32Value)(nil), // 85: google.protobuf.UInt32Value + (*DeviceEIRPValue)(nil), // 86: ttn.lorawan.v3.DeviceEIRPValue + (Class)(0), // 87: ttn.lorawan.v3.Class + (*MACCommand)(nil), // 88: ttn.lorawan.v3.MACCommand + (MACCommandIdentifier)(0), // 89: ttn.lorawan.v3.MACCommandIdentifier + (*RelayForwardDownlinkReq)(nil), // 90: ttn.lorawan.v3.RelayForwardDownlinkReq + (*EndDeviceIdentifiers)(nil), // 91: ttn.lorawan.v3.EndDeviceIdentifiers + (*Picture)(nil), // 92: ttn.lorawan.v3.Picture + (*RootKeys)(nil), // 93: ttn.lorawan.v3.RootKeys + (*structpb.Struct)(nil), // 94: google.protobuf.Struct + (*wrapperspb.BoolValue)(nil), // 95: google.protobuf.BoolValue + (*LoRaAllianceProfileIdentifiers)(nil), // 96: ttn.lorawan.v3.LoRaAllianceProfileIdentifiers + (*fieldmaskpb.FieldMask)(nil), // 97: google.protobuf.FieldMask + (*ApplicationIdentifiers)(nil), // 98: ttn.lorawan.v3.ApplicationIdentifiers + (*RelayUplinkForwardLimits)(nil), // 99: ttn.lorawan.v3.RelayUplinkForwardLimits + (RelayResetLimitCounter)(0), // 100: ttn.lorawan.v3.RelayResetLimitCounter + (*RelayForwardLimits)(nil), // 101: ttn.lorawan.v3.RelayForwardLimits + (*DLSettings)(nil), // 102: ttn.lorawan.v3.DLSettings + (*CFList)(nil), // 103: ttn.lorawan.v3.CFList + (*Message)(nil), // 104: ttn.lorawan.v3.Message + (*DataRate)(nil), // 105: ttn.lorawan.v3.DataRate + (*GatewayIdentifiers)(nil), // 106: ttn.lorawan.v3.GatewayIdentifiers + (DownlinkPathConstraint)(0), // 107: ttn.lorawan.v3.DownlinkPathConstraint + (MType)(0), // 108: ttn.lorawan.v3.MType + (*Location)(nil), // 109: ttn.lorawan.v3.Location } var file_ttn_lorawan_v3_end_device_proto_depIdxs = []int32{ - 50, // 0: ttn.lorawan.v3.Session.keys:type_name -> ttn.lorawan.v3.SessionKeys - 51, // 1: ttn.lorawan.v3.Session.started_at:type_name -> google.protobuf.Timestamp - 52, // 2: ttn.lorawan.v3.Session.queued_application_downlinks:type_name -> ttn.lorawan.v3.ApplicationDownlink - 53, // 3: ttn.lorawan.v3.MACParameters.adr_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 54, // 4: ttn.lorawan.v3.MACParameters.rx1_delay:type_name -> ttn.lorawan.v3.RxDelay - 55, // 5: ttn.lorawan.v3.MACParameters.rx1_data_rate_offset:type_name -> ttn.lorawan.v3.DataRateOffset - 53, // 6: ttn.lorawan.v3.MACParameters.rx2_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 56, // 7: ttn.lorawan.v3.MACParameters.max_duty_cycle:type_name -> ttn.lorawan.v3.AggregatedDutyCycle - 57, // 8: ttn.lorawan.v3.MACParameters.rejoin_time_periodicity:type_name -> ttn.lorawan.v3.RejoinTimeExponent - 58, // 9: ttn.lorawan.v3.MACParameters.rejoin_count_periodicity:type_name -> ttn.lorawan.v3.RejoinCountExponent - 53, // 10: ttn.lorawan.v3.MACParameters.ping_slot_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 26, // 11: ttn.lorawan.v3.MACParameters.channels:type_name -> ttn.lorawan.v3.MACParameters.Channel - 2, // 12: ttn.lorawan.v3.MACParameters.uplink_dwell_time:type_name -> ttn.lorawan.v3.BoolValue - 2, // 13: ttn.lorawan.v3.MACParameters.downlink_dwell_time:type_name -> ttn.lorawan.v3.BoolValue - 59, // 14: ttn.lorawan.v3.MACParameters.adr_ack_limit_exponent:type_name -> ttn.lorawan.v3.ADRAckLimitExponentValue - 60, // 15: ttn.lorawan.v3.MACParameters.adr_ack_delay_exponent:type_name -> ttn.lorawan.v3.ADRAckDelayExponentValue - 61, // 16: ttn.lorawan.v3.MACParameters.ping_slot_data_rate_index_value:type_name -> ttn.lorawan.v3.DataRateIndexValue - 62, // 17: ttn.lorawan.v3.EndDeviceVersion.ids:type_name -> ttn.lorawan.v3.EndDeviceVersionIdentifiers - 63, // 18: ttn.lorawan.v3.EndDeviceVersion.lorawan_version:type_name -> ttn.lorawan.v3.MACVersion - 64, // 19: ttn.lorawan.v3.EndDeviceVersion.lorawan_phy_version:type_name -> ttn.lorawan.v3.PHYVersion - 6, // 20: ttn.lorawan.v3.EndDeviceVersion.default_mac_settings:type_name -> ttn.lorawan.v3.MACSettings - 65, // 21: ttn.lorawan.v3.EndDeviceVersion.default_formatters:type_name -> ttn.lorawan.v3.MessagePayloadFormatters - 27, // 22: ttn.lorawan.v3.ADRSettings.static:type_name -> ttn.lorawan.v3.ADRSettings.StaticMode - 28, // 23: ttn.lorawan.v3.ADRSettings.dynamic:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode - 29, // 24: ttn.lorawan.v3.ADRSettings.disabled:type_name -> ttn.lorawan.v3.ADRSettings.DisabledMode - 66, // 25: ttn.lorawan.v3.MACSettings.class_b_timeout:type_name -> google.protobuf.Duration - 67, // 26: ttn.lorawan.v3.MACSettings.ping_slot_periodicity:type_name -> ttn.lorawan.v3.PingSlotPeriodValue - 61, // 27: ttn.lorawan.v3.MACSettings.ping_slot_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue - 68, // 28: ttn.lorawan.v3.MACSettings.ping_slot_frequency:type_name -> ttn.lorawan.v3.ZeroableFrequencyValue - 68, // 29: ttn.lorawan.v3.MACSettings.beacon_frequency:type_name -> ttn.lorawan.v3.ZeroableFrequencyValue - 66, // 30: ttn.lorawan.v3.MACSettings.class_c_timeout:type_name -> google.protobuf.Duration - 69, // 31: ttn.lorawan.v3.MACSettings.rx1_delay:type_name -> ttn.lorawan.v3.RxDelayValue - 70, // 32: ttn.lorawan.v3.MACSettings.rx1_data_rate_offset:type_name -> ttn.lorawan.v3.DataRateOffsetValue - 61, // 33: ttn.lorawan.v3.MACSettings.rx2_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue - 71, // 34: ttn.lorawan.v3.MACSettings.rx2_frequency:type_name -> ttn.lorawan.v3.FrequencyValue - 72, // 35: ttn.lorawan.v3.MACSettings.max_duty_cycle:type_name -> ttn.lorawan.v3.AggregatedDutyCycleValue - 2, // 36: ttn.lorawan.v3.MACSettings.supports_32_bit_f_cnt:type_name -> ttn.lorawan.v3.BoolValue - 2, // 37: ttn.lorawan.v3.MACSettings.use_adr:type_name -> ttn.lorawan.v3.BoolValue - 73, // 38: ttn.lorawan.v3.MACSettings.adr_margin:type_name -> google.protobuf.FloatValue - 2, // 39: ttn.lorawan.v3.MACSettings.resets_f_cnt:type_name -> ttn.lorawan.v3.BoolValue - 66, // 40: ttn.lorawan.v3.MACSettings.status_time_periodicity:type_name -> google.protobuf.Duration - 74, // 41: ttn.lorawan.v3.MACSettings.status_count_periodicity:type_name -> google.protobuf.UInt32Value - 69, // 42: ttn.lorawan.v3.MACSettings.desired_rx1_delay:type_name -> ttn.lorawan.v3.RxDelayValue - 70, // 43: ttn.lorawan.v3.MACSettings.desired_rx1_data_rate_offset:type_name -> ttn.lorawan.v3.DataRateOffsetValue - 61, // 44: ttn.lorawan.v3.MACSettings.desired_rx2_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue - 71, // 45: ttn.lorawan.v3.MACSettings.desired_rx2_frequency:type_name -> ttn.lorawan.v3.FrequencyValue - 72, // 46: ttn.lorawan.v3.MACSettings.desired_max_duty_cycle:type_name -> ttn.lorawan.v3.AggregatedDutyCycleValue - 59, // 47: ttn.lorawan.v3.MACSettings.desired_adr_ack_limit_exponent:type_name -> ttn.lorawan.v3.ADRAckLimitExponentValue - 60, // 48: ttn.lorawan.v3.MACSettings.desired_adr_ack_delay_exponent:type_name -> ttn.lorawan.v3.ADRAckDelayExponentValue - 61, // 49: ttn.lorawan.v3.MACSettings.desired_ping_slot_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue - 68, // 50: ttn.lorawan.v3.MACSettings.desired_ping_slot_frequency:type_name -> ttn.lorawan.v3.ZeroableFrequencyValue - 68, // 51: ttn.lorawan.v3.MACSettings.desired_beacon_frequency:type_name -> ttn.lorawan.v3.ZeroableFrequencyValue - 75, // 52: ttn.lorawan.v3.MACSettings.desired_max_eirp:type_name -> ttn.lorawan.v3.DeviceEIRPValue - 66, // 53: ttn.lorawan.v3.MACSettings.class_b_c_downlink_interval:type_name -> google.protobuf.Duration - 2, // 54: ttn.lorawan.v3.MACSettings.uplink_dwell_time:type_name -> ttn.lorawan.v3.BoolValue - 2, // 55: ttn.lorawan.v3.MACSettings.downlink_dwell_time:type_name -> ttn.lorawan.v3.BoolValue - 5, // 56: ttn.lorawan.v3.MACSettings.adr:type_name -> ttn.lorawan.v3.ADRSettings - 2, // 57: ttn.lorawan.v3.MACSettings.schedule_downlinks:type_name -> ttn.lorawan.v3.BoolValue - 3, // 58: ttn.lorawan.v3.MACState.current_parameters:type_name -> ttn.lorawan.v3.MACParameters - 3, // 59: ttn.lorawan.v3.MACState.desired_parameters:type_name -> ttn.lorawan.v3.MACParameters - 76, // 60: ttn.lorawan.v3.MACState.device_class:type_name -> ttn.lorawan.v3.Class - 63, // 61: ttn.lorawan.v3.MACState.lorawan_version:type_name -> ttn.lorawan.v3.MACVersion - 51, // 62: ttn.lorawan.v3.MACState.last_confirmed_downlink_at:type_name -> google.protobuf.Timestamp - 67, // 63: ttn.lorawan.v3.MACState.ping_slot_periodicity:type_name -> ttn.lorawan.v3.PingSlotPeriodValue - 52, // 64: ttn.lorawan.v3.MACState.pending_application_downlink:type_name -> ttn.lorawan.v3.ApplicationDownlink - 77, // 65: ttn.lorawan.v3.MACState.queued_responses:type_name -> ttn.lorawan.v3.MACCommand - 77, // 66: ttn.lorawan.v3.MACState.pending_requests:type_name -> ttn.lorawan.v3.MACCommand - 34, // 67: ttn.lorawan.v3.MACState.queued_join_accept:type_name -> ttn.lorawan.v3.MACState.JoinAccept - 33, // 68: ttn.lorawan.v3.MACState.pending_join_request:type_name -> ttn.lorawan.v3.MACState.JoinRequest - 35, // 69: ttn.lorawan.v3.MACState.recent_uplinks:type_name -> ttn.lorawan.v3.MACState.UplinkMessage - 36, // 70: ttn.lorawan.v3.MACState.recent_downlinks:type_name -> ttn.lorawan.v3.MACState.DownlinkMessage - 51, // 71: ttn.lorawan.v3.MACState.last_network_initiated_downlink_at:type_name -> google.protobuf.Timestamp - 53, // 72: ttn.lorawan.v3.MACState.rejected_adr_data_rate_indexes:type_name -> ttn.lorawan.v3.DataRateIndex - 51, // 73: ttn.lorawan.v3.MACState.last_downlink_at:type_name -> google.protobuf.Timestamp - 39, // 74: ttn.lorawan.v3.MACState.rejected_data_rate_ranges:type_name -> ttn.lorawan.v3.MACState.RejectedDataRateRangesEntry - 78, // 75: ttn.lorawan.v3.MACState.recent_mac_command_identifiers:type_name -> ttn.lorawan.v3.MACCommandIdentifier - 51, // 76: ttn.lorawan.v3.EndDeviceAuthenticationCode.valid_from:type_name -> google.protobuf.Timestamp - 51, // 77: ttn.lorawan.v3.EndDeviceAuthenticationCode.valid_to:type_name -> google.protobuf.Timestamp - 79, // 78: ttn.lorawan.v3.EndDevice.ids:type_name -> ttn.lorawan.v3.EndDeviceIdentifiers - 51, // 79: ttn.lorawan.v3.EndDevice.created_at:type_name -> google.protobuf.Timestamp - 51, // 80: ttn.lorawan.v3.EndDevice.updated_at:type_name -> google.protobuf.Timestamp - 46, // 81: ttn.lorawan.v3.EndDevice.attributes:type_name -> ttn.lorawan.v3.EndDevice.AttributesEntry - 62, // 82: ttn.lorawan.v3.EndDevice.version_ids:type_name -> ttn.lorawan.v3.EndDeviceVersionIdentifiers - 47, // 83: ttn.lorawan.v3.EndDevice.locations:type_name -> ttn.lorawan.v3.EndDevice.LocationsEntry - 80, // 84: ttn.lorawan.v3.EndDevice.picture:type_name -> ttn.lorawan.v3.Picture - 63, // 85: ttn.lorawan.v3.EndDevice.lorawan_version:type_name -> ttn.lorawan.v3.MACVersion - 64, // 86: ttn.lorawan.v3.EndDevice.lorawan_phy_version:type_name -> ttn.lorawan.v3.PHYVersion - 81, // 87: ttn.lorawan.v3.EndDevice.root_keys:type_name -> ttn.lorawan.v3.RootKeys - 6, // 88: ttn.lorawan.v3.EndDevice.mac_settings:type_name -> ttn.lorawan.v3.MACSettings - 7, // 89: ttn.lorawan.v3.EndDevice.mac_state:type_name -> ttn.lorawan.v3.MACState - 7, // 90: ttn.lorawan.v3.EndDevice.pending_mac_state:type_name -> ttn.lorawan.v3.MACState - 1, // 91: ttn.lorawan.v3.EndDevice.session:type_name -> ttn.lorawan.v3.Session - 1, // 92: ttn.lorawan.v3.EndDevice.pending_session:type_name -> ttn.lorawan.v3.Session - 51, // 93: ttn.lorawan.v3.EndDevice.last_dev_status_received_at:type_name -> google.protobuf.Timestamp - 0, // 94: ttn.lorawan.v3.EndDevice.power_state:type_name -> ttn.lorawan.v3.PowerState - 73, // 95: ttn.lorawan.v3.EndDevice.battery_percentage:type_name -> google.protobuf.FloatValue - 52, // 96: ttn.lorawan.v3.EndDevice.queued_application_downlinks:type_name -> ttn.lorawan.v3.ApplicationDownlink - 65, // 97: ttn.lorawan.v3.EndDevice.formatters:type_name -> ttn.lorawan.v3.MessagePayloadFormatters - 82, // 98: ttn.lorawan.v3.EndDevice.provisioning_data:type_name -> google.protobuf.Struct - 8, // 99: ttn.lorawan.v3.EndDevice.claim_authentication_code:type_name -> ttn.lorawan.v3.EndDeviceAuthenticationCode - 83, // 100: ttn.lorawan.v3.EndDevice.skip_payload_crypto_override:type_name -> google.protobuf.BoolValue - 51, // 101: ttn.lorawan.v3.EndDevice.activated_at:type_name -> google.protobuf.Timestamp - 51, // 102: ttn.lorawan.v3.EndDevice.last_seen_at:type_name -> google.protobuf.Timestamp - 84, // 103: ttn.lorawan.v3.EndDevice.lora_alliance_profile_ids:type_name -> ttn.lorawan.v3.LoRaAllianceProfileIdentifiers - 9, // 104: ttn.lorawan.v3.EndDevices.end_devices:type_name -> ttn.lorawan.v3.EndDevice - 9, // 105: ttn.lorawan.v3.CreateEndDeviceRequest.end_device:type_name -> ttn.lorawan.v3.EndDevice - 9, // 106: ttn.lorawan.v3.UpdateEndDeviceRequest.end_device:type_name -> ttn.lorawan.v3.EndDevice - 85, // 107: ttn.lorawan.v3.UpdateEndDeviceRequest.field_mask:type_name -> google.protobuf.FieldMask - 48, // 108: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest.updates:type_name -> ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest.EndDeviceLastSeenUpdate - 79, // 109: ttn.lorawan.v3.GetEndDeviceRequest.end_device_ids:type_name -> ttn.lorawan.v3.EndDeviceIdentifiers - 85, // 110: ttn.lorawan.v3.GetEndDeviceRequest.field_mask:type_name -> google.protobuf.FieldMask - 86, // 111: ttn.lorawan.v3.ListEndDevicesRequest.application_ids:type_name -> ttn.lorawan.v3.ApplicationIdentifiers - 85, // 112: ttn.lorawan.v3.ListEndDevicesRequest.field_mask:type_name -> google.protobuf.FieldMask - 9, // 113: ttn.lorawan.v3.SetEndDeviceRequest.end_device:type_name -> ttn.lorawan.v3.EndDevice - 85, // 114: ttn.lorawan.v3.SetEndDeviceRequest.field_mask:type_name -> google.protobuf.FieldMask - 79, // 115: ttn.lorawan.v3.ResetAndGetEndDeviceRequest.end_device_ids:type_name -> ttn.lorawan.v3.EndDeviceIdentifiers - 85, // 116: ttn.lorawan.v3.ResetAndGetEndDeviceRequest.field_mask:type_name -> google.protobuf.FieldMask - 9, // 117: ttn.lorawan.v3.EndDeviceTemplate.end_device:type_name -> ttn.lorawan.v3.EndDevice - 85, // 118: ttn.lorawan.v3.EndDeviceTemplate.field_mask:type_name -> google.protobuf.FieldMask - 49, // 119: ttn.lorawan.v3.EndDeviceTemplateFormats.formats:type_name -> ttn.lorawan.v3.EndDeviceTemplateFormats.FormatsEntry - 62, // 120: ttn.lorawan.v3.ConvertEndDeviceTemplateRequest.end_device_version_ids:type_name -> ttn.lorawan.v3.EndDeviceVersionIdentifiers - 86, // 121: ttn.lorawan.v3.BatchDeleteEndDevicesRequest.application_ids:type_name -> ttn.lorawan.v3.ApplicationIdentifiers - 86, // 122: ttn.lorawan.v3.BatchGetEndDevicesRequest.application_ids:type_name -> ttn.lorawan.v3.ApplicationIdentifiers - 85, // 123: ttn.lorawan.v3.BatchGetEndDevicesRequest.field_mask:type_name -> google.protobuf.FieldMask - 53, // 124: ttn.lorawan.v3.MACParameters.Channel.min_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 53, // 125: ttn.lorawan.v3.MACParameters.Channel.max_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 53, // 126: ttn.lorawan.v3.ADRSettings.StaticMode.data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 73, // 127: ttn.lorawan.v3.ADRSettings.DynamicMode.margin:type_name -> google.protobuf.FloatValue - 61, // 128: ttn.lorawan.v3.ADRSettings.DynamicMode.min_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue - 61, // 129: ttn.lorawan.v3.ADRSettings.DynamicMode.max_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue - 74, // 130: ttn.lorawan.v3.ADRSettings.DynamicMode.min_tx_power_index:type_name -> google.protobuf.UInt32Value - 74, // 131: ttn.lorawan.v3.ADRSettings.DynamicMode.max_tx_power_index:type_name -> google.protobuf.UInt32Value - 74, // 132: ttn.lorawan.v3.ADRSettings.DynamicMode.min_nb_trans:type_name -> google.protobuf.UInt32Value - 74, // 133: ttn.lorawan.v3.ADRSettings.DynamicMode.max_nb_trans:type_name -> google.protobuf.UInt32Value - 30, // 134: ttn.lorawan.v3.ADRSettings.DynamicMode.channel_steering:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings - 31, // 135: ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.lora_narrow:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.LoRaNarrowMode - 32, // 136: ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.disabled:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.DisabledMode - 87, // 137: ttn.lorawan.v3.MACState.JoinRequest.downlink_settings:type_name -> ttn.lorawan.v3.DLSettings - 54, // 138: ttn.lorawan.v3.MACState.JoinRequest.rx_delay:type_name -> ttn.lorawan.v3.RxDelay - 88, // 139: ttn.lorawan.v3.MACState.JoinRequest.cf_list:type_name -> ttn.lorawan.v3.CFList - 33, // 140: ttn.lorawan.v3.MACState.JoinAccept.request:type_name -> ttn.lorawan.v3.MACState.JoinRequest - 50, // 141: ttn.lorawan.v3.MACState.JoinAccept.keys:type_name -> ttn.lorawan.v3.SessionKeys - 89, // 142: ttn.lorawan.v3.MACState.UplinkMessage.payload:type_name -> ttn.lorawan.v3.Message - 40, // 143: ttn.lorawan.v3.MACState.UplinkMessage.settings:type_name -> ttn.lorawan.v3.MACState.UplinkMessage.TxSettings - 41, // 144: ttn.lorawan.v3.MACState.UplinkMessage.rx_metadata:type_name -> ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata - 51, // 145: ttn.lorawan.v3.MACState.UplinkMessage.received_at:type_name -> google.protobuf.Timestamp - 43, // 146: ttn.lorawan.v3.MACState.DownlinkMessage.payload:type_name -> ttn.lorawan.v3.MACState.DownlinkMessage.Message - 53, // 147: ttn.lorawan.v3.MACState.DataRateRange.min_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 53, // 148: ttn.lorawan.v3.MACState.DataRateRange.max_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 37, // 149: ttn.lorawan.v3.MACState.DataRateRanges.ranges:type_name -> ttn.lorawan.v3.MACState.DataRateRange - 38, // 150: ttn.lorawan.v3.MACState.RejectedDataRateRangesEntry.value:type_name -> ttn.lorawan.v3.MACState.DataRateRanges - 90, // 151: ttn.lorawan.v3.MACState.UplinkMessage.TxSettings.data_rate:type_name -> ttn.lorawan.v3.DataRate - 91, // 152: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers - 92, // 153: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.downlink_path_constraint:type_name -> ttn.lorawan.v3.DownlinkPathConstraint - 42, // 154: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.packet_broker:type_name -> ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.PacketBrokerMetadata - 44, // 155: ttn.lorawan.v3.MACState.DownlinkMessage.Message.m_hdr:type_name -> ttn.lorawan.v3.MACState.DownlinkMessage.Message.MHDR - 45, // 156: ttn.lorawan.v3.MACState.DownlinkMessage.Message.mac_payload:type_name -> ttn.lorawan.v3.MACState.DownlinkMessage.Message.MACPayload - 93, // 157: ttn.lorawan.v3.MACState.DownlinkMessage.Message.MHDR.m_type:type_name -> ttn.lorawan.v3.MType - 94, // 158: ttn.lorawan.v3.EndDevice.LocationsEntry.value:type_name -> ttn.lorawan.v3.Location - 79, // 159: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest.EndDeviceLastSeenUpdate.ids:type_name -> ttn.lorawan.v3.EndDeviceIdentifiers - 51, // 160: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest.EndDeviceLastSeenUpdate.last_seen_at:type_name -> google.protobuf.Timestamp - 21, // 161: ttn.lorawan.v3.EndDeviceTemplateFormats.FormatsEntry.value:type_name -> ttn.lorawan.v3.EndDeviceTemplateFormat - 162, // [162:162] is the sub-list for method output_type - 162, // [162:162] is the sub-list for method input_type - 162, // [162:162] is the sub-list for extension type_name - 162, // [162:162] is the sub-list for extension extendee - 0, // [0:162] is the sub-list for field type_name + 56, // 0: ttn.lorawan.v3.Session.keys:type_name -> ttn.lorawan.v3.SessionKeys + 57, // 1: ttn.lorawan.v3.Session.started_at:type_name -> google.protobuf.Timestamp + 58, // 2: ttn.lorawan.v3.Session.queued_application_downlinks:type_name -> ttn.lorawan.v3.ApplicationDownlink + 59, // 3: ttn.lorawan.v3.ServingRelayParameters.second_channel:type_name -> ttn.lorawan.v3.RelaySecondChannel + 60, // 4: ttn.lorawan.v3.ServingRelayParameters.cad_periodicity:type_name -> ttn.lorawan.v3.RelayCADPeriodicity + 29, // 5: ttn.lorawan.v3.ServingRelayParameters.uplink_forwarding_rules:type_name -> ttn.lorawan.v3.ServingRelayParameters.UplinkForwardingRule + 30, // 6: ttn.lorawan.v3.ServingRelayParameters.limits:type_name -> ttn.lorawan.v3.ServingRelayParameters.ForwardingLimits + 61, // 7: ttn.lorawan.v3.ServedRelayParameters.always:type_name -> ttn.lorawan.v3.RelayEndDeviceAlwaysMode + 62, // 8: ttn.lorawan.v3.ServedRelayParameters.dynamic:type_name -> ttn.lorawan.v3.RelayEndDeviceDynamicMode + 63, // 9: ttn.lorawan.v3.ServedRelayParameters.end_device_controlled:type_name -> ttn.lorawan.v3.RelayEndDeviceControlledMode + 59, // 10: ttn.lorawan.v3.ServedRelayParameters.second_channel:type_name -> ttn.lorawan.v3.RelaySecondChannel + 3, // 11: ttn.lorawan.v3.RelayParameters.serving:type_name -> ttn.lorawan.v3.ServingRelayParameters + 4, // 12: ttn.lorawan.v3.RelayParameters.served:type_name -> ttn.lorawan.v3.ServedRelayParameters + 64, // 13: ttn.lorawan.v3.MACParameters.adr_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 65, // 14: ttn.lorawan.v3.MACParameters.rx1_delay:type_name -> ttn.lorawan.v3.RxDelay + 66, // 15: ttn.lorawan.v3.MACParameters.rx1_data_rate_offset:type_name -> ttn.lorawan.v3.DataRateOffset + 64, // 16: ttn.lorawan.v3.MACParameters.rx2_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 67, // 17: ttn.lorawan.v3.MACParameters.max_duty_cycle:type_name -> ttn.lorawan.v3.AggregatedDutyCycle + 68, // 18: ttn.lorawan.v3.MACParameters.rejoin_time_periodicity:type_name -> ttn.lorawan.v3.RejoinTimeExponent + 69, // 19: ttn.lorawan.v3.MACParameters.rejoin_count_periodicity:type_name -> ttn.lorawan.v3.RejoinCountExponent + 64, // 20: ttn.lorawan.v3.MACParameters.ping_slot_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 31, // 21: ttn.lorawan.v3.MACParameters.channels:type_name -> ttn.lorawan.v3.MACParameters.Channel + 2, // 22: ttn.lorawan.v3.MACParameters.uplink_dwell_time:type_name -> ttn.lorawan.v3.BoolValue + 2, // 23: ttn.lorawan.v3.MACParameters.downlink_dwell_time:type_name -> ttn.lorawan.v3.BoolValue + 70, // 24: ttn.lorawan.v3.MACParameters.adr_ack_limit_exponent:type_name -> ttn.lorawan.v3.ADRAckLimitExponentValue + 71, // 25: ttn.lorawan.v3.MACParameters.adr_ack_delay_exponent:type_name -> ttn.lorawan.v3.ADRAckDelayExponentValue + 72, // 26: ttn.lorawan.v3.MACParameters.ping_slot_data_rate_index_value:type_name -> ttn.lorawan.v3.DataRateIndexValue + 5, // 27: ttn.lorawan.v3.MACParameters.relay:type_name -> ttn.lorawan.v3.RelayParameters + 73, // 28: ttn.lorawan.v3.EndDeviceVersion.ids:type_name -> ttn.lorawan.v3.EndDeviceVersionIdentifiers + 74, // 29: ttn.lorawan.v3.EndDeviceVersion.lorawan_version:type_name -> ttn.lorawan.v3.MACVersion + 75, // 30: ttn.lorawan.v3.EndDeviceVersion.lorawan_phy_version:type_name -> ttn.lorawan.v3.PHYVersion + 9, // 31: ttn.lorawan.v3.EndDeviceVersion.default_mac_settings:type_name -> ttn.lorawan.v3.MACSettings + 76, // 32: ttn.lorawan.v3.EndDeviceVersion.default_formatters:type_name -> ttn.lorawan.v3.MessagePayloadFormatters + 32, // 33: ttn.lorawan.v3.ADRSettings.static:type_name -> ttn.lorawan.v3.ADRSettings.StaticMode + 33, // 34: ttn.lorawan.v3.ADRSettings.dynamic:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode + 34, // 35: ttn.lorawan.v3.ADRSettings.disabled:type_name -> ttn.lorawan.v3.ADRSettings.DisabledMode + 77, // 36: ttn.lorawan.v3.MACSettings.class_b_timeout:type_name -> google.protobuf.Duration + 78, // 37: ttn.lorawan.v3.MACSettings.ping_slot_periodicity:type_name -> ttn.lorawan.v3.PingSlotPeriodValue + 72, // 38: ttn.lorawan.v3.MACSettings.ping_slot_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue + 79, // 39: ttn.lorawan.v3.MACSettings.ping_slot_frequency:type_name -> ttn.lorawan.v3.ZeroableFrequencyValue + 79, // 40: ttn.lorawan.v3.MACSettings.beacon_frequency:type_name -> ttn.lorawan.v3.ZeroableFrequencyValue + 77, // 41: ttn.lorawan.v3.MACSettings.class_c_timeout:type_name -> google.protobuf.Duration + 80, // 42: ttn.lorawan.v3.MACSettings.rx1_delay:type_name -> ttn.lorawan.v3.RxDelayValue + 81, // 43: ttn.lorawan.v3.MACSettings.rx1_data_rate_offset:type_name -> ttn.lorawan.v3.DataRateOffsetValue + 72, // 44: ttn.lorawan.v3.MACSettings.rx2_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue + 82, // 45: ttn.lorawan.v3.MACSettings.rx2_frequency:type_name -> ttn.lorawan.v3.FrequencyValue + 83, // 46: ttn.lorawan.v3.MACSettings.max_duty_cycle:type_name -> ttn.lorawan.v3.AggregatedDutyCycleValue + 2, // 47: ttn.lorawan.v3.MACSettings.supports_32_bit_f_cnt:type_name -> ttn.lorawan.v3.BoolValue + 2, // 48: ttn.lorawan.v3.MACSettings.use_adr:type_name -> ttn.lorawan.v3.BoolValue + 84, // 49: ttn.lorawan.v3.MACSettings.adr_margin:type_name -> google.protobuf.FloatValue + 2, // 50: ttn.lorawan.v3.MACSettings.resets_f_cnt:type_name -> ttn.lorawan.v3.BoolValue + 77, // 51: ttn.lorawan.v3.MACSettings.status_time_periodicity:type_name -> google.protobuf.Duration + 85, // 52: ttn.lorawan.v3.MACSettings.status_count_periodicity:type_name -> google.protobuf.UInt32Value + 80, // 53: ttn.lorawan.v3.MACSettings.desired_rx1_delay:type_name -> ttn.lorawan.v3.RxDelayValue + 81, // 54: ttn.lorawan.v3.MACSettings.desired_rx1_data_rate_offset:type_name -> ttn.lorawan.v3.DataRateOffsetValue + 72, // 55: ttn.lorawan.v3.MACSettings.desired_rx2_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue + 82, // 56: ttn.lorawan.v3.MACSettings.desired_rx2_frequency:type_name -> ttn.lorawan.v3.FrequencyValue + 83, // 57: ttn.lorawan.v3.MACSettings.desired_max_duty_cycle:type_name -> ttn.lorawan.v3.AggregatedDutyCycleValue + 70, // 58: ttn.lorawan.v3.MACSettings.desired_adr_ack_limit_exponent:type_name -> ttn.lorawan.v3.ADRAckLimitExponentValue + 71, // 59: ttn.lorawan.v3.MACSettings.desired_adr_ack_delay_exponent:type_name -> ttn.lorawan.v3.ADRAckDelayExponentValue + 72, // 60: ttn.lorawan.v3.MACSettings.desired_ping_slot_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue + 79, // 61: ttn.lorawan.v3.MACSettings.desired_ping_slot_frequency:type_name -> ttn.lorawan.v3.ZeroableFrequencyValue + 79, // 62: ttn.lorawan.v3.MACSettings.desired_beacon_frequency:type_name -> ttn.lorawan.v3.ZeroableFrequencyValue + 86, // 63: ttn.lorawan.v3.MACSettings.desired_max_eirp:type_name -> ttn.lorawan.v3.DeviceEIRPValue + 77, // 64: ttn.lorawan.v3.MACSettings.class_b_c_downlink_interval:type_name -> google.protobuf.Duration + 2, // 65: ttn.lorawan.v3.MACSettings.uplink_dwell_time:type_name -> ttn.lorawan.v3.BoolValue + 2, // 66: ttn.lorawan.v3.MACSettings.downlink_dwell_time:type_name -> ttn.lorawan.v3.BoolValue + 8, // 67: ttn.lorawan.v3.MACSettings.adr:type_name -> ttn.lorawan.v3.ADRSettings + 2, // 68: ttn.lorawan.v3.MACSettings.schedule_downlinks:type_name -> ttn.lorawan.v3.BoolValue + 5, // 69: ttn.lorawan.v3.MACSettings.relay:type_name -> ttn.lorawan.v3.RelayParameters + 5, // 70: ttn.lorawan.v3.MACSettings.desired_relay:type_name -> ttn.lorawan.v3.RelayParameters + 6, // 71: ttn.lorawan.v3.MACState.current_parameters:type_name -> ttn.lorawan.v3.MACParameters + 6, // 72: ttn.lorawan.v3.MACState.desired_parameters:type_name -> ttn.lorawan.v3.MACParameters + 87, // 73: ttn.lorawan.v3.MACState.device_class:type_name -> ttn.lorawan.v3.Class + 74, // 74: ttn.lorawan.v3.MACState.lorawan_version:type_name -> ttn.lorawan.v3.MACVersion + 57, // 75: ttn.lorawan.v3.MACState.last_confirmed_downlink_at:type_name -> google.protobuf.Timestamp + 78, // 76: ttn.lorawan.v3.MACState.ping_slot_periodicity:type_name -> ttn.lorawan.v3.PingSlotPeriodValue + 58, // 77: ttn.lorawan.v3.MACState.pending_application_downlink:type_name -> ttn.lorawan.v3.ApplicationDownlink + 88, // 78: ttn.lorawan.v3.MACState.queued_responses:type_name -> ttn.lorawan.v3.MACCommand + 88, // 79: ttn.lorawan.v3.MACState.pending_requests:type_name -> ttn.lorawan.v3.MACCommand + 39, // 80: ttn.lorawan.v3.MACState.queued_join_accept:type_name -> ttn.lorawan.v3.MACState.JoinAccept + 38, // 81: ttn.lorawan.v3.MACState.pending_join_request:type_name -> ttn.lorawan.v3.MACState.JoinRequest + 40, // 82: ttn.lorawan.v3.MACState.recent_uplinks:type_name -> ttn.lorawan.v3.MACState.UplinkMessage + 41, // 83: ttn.lorawan.v3.MACState.recent_downlinks:type_name -> ttn.lorawan.v3.MACState.DownlinkMessage + 57, // 84: ttn.lorawan.v3.MACState.last_network_initiated_downlink_at:type_name -> google.protobuf.Timestamp + 64, // 85: ttn.lorawan.v3.MACState.rejected_adr_data_rate_indexes:type_name -> ttn.lorawan.v3.DataRateIndex + 57, // 86: ttn.lorawan.v3.MACState.last_downlink_at:type_name -> google.protobuf.Timestamp + 44, // 87: ttn.lorawan.v3.MACState.rejected_data_rate_ranges:type_name -> ttn.lorawan.v3.MACState.RejectedDataRateRangesEntry + 89, // 88: ttn.lorawan.v3.MACState.recent_mac_command_identifiers:type_name -> ttn.lorawan.v3.MACCommandIdentifier + 90, // 89: ttn.lorawan.v3.MACState.pending_relay_downlink:type_name -> ttn.lorawan.v3.RelayForwardDownlinkReq + 57, // 90: ttn.lorawan.v3.EndDeviceAuthenticationCode.valid_from:type_name -> google.protobuf.Timestamp + 57, // 91: ttn.lorawan.v3.EndDeviceAuthenticationCode.valid_to:type_name -> google.protobuf.Timestamp + 91, // 92: ttn.lorawan.v3.EndDevice.ids:type_name -> ttn.lorawan.v3.EndDeviceIdentifiers + 57, // 93: ttn.lorawan.v3.EndDevice.created_at:type_name -> google.protobuf.Timestamp + 57, // 94: ttn.lorawan.v3.EndDevice.updated_at:type_name -> google.protobuf.Timestamp + 52, // 95: ttn.lorawan.v3.EndDevice.attributes:type_name -> ttn.lorawan.v3.EndDevice.AttributesEntry + 73, // 96: ttn.lorawan.v3.EndDevice.version_ids:type_name -> ttn.lorawan.v3.EndDeviceVersionIdentifiers + 53, // 97: ttn.lorawan.v3.EndDevice.locations:type_name -> ttn.lorawan.v3.EndDevice.LocationsEntry + 92, // 98: ttn.lorawan.v3.EndDevice.picture:type_name -> ttn.lorawan.v3.Picture + 74, // 99: ttn.lorawan.v3.EndDevice.lorawan_version:type_name -> ttn.lorawan.v3.MACVersion + 75, // 100: ttn.lorawan.v3.EndDevice.lorawan_phy_version:type_name -> ttn.lorawan.v3.PHYVersion + 93, // 101: ttn.lorawan.v3.EndDevice.root_keys:type_name -> ttn.lorawan.v3.RootKeys + 9, // 102: ttn.lorawan.v3.EndDevice.mac_settings:type_name -> ttn.lorawan.v3.MACSettings + 10, // 103: ttn.lorawan.v3.EndDevice.mac_state:type_name -> ttn.lorawan.v3.MACState + 10, // 104: ttn.lorawan.v3.EndDevice.pending_mac_state:type_name -> ttn.lorawan.v3.MACState + 1, // 105: ttn.lorawan.v3.EndDevice.session:type_name -> ttn.lorawan.v3.Session + 1, // 106: ttn.lorawan.v3.EndDevice.pending_session:type_name -> ttn.lorawan.v3.Session + 57, // 107: ttn.lorawan.v3.EndDevice.last_dev_status_received_at:type_name -> google.protobuf.Timestamp + 0, // 108: ttn.lorawan.v3.EndDevice.power_state:type_name -> ttn.lorawan.v3.PowerState + 84, // 109: ttn.lorawan.v3.EndDevice.battery_percentage:type_name -> google.protobuf.FloatValue + 58, // 110: ttn.lorawan.v3.EndDevice.queued_application_downlinks:type_name -> ttn.lorawan.v3.ApplicationDownlink + 76, // 111: ttn.lorawan.v3.EndDevice.formatters:type_name -> ttn.lorawan.v3.MessagePayloadFormatters + 94, // 112: ttn.lorawan.v3.EndDevice.provisioning_data:type_name -> google.protobuf.Struct + 11, // 113: ttn.lorawan.v3.EndDevice.claim_authentication_code:type_name -> ttn.lorawan.v3.EndDeviceAuthenticationCode + 95, // 114: ttn.lorawan.v3.EndDevice.skip_payload_crypto_override:type_name -> google.protobuf.BoolValue + 57, // 115: ttn.lorawan.v3.EndDevice.activated_at:type_name -> google.protobuf.Timestamp + 57, // 116: ttn.lorawan.v3.EndDevice.last_seen_at:type_name -> google.protobuf.Timestamp + 96, // 117: ttn.lorawan.v3.EndDevice.lora_alliance_profile_ids:type_name -> ttn.lorawan.v3.LoRaAllianceProfileIdentifiers + 12, // 118: ttn.lorawan.v3.EndDevices.end_devices:type_name -> ttn.lorawan.v3.EndDevice + 12, // 119: ttn.lorawan.v3.CreateEndDeviceRequest.end_device:type_name -> ttn.lorawan.v3.EndDevice + 12, // 120: ttn.lorawan.v3.UpdateEndDeviceRequest.end_device:type_name -> ttn.lorawan.v3.EndDevice + 97, // 121: ttn.lorawan.v3.UpdateEndDeviceRequest.field_mask:type_name -> google.protobuf.FieldMask + 54, // 122: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest.updates:type_name -> ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest.EndDeviceLastSeenUpdate + 91, // 123: ttn.lorawan.v3.GetEndDeviceRequest.end_device_ids:type_name -> ttn.lorawan.v3.EndDeviceIdentifiers + 97, // 124: ttn.lorawan.v3.GetEndDeviceRequest.field_mask:type_name -> google.protobuf.FieldMask + 98, // 125: ttn.lorawan.v3.ListEndDevicesRequest.application_ids:type_name -> ttn.lorawan.v3.ApplicationIdentifiers + 97, // 126: ttn.lorawan.v3.ListEndDevicesRequest.field_mask:type_name -> google.protobuf.FieldMask + 12, // 127: ttn.lorawan.v3.SetEndDeviceRequest.end_device:type_name -> ttn.lorawan.v3.EndDevice + 97, // 128: ttn.lorawan.v3.SetEndDeviceRequest.field_mask:type_name -> google.protobuf.FieldMask + 91, // 129: ttn.lorawan.v3.ResetAndGetEndDeviceRequest.end_device_ids:type_name -> ttn.lorawan.v3.EndDeviceIdentifiers + 97, // 130: ttn.lorawan.v3.ResetAndGetEndDeviceRequest.field_mask:type_name -> google.protobuf.FieldMask + 12, // 131: ttn.lorawan.v3.EndDeviceTemplate.end_device:type_name -> ttn.lorawan.v3.EndDevice + 97, // 132: ttn.lorawan.v3.EndDeviceTemplate.field_mask:type_name -> google.protobuf.FieldMask + 55, // 133: ttn.lorawan.v3.EndDeviceTemplateFormats.formats:type_name -> ttn.lorawan.v3.EndDeviceTemplateFormats.FormatsEntry + 73, // 134: ttn.lorawan.v3.ConvertEndDeviceTemplateRequest.end_device_version_ids:type_name -> ttn.lorawan.v3.EndDeviceVersionIdentifiers + 98, // 135: ttn.lorawan.v3.BatchDeleteEndDevicesRequest.application_ids:type_name -> ttn.lorawan.v3.ApplicationIdentifiers + 98, // 136: ttn.lorawan.v3.BatchGetEndDevicesRequest.application_ids:type_name -> ttn.lorawan.v3.ApplicationIdentifiers + 97, // 137: ttn.lorawan.v3.BatchGetEndDevicesRequest.field_mask:type_name -> google.protobuf.FieldMask + 99, // 138: ttn.lorawan.v3.ServingRelayParameters.UplinkForwardingRule.limits:type_name -> ttn.lorawan.v3.RelayUplinkForwardLimits + 100, // 139: ttn.lorawan.v3.ServingRelayParameters.ForwardingLimits.reset_behavior:type_name -> ttn.lorawan.v3.RelayResetLimitCounter + 101, // 140: ttn.lorawan.v3.ServingRelayParameters.ForwardingLimits.join_requests:type_name -> ttn.lorawan.v3.RelayForwardLimits + 101, // 141: ttn.lorawan.v3.ServingRelayParameters.ForwardingLimits.notifications:type_name -> ttn.lorawan.v3.RelayForwardLimits + 101, // 142: ttn.lorawan.v3.ServingRelayParameters.ForwardingLimits.uplink_messages:type_name -> ttn.lorawan.v3.RelayForwardLimits + 101, // 143: ttn.lorawan.v3.ServingRelayParameters.ForwardingLimits.overall:type_name -> ttn.lorawan.v3.RelayForwardLimits + 64, // 144: ttn.lorawan.v3.MACParameters.Channel.min_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 64, // 145: ttn.lorawan.v3.MACParameters.Channel.max_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 64, // 146: ttn.lorawan.v3.ADRSettings.StaticMode.data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 84, // 147: ttn.lorawan.v3.ADRSettings.DynamicMode.margin:type_name -> google.protobuf.FloatValue + 72, // 148: ttn.lorawan.v3.ADRSettings.DynamicMode.min_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue + 72, // 149: ttn.lorawan.v3.ADRSettings.DynamicMode.max_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue + 85, // 150: ttn.lorawan.v3.ADRSettings.DynamicMode.min_tx_power_index:type_name -> google.protobuf.UInt32Value + 85, // 151: ttn.lorawan.v3.ADRSettings.DynamicMode.max_tx_power_index:type_name -> google.protobuf.UInt32Value + 85, // 152: ttn.lorawan.v3.ADRSettings.DynamicMode.min_nb_trans:type_name -> google.protobuf.UInt32Value + 85, // 153: ttn.lorawan.v3.ADRSettings.DynamicMode.max_nb_trans:type_name -> google.protobuf.UInt32Value + 35, // 154: ttn.lorawan.v3.ADRSettings.DynamicMode.channel_steering:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings + 36, // 155: ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.lora_narrow:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.LoRaNarrowMode + 37, // 156: ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.disabled:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.DisabledMode + 102, // 157: ttn.lorawan.v3.MACState.JoinRequest.downlink_settings:type_name -> ttn.lorawan.v3.DLSettings + 65, // 158: ttn.lorawan.v3.MACState.JoinRequest.rx_delay:type_name -> ttn.lorawan.v3.RxDelay + 103, // 159: ttn.lorawan.v3.MACState.JoinRequest.cf_list:type_name -> ttn.lorawan.v3.CFList + 38, // 160: ttn.lorawan.v3.MACState.JoinAccept.request:type_name -> ttn.lorawan.v3.MACState.JoinRequest + 56, // 161: ttn.lorawan.v3.MACState.JoinAccept.keys:type_name -> ttn.lorawan.v3.SessionKeys + 104, // 162: ttn.lorawan.v3.MACState.UplinkMessage.payload:type_name -> ttn.lorawan.v3.Message + 45, // 163: ttn.lorawan.v3.MACState.UplinkMessage.settings:type_name -> ttn.lorawan.v3.MACState.UplinkMessage.TxSettings + 46, // 164: ttn.lorawan.v3.MACState.UplinkMessage.rx_metadata:type_name -> ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata + 57, // 165: ttn.lorawan.v3.MACState.UplinkMessage.received_at:type_name -> google.protobuf.Timestamp + 49, // 166: ttn.lorawan.v3.MACState.DownlinkMessage.payload:type_name -> ttn.lorawan.v3.MACState.DownlinkMessage.Message + 64, // 167: ttn.lorawan.v3.MACState.DataRateRange.min_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 64, // 168: ttn.lorawan.v3.MACState.DataRateRange.max_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 42, // 169: ttn.lorawan.v3.MACState.DataRateRanges.ranges:type_name -> ttn.lorawan.v3.MACState.DataRateRange + 43, // 170: ttn.lorawan.v3.MACState.RejectedDataRateRangesEntry.value:type_name -> ttn.lorawan.v3.MACState.DataRateRanges + 105, // 171: ttn.lorawan.v3.MACState.UplinkMessage.TxSettings.data_rate:type_name -> ttn.lorawan.v3.DataRate + 106, // 172: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers + 107, // 173: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.downlink_path_constraint:type_name -> ttn.lorawan.v3.DownlinkPathConstraint + 47, // 174: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.packet_broker:type_name -> ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.PacketBrokerMetadata + 48, // 175: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.relay:type_name -> ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.RelayMetadata + 50, // 176: ttn.lorawan.v3.MACState.DownlinkMessage.Message.m_hdr:type_name -> ttn.lorawan.v3.MACState.DownlinkMessage.Message.MHDR + 51, // 177: ttn.lorawan.v3.MACState.DownlinkMessage.Message.mac_payload:type_name -> ttn.lorawan.v3.MACState.DownlinkMessage.Message.MACPayload + 108, // 178: ttn.lorawan.v3.MACState.DownlinkMessage.Message.MHDR.m_type:type_name -> ttn.lorawan.v3.MType + 109, // 179: ttn.lorawan.v3.EndDevice.LocationsEntry.value:type_name -> ttn.lorawan.v3.Location + 91, // 180: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest.EndDeviceLastSeenUpdate.ids:type_name -> ttn.lorawan.v3.EndDeviceIdentifiers + 57, // 181: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest.EndDeviceLastSeenUpdate.last_seen_at:type_name -> google.protobuf.Timestamp + 24, // 182: ttn.lorawan.v3.EndDeviceTemplateFormats.FormatsEntry.value:type_name -> ttn.lorawan.v3.EndDeviceTemplateFormat + 183, // [183:183] is the sub-list for method output_type + 183, // [183:183] is the sub-list for method input_type + 183, // [183:183] is the sub-list for extension type_name + 183, // [183:183] is the sub-list for extension extendee + 0, // [0:183] is the sub-list for field type_name } func init() { file_ttn_lorawan_v3_end_device_proto_init() } @@ -5913,7 +6629,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACParameters); i { + switch v := v.(*ServingRelayParameters); i { case 0: return &v.state case 1: @@ -5925,7 +6641,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EndDeviceVersion); i { + switch v := v.(*ServedRelayParameters); i { case 0: return &v.state case 1: @@ -5937,7 +6653,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ADRSettings); i { + switch v := v.(*RelayParameters); i { case 0: return &v.state case 1: @@ -5949,7 +6665,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACSettings); i { + switch v := v.(*MACParameters); i { case 0: return &v.state case 1: @@ -5961,7 +6677,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACState); i { + switch v := v.(*EndDeviceVersion); i { case 0: return &v.state case 1: @@ -5973,7 +6689,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EndDeviceAuthenticationCode); i { + switch v := v.(*ADRSettings); i { case 0: return &v.state case 1: @@ -5985,7 +6701,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EndDevice); i { + switch v := v.(*MACSettings); i { case 0: return &v.state case 1: @@ -5997,7 +6713,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EndDevices); i { + switch v := v.(*MACState); i { case 0: return &v.state case 1: @@ -6009,7 +6725,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DevAddrPrefix); i { + switch v := v.(*EndDeviceAuthenticationCode); i { case 0: return &v.state case 1: @@ -6021,7 +6737,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateEndDeviceRequest); i { + switch v := v.(*EndDevice); i { case 0: return &v.state case 1: @@ -6033,7 +6749,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateEndDeviceRequest); i { + switch v := v.(*EndDevices); i { case 0: return &v.state case 1: @@ -6045,7 +6761,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchUpdateEndDeviceLastSeenRequest); i { + switch v := v.(*DevAddrPrefix); i { case 0: return &v.state case 1: @@ -6057,7 +6773,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetEndDeviceRequest); i { + switch v := v.(*CreateEndDeviceRequest); i { case 0: return &v.state case 1: @@ -6069,7 +6785,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetEndDeviceIdentifiersForEUIsRequest); i { + switch v := v.(*UpdateEndDeviceRequest); i { case 0: return &v.state case 1: @@ -6081,7 +6797,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListEndDevicesRequest); i { + switch v := v.(*BatchUpdateEndDeviceLastSeenRequest); i { case 0: return &v.state case 1: @@ -6093,7 +6809,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetEndDeviceRequest); i { + switch v := v.(*GetEndDeviceRequest); i { case 0: return &v.state case 1: @@ -6105,7 +6821,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResetAndGetEndDeviceRequest); i { + switch v := v.(*GetEndDeviceIdentifiersForEUIsRequest); i { case 0: return &v.state case 1: @@ -6117,7 +6833,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EndDeviceTemplate); i { + switch v := v.(*ListEndDevicesRequest); i { case 0: return &v.state case 1: @@ -6129,7 +6845,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EndDeviceTemplateFormat); i { + switch v := v.(*SetEndDeviceRequest); i { case 0: return &v.state case 1: @@ -6141,7 +6857,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EndDeviceTemplateFormats); i { + switch v := v.(*ResetAndGetEndDeviceRequest); i { case 0: return &v.state case 1: @@ -6153,7 +6869,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConvertEndDeviceTemplateRequest); i { + switch v := v.(*EndDeviceTemplate); i { case 0: return &v.state case 1: @@ -6165,7 +6881,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchDeleteEndDevicesRequest); i { + switch v := v.(*EndDeviceTemplateFormat); i { case 0: return &v.state case 1: @@ -6177,7 +6893,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchGetEndDevicesRequest); i { + switch v := v.(*EndDeviceTemplateFormats); i { case 0: return &v.state case 1: @@ -6189,7 +6905,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACParameters_Channel); i { + switch v := v.(*ConvertEndDeviceTemplateRequest); i { case 0: return &v.state case 1: @@ -6201,7 +6917,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ADRSettings_StaticMode); i { + switch v := v.(*BatchDeleteEndDevicesRequest); i { case 0: return &v.state case 1: @@ -6213,7 +6929,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ADRSettings_DynamicMode); i { + switch v := v.(*BatchGetEndDevicesRequest); i { case 0: return &v.state case 1: @@ -6225,7 +6941,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ADRSettings_DisabledMode); i { + switch v := v.(*ServingRelayParameters_UplinkForwardingRule); i { case 0: return &v.state case 1: @@ -6237,7 +6953,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ADRSettings_DynamicMode_ChannelSteeringSettings); i { + switch v := v.(*ServingRelayParameters_ForwardingLimits); i { case 0: return &v.state case 1: @@ -6249,7 +6965,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode); i { + switch v := v.(*MACParameters_Channel); i { case 0: return &v.state case 1: @@ -6261,7 +6977,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode); i { + switch v := v.(*ADRSettings_StaticMode); i { case 0: return &v.state case 1: @@ -6273,7 +6989,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACState_JoinRequest); i { + switch v := v.(*ADRSettings_DynamicMode); i { case 0: return &v.state case 1: @@ -6285,7 +7001,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACState_JoinAccept); i { + switch v := v.(*ADRSettings_DisabledMode); i { case 0: return &v.state case 1: @@ -6297,7 +7013,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACState_UplinkMessage); i { + switch v := v.(*ADRSettings_DynamicMode_ChannelSteeringSettings); i { case 0: return &v.state case 1: @@ -6309,7 +7025,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACState_DownlinkMessage); i { + switch v := v.(*ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode); i { case 0: return &v.state case 1: @@ -6321,7 +7037,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACState_DataRateRange); i { + switch v := v.(*ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode); i { case 0: return &v.state case 1: @@ -6333,7 +7049,19 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACState_DataRateRanges); i { + switch v := v.(*MACState_JoinRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_end_device_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACState_JoinAccept); i { case 0: return &v.state case 1: @@ -6345,7 +7073,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACState_UplinkMessage_TxSettings); i { + switch v := v.(*MACState_UplinkMessage); i { case 0: return &v.state case 1: @@ -6357,7 +7085,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACState_UplinkMessage_RxMetadata); i { + switch v := v.(*MACState_DownlinkMessage); i { case 0: return &v.state case 1: @@ -6369,7 +7097,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata); i { + switch v := v.(*MACState_DataRateRange); i { case 0: return &v.state case 1: @@ -6381,6 +7109,66 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACState_DataRateRanges); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_end_device_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACState_UplinkMessage_TxSettings); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_end_device_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACState_UplinkMessage_RxMetadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_end_device_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_end_device_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACState_UplinkMessage_RxMetadata_RelayMetadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_end_device_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MACState_DownlinkMessage_Message); i { case 0: return &v.state @@ -6392,7 +7180,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { return nil } } - file_ttn_lorawan_v3_end_device_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_ttn_lorawan_v3_end_device_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MACState_DownlinkMessage_Message_MHDR); i { case 0: return &v.state @@ -6404,7 +7192,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { return nil } } - file_ttn_lorawan_v3_end_device_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_ttn_lorawan_v3_end_device_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MACState_DownlinkMessage_Message_MACPayload); i { case 0: return &v.state @@ -6416,7 +7204,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { return nil } } - file_ttn_lorawan_v3_end_device_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_ttn_lorawan_v3_end_device_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate); i { case 0: return &v.state @@ -6429,12 +7217,21 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } } + file_ttn_lorawan_v3_end_device_proto_msgTypes[3].OneofWrappers = []interface{}{ + (*ServedRelayParameters_Always)(nil), + (*ServedRelayParameters_Dynamic)(nil), + (*ServedRelayParameters_EndDeviceControlled)(nil), + } file_ttn_lorawan_v3_end_device_proto_msgTypes[4].OneofWrappers = []interface{}{ + (*RelayParameters_Serving)(nil), + (*RelayParameters_Served)(nil), + } + file_ttn_lorawan_v3_end_device_proto_msgTypes[7].OneofWrappers = []interface{}{ (*ADRSettings_Static)(nil), (*ADRSettings_Dynamic)(nil), (*ADRSettings_Disabled)(nil), } - file_ttn_lorawan_v3_end_device_proto_msgTypes[29].OneofWrappers = []interface{}{ + file_ttn_lorawan_v3_end_device_proto_msgTypes[34].OneofWrappers = []interface{}{ (*ADRSettings_DynamicMode_ChannelSteeringSettings_LoraNarrow)(nil), (*ADRSettings_DynamicMode_ChannelSteeringSettings_Disabled)(nil), } @@ -6444,7 +7241,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_ttn_lorawan_v3_end_device_proto_rawDesc, NumEnums: 1, - NumMessages: 49, + NumMessages: 55, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/ttnpb/end_device.pb.paths.fm.go b/pkg/ttnpb/end_device.pb.paths.fm.go index 8a4bf5852b..5c3bb2b579 100644 --- a/pkg/ttnpb/end_device.pb.paths.fm.go +++ b/pkg/ttnpb/end_device.pb.paths.fm.go @@ -47,6 +47,98 @@ var BoolValueFieldPathsNested = []string{ var BoolValueFieldPathsTopLevel = []string{ "value", } +var ServingRelayParametersFieldPathsNested = []string{ + "cad_periodicity", + "default_channel_index", + "limits", + "limits.join_requests", + "limits.join_requests.bucket_size", + "limits.join_requests.reload_rate", + "limits.notifications", + "limits.notifications.bucket_size", + "limits.notifications.reload_rate", + "limits.overall", + "limits.overall.bucket_size", + "limits.overall.reload_rate", + "limits.reset_behavior", + "limits.uplink_messages", + "limits.uplink_messages.bucket_size", + "limits.uplink_messages.reload_rate", + "second_channel", + "second_channel.ack_offset", + "second_channel.data_rate_index", + "second_channel.frequency", + "uplink_forwarding_rules", +} + +var ServingRelayParametersFieldPathsTopLevel = []string{ + "cad_periodicity", + "default_channel_index", + "limits", + "second_channel", + "uplink_forwarding_rules", +} +var ServedRelayParametersFieldPathsNested = []string{ + "backoff", + "mode", + "mode.always", + "mode.dynamic", + "mode.dynamic.smart_enable_level", + "mode.end_device_controlled", + "second_channel", + "second_channel.ack_offset", + "second_channel.data_rate_index", + "second_channel.frequency", + "serving_device_id", +} + +var ServedRelayParametersFieldPathsTopLevel = []string{ + "backoff", + "mode", + "second_channel", + "serving_device_id", +} +var RelayParametersFieldPathsNested = []string{ + "mode", + "mode.served", + "mode.served.backoff", + "mode.served.mode", + "mode.served.mode.always", + "mode.served.mode.dynamic", + "mode.served.mode.dynamic.smart_enable_level", + "mode.served.mode.end_device_controlled", + "mode.served.second_channel", + "mode.served.second_channel.ack_offset", + "mode.served.second_channel.data_rate_index", + "mode.served.second_channel.frequency", + "mode.served.serving_device_id", + "mode.serving", + "mode.serving.cad_periodicity", + "mode.serving.default_channel_index", + "mode.serving.limits", + "mode.serving.limits.join_requests", + "mode.serving.limits.join_requests.bucket_size", + "mode.serving.limits.join_requests.reload_rate", + "mode.serving.limits.notifications", + "mode.serving.limits.notifications.bucket_size", + "mode.serving.limits.notifications.reload_rate", + "mode.serving.limits.overall", + "mode.serving.limits.overall.bucket_size", + "mode.serving.limits.overall.reload_rate", + "mode.serving.limits.reset_behavior", + "mode.serving.limits.uplink_messages", + "mode.serving.limits.uplink_messages.bucket_size", + "mode.serving.limits.uplink_messages.reload_rate", + "mode.serving.second_channel", + "mode.serving.second_channel.ack_offset", + "mode.serving.second_channel.data_rate_index", + "mode.serving.second_channel.frequency", + "mode.serving.uplink_forwarding_rules", +} + +var RelayParametersFieldPathsTopLevel = []string{ + "mode", +} var MACParametersFieldPathsNested = []string{ "adr_ack_delay", "adr_ack_delay_exponent", @@ -69,6 +161,42 @@ var MACParametersFieldPathsNested = []string{ "ping_slot_frequency", "rejoin_count_periodicity", "rejoin_time_periodicity", + "relay", + "relay.mode", + "relay.mode.served", + "relay.mode.served.backoff", + "relay.mode.served.mode", + "relay.mode.served.mode.always", + "relay.mode.served.mode.dynamic", + "relay.mode.served.mode.dynamic.smart_enable_level", + "relay.mode.served.mode.end_device_controlled", + "relay.mode.served.second_channel", + "relay.mode.served.second_channel.ack_offset", + "relay.mode.served.second_channel.data_rate_index", + "relay.mode.served.second_channel.frequency", + "relay.mode.served.serving_device_id", + "relay.mode.serving", + "relay.mode.serving.cad_periodicity", + "relay.mode.serving.default_channel_index", + "relay.mode.serving.limits", + "relay.mode.serving.limits.join_requests", + "relay.mode.serving.limits.join_requests.bucket_size", + "relay.mode.serving.limits.join_requests.reload_rate", + "relay.mode.serving.limits.notifications", + "relay.mode.serving.limits.notifications.bucket_size", + "relay.mode.serving.limits.notifications.reload_rate", + "relay.mode.serving.limits.overall", + "relay.mode.serving.limits.overall.bucket_size", + "relay.mode.serving.limits.overall.reload_rate", + "relay.mode.serving.limits.reset_behavior", + "relay.mode.serving.limits.uplink_messages", + "relay.mode.serving.limits.uplink_messages.bucket_size", + "relay.mode.serving.limits.uplink_messages.reload_rate", + "relay.mode.serving.second_channel", + "relay.mode.serving.second_channel.ack_offset", + "relay.mode.serving.second_channel.data_rate_index", + "relay.mode.serving.second_channel.frequency", + "relay.mode.serving.uplink_forwarding_rules", "rx1_data_rate_offset", "rx1_delay", "rx2_data_rate_index", @@ -95,6 +223,7 @@ var MACParametersFieldPathsTopLevel = []string{ "ping_slot_frequency", "rejoin_count_periodicity", "rejoin_time_periodicity", + "relay", "rx1_data_rate_offset", "rx1_delay", "rx2_data_rate_index", @@ -149,6 +278,42 @@ var EndDeviceVersionFieldPathsNested = []string{ "default_mac_settings.desired_ping_slot_data_rate_index.value", "default_mac_settings.desired_ping_slot_frequency", "default_mac_settings.desired_ping_slot_frequency.value", + "default_mac_settings.desired_relay", + "default_mac_settings.desired_relay.mode", + "default_mac_settings.desired_relay.mode.served", + "default_mac_settings.desired_relay.mode.served.backoff", + "default_mac_settings.desired_relay.mode.served.mode", + "default_mac_settings.desired_relay.mode.served.mode.always", + "default_mac_settings.desired_relay.mode.served.mode.dynamic", + "default_mac_settings.desired_relay.mode.served.mode.dynamic.smart_enable_level", + "default_mac_settings.desired_relay.mode.served.mode.end_device_controlled", + "default_mac_settings.desired_relay.mode.served.second_channel", + "default_mac_settings.desired_relay.mode.served.second_channel.ack_offset", + "default_mac_settings.desired_relay.mode.served.second_channel.data_rate_index", + "default_mac_settings.desired_relay.mode.served.second_channel.frequency", + "default_mac_settings.desired_relay.mode.served.serving_device_id", + "default_mac_settings.desired_relay.mode.serving", + "default_mac_settings.desired_relay.mode.serving.cad_periodicity", + "default_mac_settings.desired_relay.mode.serving.default_channel_index", + "default_mac_settings.desired_relay.mode.serving.limits", + "default_mac_settings.desired_relay.mode.serving.limits.join_requests", + "default_mac_settings.desired_relay.mode.serving.limits.join_requests.bucket_size", + "default_mac_settings.desired_relay.mode.serving.limits.join_requests.reload_rate", + "default_mac_settings.desired_relay.mode.serving.limits.notifications", + "default_mac_settings.desired_relay.mode.serving.limits.notifications.bucket_size", + "default_mac_settings.desired_relay.mode.serving.limits.notifications.reload_rate", + "default_mac_settings.desired_relay.mode.serving.limits.overall", + "default_mac_settings.desired_relay.mode.serving.limits.overall.bucket_size", + "default_mac_settings.desired_relay.mode.serving.limits.overall.reload_rate", + "default_mac_settings.desired_relay.mode.serving.limits.reset_behavior", + "default_mac_settings.desired_relay.mode.serving.limits.uplink_messages", + "default_mac_settings.desired_relay.mode.serving.limits.uplink_messages.bucket_size", + "default_mac_settings.desired_relay.mode.serving.limits.uplink_messages.reload_rate", + "default_mac_settings.desired_relay.mode.serving.second_channel", + "default_mac_settings.desired_relay.mode.serving.second_channel.ack_offset", + "default_mac_settings.desired_relay.mode.serving.second_channel.data_rate_index", + "default_mac_settings.desired_relay.mode.serving.second_channel.frequency", + "default_mac_settings.desired_relay.mode.serving.uplink_forwarding_rules", "default_mac_settings.desired_rx1_data_rate_offset", "default_mac_settings.desired_rx1_data_rate_offset.value", "default_mac_settings.desired_rx1_delay", @@ -168,6 +333,42 @@ var EndDeviceVersionFieldPathsNested = []string{ "default_mac_settings.ping_slot_frequency.value", "default_mac_settings.ping_slot_periodicity", "default_mac_settings.ping_slot_periodicity.value", + "default_mac_settings.relay", + "default_mac_settings.relay.mode", + "default_mac_settings.relay.mode.served", + "default_mac_settings.relay.mode.served.backoff", + "default_mac_settings.relay.mode.served.mode", + "default_mac_settings.relay.mode.served.mode.always", + "default_mac_settings.relay.mode.served.mode.dynamic", + "default_mac_settings.relay.mode.served.mode.dynamic.smart_enable_level", + "default_mac_settings.relay.mode.served.mode.end_device_controlled", + "default_mac_settings.relay.mode.served.second_channel", + "default_mac_settings.relay.mode.served.second_channel.ack_offset", + "default_mac_settings.relay.mode.served.second_channel.data_rate_index", + "default_mac_settings.relay.mode.served.second_channel.frequency", + "default_mac_settings.relay.mode.served.serving_device_id", + "default_mac_settings.relay.mode.serving", + "default_mac_settings.relay.mode.serving.cad_periodicity", + "default_mac_settings.relay.mode.serving.default_channel_index", + "default_mac_settings.relay.mode.serving.limits", + "default_mac_settings.relay.mode.serving.limits.join_requests", + "default_mac_settings.relay.mode.serving.limits.join_requests.bucket_size", + "default_mac_settings.relay.mode.serving.limits.join_requests.reload_rate", + "default_mac_settings.relay.mode.serving.limits.notifications", + "default_mac_settings.relay.mode.serving.limits.notifications.bucket_size", + "default_mac_settings.relay.mode.serving.limits.notifications.reload_rate", + "default_mac_settings.relay.mode.serving.limits.overall", + "default_mac_settings.relay.mode.serving.limits.overall.bucket_size", + "default_mac_settings.relay.mode.serving.limits.overall.reload_rate", + "default_mac_settings.relay.mode.serving.limits.reset_behavior", + "default_mac_settings.relay.mode.serving.limits.uplink_messages", + "default_mac_settings.relay.mode.serving.limits.uplink_messages.bucket_size", + "default_mac_settings.relay.mode.serving.limits.uplink_messages.reload_rate", + "default_mac_settings.relay.mode.serving.second_channel", + "default_mac_settings.relay.mode.serving.second_channel.ack_offset", + "default_mac_settings.relay.mode.serving.second_channel.data_rate_index", + "default_mac_settings.relay.mode.serving.second_channel.frequency", + "default_mac_settings.relay.mode.serving.uplink_forwarding_rules", "default_mac_settings.resets_f_cnt", "default_mac_settings.resets_f_cnt.value", "default_mac_settings.rx1_data_rate_offset", @@ -289,6 +490,42 @@ var MACSettingsFieldPathsNested = []string{ "desired_ping_slot_data_rate_index.value", "desired_ping_slot_frequency", "desired_ping_slot_frequency.value", + "desired_relay", + "desired_relay.mode", + "desired_relay.mode.served", + "desired_relay.mode.served.backoff", + "desired_relay.mode.served.mode", + "desired_relay.mode.served.mode.always", + "desired_relay.mode.served.mode.dynamic", + "desired_relay.mode.served.mode.dynamic.smart_enable_level", + "desired_relay.mode.served.mode.end_device_controlled", + "desired_relay.mode.served.second_channel", + "desired_relay.mode.served.second_channel.ack_offset", + "desired_relay.mode.served.second_channel.data_rate_index", + "desired_relay.mode.served.second_channel.frequency", + "desired_relay.mode.served.serving_device_id", + "desired_relay.mode.serving", + "desired_relay.mode.serving.cad_periodicity", + "desired_relay.mode.serving.default_channel_index", + "desired_relay.mode.serving.limits", + "desired_relay.mode.serving.limits.join_requests", + "desired_relay.mode.serving.limits.join_requests.bucket_size", + "desired_relay.mode.serving.limits.join_requests.reload_rate", + "desired_relay.mode.serving.limits.notifications", + "desired_relay.mode.serving.limits.notifications.bucket_size", + "desired_relay.mode.serving.limits.notifications.reload_rate", + "desired_relay.mode.serving.limits.overall", + "desired_relay.mode.serving.limits.overall.bucket_size", + "desired_relay.mode.serving.limits.overall.reload_rate", + "desired_relay.mode.serving.limits.reset_behavior", + "desired_relay.mode.serving.limits.uplink_messages", + "desired_relay.mode.serving.limits.uplink_messages.bucket_size", + "desired_relay.mode.serving.limits.uplink_messages.reload_rate", + "desired_relay.mode.serving.second_channel", + "desired_relay.mode.serving.second_channel.ack_offset", + "desired_relay.mode.serving.second_channel.data_rate_index", + "desired_relay.mode.serving.second_channel.frequency", + "desired_relay.mode.serving.uplink_forwarding_rules", "desired_rx1_data_rate_offset", "desired_rx1_data_rate_offset.value", "desired_rx1_delay", @@ -308,6 +545,42 @@ var MACSettingsFieldPathsNested = []string{ "ping_slot_frequency.value", "ping_slot_periodicity", "ping_slot_periodicity.value", + "relay", + "relay.mode", + "relay.mode.served", + "relay.mode.served.backoff", + "relay.mode.served.mode", + "relay.mode.served.mode.always", + "relay.mode.served.mode.dynamic", + "relay.mode.served.mode.dynamic.smart_enable_level", + "relay.mode.served.mode.end_device_controlled", + "relay.mode.served.second_channel", + "relay.mode.served.second_channel.ack_offset", + "relay.mode.served.second_channel.data_rate_index", + "relay.mode.served.second_channel.frequency", + "relay.mode.served.serving_device_id", + "relay.mode.serving", + "relay.mode.serving.cad_periodicity", + "relay.mode.serving.default_channel_index", + "relay.mode.serving.limits", + "relay.mode.serving.limits.join_requests", + "relay.mode.serving.limits.join_requests.bucket_size", + "relay.mode.serving.limits.join_requests.reload_rate", + "relay.mode.serving.limits.notifications", + "relay.mode.serving.limits.notifications.bucket_size", + "relay.mode.serving.limits.notifications.reload_rate", + "relay.mode.serving.limits.overall", + "relay.mode.serving.limits.overall.bucket_size", + "relay.mode.serving.limits.overall.reload_rate", + "relay.mode.serving.limits.reset_behavior", + "relay.mode.serving.limits.uplink_messages", + "relay.mode.serving.limits.uplink_messages.bucket_size", + "relay.mode.serving.limits.uplink_messages.reload_rate", + "relay.mode.serving.second_channel", + "relay.mode.serving.second_channel.ack_offset", + "relay.mode.serving.second_channel.data_rate_index", + "relay.mode.serving.second_channel.frequency", + "relay.mode.serving.uplink_forwarding_rules", "resets_f_cnt", "resets_f_cnt.value", "rx1_data_rate_offset", @@ -344,6 +617,7 @@ var MACSettingsFieldPathsTopLevel = []string{ "desired_max_eirp", "desired_ping_slot_data_rate_index", "desired_ping_slot_frequency", + "desired_relay", "desired_rx1_data_rate_offset", "desired_rx1_delay", "desired_rx2_data_rate_index", @@ -354,6 +628,7 @@ var MACSettingsFieldPathsTopLevel = []string{ "ping_slot_data_rate_index", "ping_slot_frequency", "ping_slot_periodicity", + "relay", "resets_f_cnt", "rx1_data_rate_offset", "rx1_delay", @@ -389,6 +664,42 @@ var MACStateFieldPathsNested = []string{ "current_parameters.ping_slot_frequency", "current_parameters.rejoin_count_periodicity", "current_parameters.rejoin_time_periodicity", + "current_parameters.relay", + "current_parameters.relay.mode", + "current_parameters.relay.mode.served", + "current_parameters.relay.mode.served.backoff", + "current_parameters.relay.mode.served.mode", + "current_parameters.relay.mode.served.mode.always", + "current_parameters.relay.mode.served.mode.dynamic", + "current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "current_parameters.relay.mode.served.mode.end_device_controlled", + "current_parameters.relay.mode.served.second_channel", + "current_parameters.relay.mode.served.second_channel.ack_offset", + "current_parameters.relay.mode.served.second_channel.data_rate_index", + "current_parameters.relay.mode.served.second_channel.frequency", + "current_parameters.relay.mode.served.serving_device_id", + "current_parameters.relay.mode.serving", + "current_parameters.relay.mode.serving.cad_periodicity", + "current_parameters.relay.mode.serving.default_channel_index", + "current_parameters.relay.mode.serving.limits", + "current_parameters.relay.mode.serving.limits.join_requests", + "current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "current_parameters.relay.mode.serving.limits.notifications", + "current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "current_parameters.relay.mode.serving.limits.overall", + "current_parameters.relay.mode.serving.limits.overall.bucket_size", + "current_parameters.relay.mode.serving.limits.overall.reload_rate", + "current_parameters.relay.mode.serving.limits.reset_behavior", + "current_parameters.relay.mode.serving.limits.uplink_messages", + "current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "current_parameters.relay.mode.serving.second_channel", + "current_parameters.relay.mode.serving.second_channel.ack_offset", + "current_parameters.relay.mode.serving.second_channel.data_rate_index", + "current_parameters.relay.mode.serving.second_channel.frequency", + "current_parameters.relay.mode.serving.uplink_forwarding_rules", "current_parameters.rx1_data_rate_offset", "current_parameters.rx1_delay", "current_parameters.rx2_data_rate_index", @@ -417,6 +728,42 @@ var MACStateFieldPathsNested = []string{ "desired_parameters.ping_slot_frequency", "desired_parameters.rejoin_count_periodicity", "desired_parameters.rejoin_time_periodicity", + "desired_parameters.relay", + "desired_parameters.relay.mode", + "desired_parameters.relay.mode.served", + "desired_parameters.relay.mode.served.backoff", + "desired_parameters.relay.mode.served.mode", + "desired_parameters.relay.mode.served.mode.always", + "desired_parameters.relay.mode.served.mode.dynamic", + "desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "desired_parameters.relay.mode.served.mode.end_device_controlled", + "desired_parameters.relay.mode.served.second_channel", + "desired_parameters.relay.mode.served.second_channel.ack_offset", + "desired_parameters.relay.mode.served.second_channel.data_rate_index", + "desired_parameters.relay.mode.served.second_channel.frequency", + "desired_parameters.relay.mode.served.serving_device_id", + "desired_parameters.relay.mode.serving", + "desired_parameters.relay.mode.serving.cad_periodicity", + "desired_parameters.relay.mode.serving.default_channel_index", + "desired_parameters.relay.mode.serving.limits", + "desired_parameters.relay.mode.serving.limits.join_requests", + "desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "desired_parameters.relay.mode.serving.limits.notifications", + "desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "desired_parameters.relay.mode.serving.limits.overall", + "desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "desired_parameters.relay.mode.serving.limits.reset_behavior", + "desired_parameters.relay.mode.serving.limits.uplink_messages", + "desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "desired_parameters.relay.mode.serving.second_channel", + "desired_parameters.relay.mode.serving.second_channel.ack_offset", + "desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "desired_parameters.relay.mode.serving.second_channel.frequency", + "desired_parameters.relay.mode.serving.uplink_forwarding_rules", "desired_parameters.rx1_data_rate_offset", "desired_parameters.rx1_delay", "desired_parameters.rx2_data_rate_index", @@ -456,6 +803,8 @@ var MACStateFieldPathsNested = []string{ "pending_join_request.downlink_settings.rx1_dr_offset", "pending_join_request.downlink_settings.rx2_dr", "pending_join_request.rx_delay", + "pending_relay_downlink", + "pending_relay_downlink.raw_payload", "pending_requests", "ping_slot_periodicity", "ping_slot_periodicity.value", @@ -515,6 +864,7 @@ var MACStateFieldPathsTopLevel = []string{ "lorawan_version", "pending_application_downlink", "pending_join_request", + "pending_relay_downlink", "pending_requests", "ping_slot_periodicity", "queued_join_accept", @@ -621,6 +971,42 @@ var EndDeviceFieldPathsNested = []string{ "mac_settings.desired_ping_slot_data_rate_index.value", "mac_settings.desired_ping_slot_frequency", "mac_settings.desired_ping_slot_frequency.value", + "mac_settings.desired_relay", + "mac_settings.desired_relay.mode", + "mac_settings.desired_relay.mode.served", + "mac_settings.desired_relay.mode.served.backoff", + "mac_settings.desired_relay.mode.served.mode", + "mac_settings.desired_relay.mode.served.mode.always", + "mac_settings.desired_relay.mode.served.mode.dynamic", + "mac_settings.desired_relay.mode.served.mode.dynamic.smart_enable_level", + "mac_settings.desired_relay.mode.served.mode.end_device_controlled", + "mac_settings.desired_relay.mode.served.second_channel", + "mac_settings.desired_relay.mode.served.second_channel.ack_offset", + "mac_settings.desired_relay.mode.served.second_channel.data_rate_index", + "mac_settings.desired_relay.mode.served.second_channel.frequency", + "mac_settings.desired_relay.mode.served.serving_device_id", + "mac_settings.desired_relay.mode.serving", + "mac_settings.desired_relay.mode.serving.cad_periodicity", + "mac_settings.desired_relay.mode.serving.default_channel_index", + "mac_settings.desired_relay.mode.serving.limits", + "mac_settings.desired_relay.mode.serving.limits.join_requests", + "mac_settings.desired_relay.mode.serving.limits.join_requests.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.join_requests.reload_rate", + "mac_settings.desired_relay.mode.serving.limits.notifications", + "mac_settings.desired_relay.mode.serving.limits.notifications.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.notifications.reload_rate", + "mac_settings.desired_relay.mode.serving.limits.overall", + "mac_settings.desired_relay.mode.serving.limits.overall.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.overall.reload_rate", + "mac_settings.desired_relay.mode.serving.limits.reset_behavior", + "mac_settings.desired_relay.mode.serving.limits.uplink_messages", + "mac_settings.desired_relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_settings.desired_relay.mode.serving.second_channel", + "mac_settings.desired_relay.mode.serving.second_channel.ack_offset", + "mac_settings.desired_relay.mode.serving.second_channel.data_rate_index", + "mac_settings.desired_relay.mode.serving.second_channel.frequency", + "mac_settings.desired_relay.mode.serving.uplink_forwarding_rules", "mac_settings.desired_rx1_data_rate_offset", "mac_settings.desired_rx1_data_rate_offset.value", "mac_settings.desired_rx1_delay", @@ -640,6 +1026,42 @@ var EndDeviceFieldPathsNested = []string{ "mac_settings.ping_slot_frequency.value", "mac_settings.ping_slot_periodicity", "mac_settings.ping_slot_periodicity.value", + "mac_settings.relay", + "mac_settings.relay.mode", + "mac_settings.relay.mode.served", + "mac_settings.relay.mode.served.backoff", + "mac_settings.relay.mode.served.mode", + "mac_settings.relay.mode.served.mode.always", + "mac_settings.relay.mode.served.mode.dynamic", + "mac_settings.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_settings.relay.mode.served.mode.end_device_controlled", + "mac_settings.relay.mode.served.second_channel", + "mac_settings.relay.mode.served.second_channel.ack_offset", + "mac_settings.relay.mode.served.second_channel.data_rate_index", + "mac_settings.relay.mode.served.second_channel.frequency", + "mac_settings.relay.mode.served.serving_device_id", + "mac_settings.relay.mode.serving", + "mac_settings.relay.mode.serving.cad_periodicity", + "mac_settings.relay.mode.serving.default_channel_index", + "mac_settings.relay.mode.serving.limits", + "mac_settings.relay.mode.serving.limits.join_requests", + "mac_settings.relay.mode.serving.limits.join_requests.bucket_size", + "mac_settings.relay.mode.serving.limits.join_requests.reload_rate", + "mac_settings.relay.mode.serving.limits.notifications", + "mac_settings.relay.mode.serving.limits.notifications.bucket_size", + "mac_settings.relay.mode.serving.limits.notifications.reload_rate", + "mac_settings.relay.mode.serving.limits.overall", + "mac_settings.relay.mode.serving.limits.overall.bucket_size", + "mac_settings.relay.mode.serving.limits.overall.reload_rate", + "mac_settings.relay.mode.serving.limits.reset_behavior", + "mac_settings.relay.mode.serving.limits.uplink_messages", + "mac_settings.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_settings.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_settings.relay.mode.serving.second_channel", + "mac_settings.relay.mode.serving.second_channel.ack_offset", + "mac_settings.relay.mode.serving.second_channel.data_rate_index", + "mac_settings.relay.mode.serving.second_channel.frequency", + "mac_settings.relay.mode.serving.uplink_forwarding_rules", "mac_settings.resets_f_cnt", "mac_settings.resets_f_cnt.value", "mac_settings.rx1_data_rate_offset", @@ -683,6 +1105,42 @@ var EndDeviceFieldPathsNested = []string{ "mac_state.current_parameters.ping_slot_frequency", "mac_state.current_parameters.rejoin_count_periodicity", "mac_state.current_parameters.rejoin_time_periodicity", + "mac_state.current_parameters.relay", + "mac_state.current_parameters.relay.mode", + "mac_state.current_parameters.relay.mode.served", + "mac_state.current_parameters.relay.mode.served.backoff", + "mac_state.current_parameters.relay.mode.served.mode", + "mac_state.current_parameters.relay.mode.served.mode.always", + "mac_state.current_parameters.relay.mode.served.mode.dynamic", + "mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "mac_state.current_parameters.relay.mode.served.second_channel", + "mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "mac_state.current_parameters.relay.mode.served.serving_device_id", + "mac_state.current_parameters.relay.mode.serving", + "mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "mac_state.current_parameters.relay.mode.serving.default_channel_index", + "mac_state.current_parameters.relay.mode.serving.limits", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.notifications", + "mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.overall", + "mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_state.current_parameters.relay.mode.serving.second_channel", + "mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "mac_state.current_parameters.rx1_data_rate_offset", "mac_state.current_parameters.rx1_delay", "mac_state.current_parameters.rx2_data_rate_index", @@ -711,6 +1169,42 @@ var EndDeviceFieldPathsNested = []string{ "mac_state.desired_parameters.ping_slot_frequency", "mac_state.desired_parameters.rejoin_count_periodicity", "mac_state.desired_parameters.rejoin_time_periodicity", + "mac_state.desired_parameters.relay", + "mac_state.desired_parameters.relay.mode", + "mac_state.desired_parameters.relay.mode.served", + "mac_state.desired_parameters.relay.mode.served.backoff", + "mac_state.desired_parameters.relay.mode.served.mode", + "mac_state.desired_parameters.relay.mode.served.mode.always", + "mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "mac_state.desired_parameters.relay.mode.served.second_channel", + "mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "mac_state.desired_parameters.relay.mode.served.serving_device_id", + "mac_state.desired_parameters.relay.mode.serving", + "mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "mac_state.desired_parameters.relay.mode.serving.limits", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.overall", + "mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.second_channel", + "mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "mac_state.desired_parameters.rx1_data_rate_offset", "mac_state.desired_parameters.rx1_delay", "mac_state.desired_parameters.rx2_data_rate_index", @@ -750,6 +1244,8 @@ var EndDeviceFieldPathsNested = []string{ "mac_state.pending_join_request.downlink_settings.rx1_dr_offset", "mac_state.pending_join_request.downlink_settings.rx2_dr", "mac_state.pending_join_request.rx_delay", + "mac_state.pending_relay_downlink", + "mac_state.pending_relay_downlink.raw_payload", "mac_state.pending_requests", "mac_state.ping_slot_periodicity", "mac_state.ping_slot_periodicity.value", @@ -825,6 +1321,42 @@ var EndDeviceFieldPathsNested = []string{ "pending_mac_state.current_parameters.ping_slot_frequency", "pending_mac_state.current_parameters.rejoin_count_periodicity", "pending_mac_state.current_parameters.rejoin_time_periodicity", + "pending_mac_state.current_parameters.relay", + "pending_mac_state.current_parameters.relay.mode", + "pending_mac_state.current_parameters.relay.mode.served", + "pending_mac_state.current_parameters.relay.mode.served.backoff", + "pending_mac_state.current_parameters.relay.mode.served.mode", + "pending_mac_state.current_parameters.relay.mode.served.mode.always", + "pending_mac_state.current_parameters.relay.mode.served.mode.dynamic", + "pending_mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "pending_mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "pending_mac_state.current_parameters.relay.mode.served.second_channel", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "pending_mac_state.current_parameters.relay.mode.served.serving_device_id", + "pending_mac_state.current_parameters.relay.mode.serving", + "pending_mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "pending_mac_state.current_parameters.relay.mode.serving.default_channel_index", + "pending_mac_state.current_parameters.relay.mode.serving.limits", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "pending_mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "pending_mac_state.current_parameters.rx1_data_rate_offset", "pending_mac_state.current_parameters.rx1_delay", "pending_mac_state.current_parameters.rx2_data_rate_index", @@ -853,6 +1385,42 @@ var EndDeviceFieldPathsNested = []string{ "pending_mac_state.desired_parameters.ping_slot_frequency", "pending_mac_state.desired_parameters.rejoin_count_periodicity", "pending_mac_state.desired_parameters.rejoin_time_periodicity", + "pending_mac_state.desired_parameters.relay", + "pending_mac_state.desired_parameters.relay.mode", + "pending_mac_state.desired_parameters.relay.mode.served", + "pending_mac_state.desired_parameters.relay.mode.served.backoff", + "pending_mac_state.desired_parameters.relay.mode.served.mode", + "pending_mac_state.desired_parameters.relay.mode.served.mode.always", + "pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "pending_mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "pending_mac_state.desired_parameters.relay.mode.served.serving_device_id", + "pending_mac_state.desired_parameters.relay.mode.serving", + "pending_mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "pending_mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "pending_mac_state.desired_parameters.relay.mode.serving.limits", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "pending_mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "pending_mac_state.desired_parameters.rx1_data_rate_offset", "pending_mac_state.desired_parameters.rx1_delay", "pending_mac_state.desired_parameters.rx2_data_rate_index", @@ -892,6 +1460,8 @@ var EndDeviceFieldPathsNested = []string{ "pending_mac_state.pending_join_request.downlink_settings.rx1_dr_offset", "pending_mac_state.pending_join_request.downlink_settings.rx2_dr", "pending_mac_state.pending_join_request.rx_delay", + "pending_mac_state.pending_relay_downlink", + "pending_mac_state.pending_relay_downlink.raw_payload", "pending_mac_state.pending_requests", "pending_mac_state.ping_slot_periodicity", "pending_mac_state.ping_slot_periodicity.value", @@ -1180,6 +1750,42 @@ var CreateEndDeviceRequestFieldPathsNested = []string{ "end_device.mac_settings.desired_ping_slot_data_rate_index.value", "end_device.mac_settings.desired_ping_slot_frequency", "end_device.mac_settings.desired_ping_slot_frequency.value", + "end_device.mac_settings.desired_relay", + "end_device.mac_settings.desired_relay.mode", + "end_device.mac_settings.desired_relay.mode.served", + "end_device.mac_settings.desired_relay.mode.served.backoff", + "end_device.mac_settings.desired_relay.mode.served.mode", + "end_device.mac_settings.desired_relay.mode.served.mode.always", + "end_device.mac_settings.desired_relay.mode.served.mode.dynamic", + "end_device.mac_settings.desired_relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.mac_settings.desired_relay.mode.served.mode.end_device_controlled", + "end_device.mac_settings.desired_relay.mode.served.second_channel", + "end_device.mac_settings.desired_relay.mode.served.second_channel.ack_offset", + "end_device.mac_settings.desired_relay.mode.served.second_channel.data_rate_index", + "end_device.mac_settings.desired_relay.mode.served.second_channel.frequency", + "end_device.mac_settings.desired_relay.mode.served.serving_device_id", + "end_device.mac_settings.desired_relay.mode.serving", + "end_device.mac_settings.desired_relay.mode.serving.cad_periodicity", + "end_device.mac_settings.desired_relay.mode.serving.default_channel_index", + "end_device.mac_settings.desired_relay.mode.serving.limits", + "end_device.mac_settings.desired_relay.mode.serving.limits.join_requests", + "end_device.mac_settings.desired_relay.mode.serving.limits.join_requests.bucket_size", + "end_device.mac_settings.desired_relay.mode.serving.limits.join_requests.reload_rate", + "end_device.mac_settings.desired_relay.mode.serving.limits.notifications", + "end_device.mac_settings.desired_relay.mode.serving.limits.notifications.bucket_size", + "end_device.mac_settings.desired_relay.mode.serving.limits.notifications.reload_rate", + "end_device.mac_settings.desired_relay.mode.serving.limits.overall", + "end_device.mac_settings.desired_relay.mode.serving.limits.overall.bucket_size", + "end_device.mac_settings.desired_relay.mode.serving.limits.overall.reload_rate", + "end_device.mac_settings.desired_relay.mode.serving.limits.reset_behavior", + "end_device.mac_settings.desired_relay.mode.serving.limits.uplink_messages", + "end_device.mac_settings.desired_relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.mac_settings.desired_relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.mac_settings.desired_relay.mode.serving.second_channel", + "end_device.mac_settings.desired_relay.mode.serving.second_channel.ack_offset", + "end_device.mac_settings.desired_relay.mode.serving.second_channel.data_rate_index", + "end_device.mac_settings.desired_relay.mode.serving.second_channel.frequency", + "end_device.mac_settings.desired_relay.mode.serving.uplink_forwarding_rules", "end_device.mac_settings.desired_rx1_data_rate_offset", "end_device.mac_settings.desired_rx1_data_rate_offset.value", "end_device.mac_settings.desired_rx1_delay", @@ -1199,6 +1805,42 @@ var CreateEndDeviceRequestFieldPathsNested = []string{ "end_device.mac_settings.ping_slot_frequency.value", "end_device.mac_settings.ping_slot_periodicity", "end_device.mac_settings.ping_slot_periodicity.value", + "end_device.mac_settings.relay", + "end_device.mac_settings.relay.mode", + "end_device.mac_settings.relay.mode.served", + "end_device.mac_settings.relay.mode.served.backoff", + "end_device.mac_settings.relay.mode.served.mode", + "end_device.mac_settings.relay.mode.served.mode.always", + "end_device.mac_settings.relay.mode.served.mode.dynamic", + "end_device.mac_settings.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.mac_settings.relay.mode.served.mode.end_device_controlled", + "end_device.mac_settings.relay.mode.served.second_channel", + "end_device.mac_settings.relay.mode.served.second_channel.ack_offset", + "end_device.mac_settings.relay.mode.served.second_channel.data_rate_index", + "end_device.mac_settings.relay.mode.served.second_channel.frequency", + "end_device.mac_settings.relay.mode.served.serving_device_id", + "end_device.mac_settings.relay.mode.serving", + "end_device.mac_settings.relay.mode.serving.cad_periodicity", + "end_device.mac_settings.relay.mode.serving.default_channel_index", + "end_device.mac_settings.relay.mode.serving.limits", + "end_device.mac_settings.relay.mode.serving.limits.join_requests", + "end_device.mac_settings.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.mac_settings.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.mac_settings.relay.mode.serving.limits.notifications", + "end_device.mac_settings.relay.mode.serving.limits.notifications.bucket_size", + "end_device.mac_settings.relay.mode.serving.limits.notifications.reload_rate", + "end_device.mac_settings.relay.mode.serving.limits.overall", + "end_device.mac_settings.relay.mode.serving.limits.overall.bucket_size", + "end_device.mac_settings.relay.mode.serving.limits.overall.reload_rate", + "end_device.mac_settings.relay.mode.serving.limits.reset_behavior", + "end_device.mac_settings.relay.mode.serving.limits.uplink_messages", + "end_device.mac_settings.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.mac_settings.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.mac_settings.relay.mode.serving.second_channel", + "end_device.mac_settings.relay.mode.serving.second_channel.ack_offset", + "end_device.mac_settings.relay.mode.serving.second_channel.data_rate_index", + "end_device.mac_settings.relay.mode.serving.second_channel.frequency", + "end_device.mac_settings.relay.mode.serving.uplink_forwarding_rules", "end_device.mac_settings.resets_f_cnt", "end_device.mac_settings.resets_f_cnt.value", "end_device.mac_settings.rx1_data_rate_offset", @@ -1242,6 +1884,42 @@ var CreateEndDeviceRequestFieldPathsNested = []string{ "end_device.mac_state.current_parameters.ping_slot_frequency", "end_device.mac_state.current_parameters.rejoin_count_periodicity", "end_device.mac_state.current_parameters.rejoin_time_periodicity", + "end_device.mac_state.current_parameters.relay", + "end_device.mac_state.current_parameters.relay.mode", + "end_device.mac_state.current_parameters.relay.mode.served", + "end_device.mac_state.current_parameters.relay.mode.served.backoff", + "end_device.mac_state.current_parameters.relay.mode.served.mode", + "end_device.mac_state.current_parameters.relay.mode.served.mode.always", + "end_device.mac_state.current_parameters.relay.mode.served.mode.dynamic", + "end_device.mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "end_device.mac_state.current_parameters.relay.mode.served.second_channel", + "end_device.mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "end_device.mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device.mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "end_device.mac_state.current_parameters.relay.mode.served.serving_device_id", + "end_device.mac_state.current_parameters.relay.mode.serving", + "end_device.mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "end_device.mac_state.current_parameters.relay.mode.serving.default_channel_index", + "end_device.mac_state.current_parameters.relay.mode.serving.limits", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.notifications", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.overall", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.mac_state.current_parameters.relay.mode.serving.second_channel", + "end_device.mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device.mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device.mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "end_device.mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device.mac_state.current_parameters.rx1_data_rate_offset", "end_device.mac_state.current_parameters.rx1_delay", "end_device.mac_state.current_parameters.rx2_data_rate_index", @@ -1270,6 +1948,42 @@ var CreateEndDeviceRequestFieldPathsNested = []string{ "end_device.mac_state.desired_parameters.ping_slot_frequency", "end_device.mac_state.desired_parameters.rejoin_count_periodicity", "end_device.mac_state.desired_parameters.rejoin_time_periodicity", + "end_device.mac_state.desired_parameters.relay", + "end_device.mac_state.desired_parameters.relay.mode", + "end_device.mac_state.desired_parameters.relay.mode.served", + "end_device.mac_state.desired_parameters.relay.mode.served.backoff", + "end_device.mac_state.desired_parameters.relay.mode.served.mode", + "end_device.mac_state.desired_parameters.relay.mode.served.mode.always", + "end_device.mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "end_device.mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "end_device.mac_state.desired_parameters.relay.mode.served.second_channel", + "end_device.mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "end_device.mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device.mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "end_device.mac_state.desired_parameters.relay.mode.served.serving_device_id", + "end_device.mac_state.desired_parameters.relay.mode.serving", + "end_device.mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "end_device.mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.overall", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.mac_state.desired_parameters.relay.mode.serving.second_channel", + "end_device.mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device.mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device.mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "end_device.mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device.mac_state.desired_parameters.rx1_data_rate_offset", "end_device.mac_state.desired_parameters.rx1_delay", "end_device.mac_state.desired_parameters.rx2_data_rate_index", @@ -1309,6 +2023,8 @@ var CreateEndDeviceRequestFieldPathsNested = []string{ "end_device.mac_state.pending_join_request.downlink_settings.rx1_dr_offset", "end_device.mac_state.pending_join_request.downlink_settings.rx2_dr", "end_device.mac_state.pending_join_request.rx_delay", + "end_device.mac_state.pending_relay_downlink", + "end_device.mac_state.pending_relay_downlink.raw_payload", "end_device.mac_state.pending_requests", "end_device.mac_state.ping_slot_periodicity", "end_device.mac_state.ping_slot_periodicity.value", @@ -1384,6 +2100,42 @@ var CreateEndDeviceRequestFieldPathsNested = []string{ "end_device.pending_mac_state.current_parameters.ping_slot_frequency", "end_device.pending_mac_state.current_parameters.rejoin_count_periodicity", "end_device.pending_mac_state.current_parameters.rejoin_time_periodicity", + "end_device.pending_mac_state.current_parameters.relay", + "end_device.pending_mac_state.current_parameters.relay.mode", + "end_device.pending_mac_state.current_parameters.relay.mode.served", + "end_device.pending_mac_state.current_parameters.relay.mode.served.backoff", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode.always", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode.dynamic", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel", + "end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "end_device.pending_mac_state.current_parameters.relay.mode.served.serving_device_id", + "end_device.pending_mac_state.current_parameters.relay.mode.serving", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.default_channel_index", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.notifications", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.overall", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device.pending_mac_state.current_parameters.rx1_data_rate_offset", "end_device.pending_mac_state.current_parameters.rx1_delay", "end_device.pending_mac_state.current_parameters.rx2_data_rate_index", @@ -1412,6 +2164,42 @@ var CreateEndDeviceRequestFieldPathsNested = []string{ "end_device.pending_mac_state.desired_parameters.ping_slot_frequency", "end_device.pending_mac_state.desired_parameters.rejoin_count_periodicity", "end_device.pending_mac_state.desired_parameters.rejoin_time_periodicity", + "end_device.pending_mac_state.desired_parameters.relay", + "end_device.pending_mac_state.desired_parameters.relay.mode", + "end_device.pending_mac_state.desired_parameters.relay.mode.served", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.backoff", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.always", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.serving_device_id", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.overall", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device.pending_mac_state.desired_parameters.rx1_data_rate_offset", "end_device.pending_mac_state.desired_parameters.rx1_delay", "end_device.pending_mac_state.desired_parameters.rx2_data_rate_index", @@ -1451,6 +2239,8 @@ var CreateEndDeviceRequestFieldPathsNested = []string{ "end_device.pending_mac_state.pending_join_request.downlink_settings.rx1_dr_offset", "end_device.pending_mac_state.pending_join_request.downlink_settings.rx2_dr", "end_device.pending_mac_state.pending_join_request.rx_delay", + "end_device.pending_mac_state.pending_relay_downlink", + "end_device.pending_mac_state.pending_relay_downlink.raw_payload", "end_device.pending_mac_state.pending_requests", "end_device.pending_mac_state.ping_slot_periodicity", "end_device.pending_mac_state.ping_slot_periodicity.value", @@ -1671,6 +2461,42 @@ var UpdateEndDeviceRequestFieldPathsNested = []string{ "end_device.mac_settings.desired_ping_slot_data_rate_index.value", "end_device.mac_settings.desired_ping_slot_frequency", "end_device.mac_settings.desired_ping_slot_frequency.value", + "end_device.mac_settings.desired_relay", + "end_device.mac_settings.desired_relay.mode", + "end_device.mac_settings.desired_relay.mode.served", + "end_device.mac_settings.desired_relay.mode.served.backoff", + "end_device.mac_settings.desired_relay.mode.served.mode", + "end_device.mac_settings.desired_relay.mode.served.mode.always", + "end_device.mac_settings.desired_relay.mode.served.mode.dynamic", + "end_device.mac_settings.desired_relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.mac_settings.desired_relay.mode.served.mode.end_device_controlled", + "end_device.mac_settings.desired_relay.mode.served.second_channel", + "end_device.mac_settings.desired_relay.mode.served.second_channel.ack_offset", + "end_device.mac_settings.desired_relay.mode.served.second_channel.data_rate_index", + "end_device.mac_settings.desired_relay.mode.served.second_channel.frequency", + "end_device.mac_settings.desired_relay.mode.served.serving_device_id", + "end_device.mac_settings.desired_relay.mode.serving", + "end_device.mac_settings.desired_relay.mode.serving.cad_periodicity", + "end_device.mac_settings.desired_relay.mode.serving.default_channel_index", + "end_device.mac_settings.desired_relay.mode.serving.limits", + "end_device.mac_settings.desired_relay.mode.serving.limits.join_requests", + "end_device.mac_settings.desired_relay.mode.serving.limits.join_requests.bucket_size", + "end_device.mac_settings.desired_relay.mode.serving.limits.join_requests.reload_rate", + "end_device.mac_settings.desired_relay.mode.serving.limits.notifications", + "end_device.mac_settings.desired_relay.mode.serving.limits.notifications.bucket_size", + "end_device.mac_settings.desired_relay.mode.serving.limits.notifications.reload_rate", + "end_device.mac_settings.desired_relay.mode.serving.limits.overall", + "end_device.mac_settings.desired_relay.mode.serving.limits.overall.bucket_size", + "end_device.mac_settings.desired_relay.mode.serving.limits.overall.reload_rate", + "end_device.mac_settings.desired_relay.mode.serving.limits.reset_behavior", + "end_device.mac_settings.desired_relay.mode.serving.limits.uplink_messages", + "end_device.mac_settings.desired_relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.mac_settings.desired_relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.mac_settings.desired_relay.mode.serving.second_channel", + "end_device.mac_settings.desired_relay.mode.serving.second_channel.ack_offset", + "end_device.mac_settings.desired_relay.mode.serving.second_channel.data_rate_index", + "end_device.mac_settings.desired_relay.mode.serving.second_channel.frequency", + "end_device.mac_settings.desired_relay.mode.serving.uplink_forwarding_rules", "end_device.mac_settings.desired_rx1_data_rate_offset", "end_device.mac_settings.desired_rx1_data_rate_offset.value", "end_device.mac_settings.desired_rx1_delay", @@ -1690,6 +2516,42 @@ var UpdateEndDeviceRequestFieldPathsNested = []string{ "end_device.mac_settings.ping_slot_frequency.value", "end_device.mac_settings.ping_slot_periodicity", "end_device.mac_settings.ping_slot_periodicity.value", + "end_device.mac_settings.relay", + "end_device.mac_settings.relay.mode", + "end_device.mac_settings.relay.mode.served", + "end_device.mac_settings.relay.mode.served.backoff", + "end_device.mac_settings.relay.mode.served.mode", + "end_device.mac_settings.relay.mode.served.mode.always", + "end_device.mac_settings.relay.mode.served.mode.dynamic", + "end_device.mac_settings.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.mac_settings.relay.mode.served.mode.end_device_controlled", + "end_device.mac_settings.relay.mode.served.second_channel", + "end_device.mac_settings.relay.mode.served.second_channel.ack_offset", + "end_device.mac_settings.relay.mode.served.second_channel.data_rate_index", + "end_device.mac_settings.relay.mode.served.second_channel.frequency", + "end_device.mac_settings.relay.mode.served.serving_device_id", + "end_device.mac_settings.relay.mode.serving", + "end_device.mac_settings.relay.mode.serving.cad_periodicity", + "end_device.mac_settings.relay.mode.serving.default_channel_index", + "end_device.mac_settings.relay.mode.serving.limits", + "end_device.mac_settings.relay.mode.serving.limits.join_requests", + "end_device.mac_settings.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.mac_settings.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.mac_settings.relay.mode.serving.limits.notifications", + "end_device.mac_settings.relay.mode.serving.limits.notifications.bucket_size", + "end_device.mac_settings.relay.mode.serving.limits.notifications.reload_rate", + "end_device.mac_settings.relay.mode.serving.limits.overall", + "end_device.mac_settings.relay.mode.serving.limits.overall.bucket_size", + "end_device.mac_settings.relay.mode.serving.limits.overall.reload_rate", + "end_device.mac_settings.relay.mode.serving.limits.reset_behavior", + "end_device.mac_settings.relay.mode.serving.limits.uplink_messages", + "end_device.mac_settings.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.mac_settings.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.mac_settings.relay.mode.serving.second_channel", + "end_device.mac_settings.relay.mode.serving.second_channel.ack_offset", + "end_device.mac_settings.relay.mode.serving.second_channel.data_rate_index", + "end_device.mac_settings.relay.mode.serving.second_channel.frequency", + "end_device.mac_settings.relay.mode.serving.uplink_forwarding_rules", "end_device.mac_settings.resets_f_cnt", "end_device.mac_settings.resets_f_cnt.value", "end_device.mac_settings.rx1_data_rate_offset", @@ -1733,6 +2595,42 @@ var UpdateEndDeviceRequestFieldPathsNested = []string{ "end_device.mac_state.current_parameters.ping_slot_frequency", "end_device.mac_state.current_parameters.rejoin_count_periodicity", "end_device.mac_state.current_parameters.rejoin_time_periodicity", + "end_device.mac_state.current_parameters.relay", + "end_device.mac_state.current_parameters.relay.mode", + "end_device.mac_state.current_parameters.relay.mode.served", + "end_device.mac_state.current_parameters.relay.mode.served.backoff", + "end_device.mac_state.current_parameters.relay.mode.served.mode", + "end_device.mac_state.current_parameters.relay.mode.served.mode.always", + "end_device.mac_state.current_parameters.relay.mode.served.mode.dynamic", + "end_device.mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "end_device.mac_state.current_parameters.relay.mode.served.second_channel", + "end_device.mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "end_device.mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device.mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "end_device.mac_state.current_parameters.relay.mode.served.serving_device_id", + "end_device.mac_state.current_parameters.relay.mode.serving", + "end_device.mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "end_device.mac_state.current_parameters.relay.mode.serving.default_channel_index", + "end_device.mac_state.current_parameters.relay.mode.serving.limits", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.notifications", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.overall", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.mac_state.current_parameters.relay.mode.serving.second_channel", + "end_device.mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device.mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device.mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "end_device.mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device.mac_state.current_parameters.rx1_data_rate_offset", "end_device.mac_state.current_parameters.rx1_delay", "end_device.mac_state.current_parameters.rx2_data_rate_index", @@ -1761,6 +2659,42 @@ var UpdateEndDeviceRequestFieldPathsNested = []string{ "end_device.mac_state.desired_parameters.ping_slot_frequency", "end_device.mac_state.desired_parameters.rejoin_count_periodicity", "end_device.mac_state.desired_parameters.rejoin_time_periodicity", + "end_device.mac_state.desired_parameters.relay", + "end_device.mac_state.desired_parameters.relay.mode", + "end_device.mac_state.desired_parameters.relay.mode.served", + "end_device.mac_state.desired_parameters.relay.mode.served.backoff", + "end_device.mac_state.desired_parameters.relay.mode.served.mode", + "end_device.mac_state.desired_parameters.relay.mode.served.mode.always", + "end_device.mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "end_device.mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "end_device.mac_state.desired_parameters.relay.mode.served.second_channel", + "end_device.mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "end_device.mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device.mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "end_device.mac_state.desired_parameters.relay.mode.served.serving_device_id", + "end_device.mac_state.desired_parameters.relay.mode.serving", + "end_device.mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "end_device.mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.overall", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.mac_state.desired_parameters.relay.mode.serving.second_channel", + "end_device.mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device.mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device.mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "end_device.mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device.mac_state.desired_parameters.rx1_data_rate_offset", "end_device.mac_state.desired_parameters.rx1_delay", "end_device.mac_state.desired_parameters.rx2_data_rate_index", @@ -1800,6 +2734,8 @@ var UpdateEndDeviceRequestFieldPathsNested = []string{ "end_device.mac_state.pending_join_request.downlink_settings.rx1_dr_offset", "end_device.mac_state.pending_join_request.downlink_settings.rx2_dr", "end_device.mac_state.pending_join_request.rx_delay", + "end_device.mac_state.pending_relay_downlink", + "end_device.mac_state.pending_relay_downlink.raw_payload", "end_device.mac_state.pending_requests", "end_device.mac_state.ping_slot_periodicity", "end_device.mac_state.ping_slot_periodicity.value", @@ -1875,6 +2811,42 @@ var UpdateEndDeviceRequestFieldPathsNested = []string{ "end_device.pending_mac_state.current_parameters.ping_slot_frequency", "end_device.pending_mac_state.current_parameters.rejoin_count_periodicity", "end_device.pending_mac_state.current_parameters.rejoin_time_periodicity", + "end_device.pending_mac_state.current_parameters.relay", + "end_device.pending_mac_state.current_parameters.relay.mode", + "end_device.pending_mac_state.current_parameters.relay.mode.served", + "end_device.pending_mac_state.current_parameters.relay.mode.served.backoff", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode.always", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode.dynamic", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel", + "end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "end_device.pending_mac_state.current_parameters.relay.mode.served.serving_device_id", + "end_device.pending_mac_state.current_parameters.relay.mode.serving", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.default_channel_index", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.notifications", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.overall", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device.pending_mac_state.current_parameters.rx1_data_rate_offset", "end_device.pending_mac_state.current_parameters.rx1_delay", "end_device.pending_mac_state.current_parameters.rx2_data_rate_index", @@ -1903,6 +2875,42 @@ var UpdateEndDeviceRequestFieldPathsNested = []string{ "end_device.pending_mac_state.desired_parameters.ping_slot_frequency", "end_device.pending_mac_state.desired_parameters.rejoin_count_periodicity", "end_device.pending_mac_state.desired_parameters.rejoin_time_periodicity", + "end_device.pending_mac_state.desired_parameters.relay", + "end_device.pending_mac_state.desired_parameters.relay.mode", + "end_device.pending_mac_state.desired_parameters.relay.mode.served", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.backoff", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.always", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.serving_device_id", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.overall", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device.pending_mac_state.desired_parameters.rx1_data_rate_offset", "end_device.pending_mac_state.desired_parameters.rx1_delay", "end_device.pending_mac_state.desired_parameters.rx2_data_rate_index", @@ -1942,6 +2950,8 @@ var UpdateEndDeviceRequestFieldPathsNested = []string{ "end_device.pending_mac_state.pending_join_request.downlink_settings.rx1_dr_offset", "end_device.pending_mac_state.pending_join_request.downlink_settings.rx2_dr", "end_device.pending_mac_state.pending_join_request.rx_delay", + "end_device.pending_mac_state.pending_relay_downlink", + "end_device.pending_mac_state.pending_relay_downlink.raw_payload", "end_device.pending_mac_state.pending_requests", "end_device.pending_mac_state.ping_slot_periodicity", "end_device.pending_mac_state.ping_slot_periodicity.value", @@ -2211,6 +3221,42 @@ var SetEndDeviceRequestFieldPathsNested = []string{ "end_device.mac_settings.desired_ping_slot_data_rate_index.value", "end_device.mac_settings.desired_ping_slot_frequency", "end_device.mac_settings.desired_ping_slot_frequency.value", + "end_device.mac_settings.desired_relay", + "end_device.mac_settings.desired_relay.mode", + "end_device.mac_settings.desired_relay.mode.served", + "end_device.mac_settings.desired_relay.mode.served.backoff", + "end_device.mac_settings.desired_relay.mode.served.mode", + "end_device.mac_settings.desired_relay.mode.served.mode.always", + "end_device.mac_settings.desired_relay.mode.served.mode.dynamic", + "end_device.mac_settings.desired_relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.mac_settings.desired_relay.mode.served.mode.end_device_controlled", + "end_device.mac_settings.desired_relay.mode.served.second_channel", + "end_device.mac_settings.desired_relay.mode.served.second_channel.ack_offset", + "end_device.mac_settings.desired_relay.mode.served.second_channel.data_rate_index", + "end_device.mac_settings.desired_relay.mode.served.second_channel.frequency", + "end_device.mac_settings.desired_relay.mode.served.serving_device_id", + "end_device.mac_settings.desired_relay.mode.serving", + "end_device.mac_settings.desired_relay.mode.serving.cad_periodicity", + "end_device.mac_settings.desired_relay.mode.serving.default_channel_index", + "end_device.mac_settings.desired_relay.mode.serving.limits", + "end_device.mac_settings.desired_relay.mode.serving.limits.join_requests", + "end_device.mac_settings.desired_relay.mode.serving.limits.join_requests.bucket_size", + "end_device.mac_settings.desired_relay.mode.serving.limits.join_requests.reload_rate", + "end_device.mac_settings.desired_relay.mode.serving.limits.notifications", + "end_device.mac_settings.desired_relay.mode.serving.limits.notifications.bucket_size", + "end_device.mac_settings.desired_relay.mode.serving.limits.notifications.reload_rate", + "end_device.mac_settings.desired_relay.mode.serving.limits.overall", + "end_device.mac_settings.desired_relay.mode.serving.limits.overall.bucket_size", + "end_device.mac_settings.desired_relay.mode.serving.limits.overall.reload_rate", + "end_device.mac_settings.desired_relay.mode.serving.limits.reset_behavior", + "end_device.mac_settings.desired_relay.mode.serving.limits.uplink_messages", + "end_device.mac_settings.desired_relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.mac_settings.desired_relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.mac_settings.desired_relay.mode.serving.second_channel", + "end_device.mac_settings.desired_relay.mode.serving.second_channel.ack_offset", + "end_device.mac_settings.desired_relay.mode.serving.second_channel.data_rate_index", + "end_device.mac_settings.desired_relay.mode.serving.second_channel.frequency", + "end_device.mac_settings.desired_relay.mode.serving.uplink_forwarding_rules", "end_device.mac_settings.desired_rx1_data_rate_offset", "end_device.mac_settings.desired_rx1_data_rate_offset.value", "end_device.mac_settings.desired_rx1_delay", @@ -2230,6 +3276,42 @@ var SetEndDeviceRequestFieldPathsNested = []string{ "end_device.mac_settings.ping_slot_frequency.value", "end_device.mac_settings.ping_slot_periodicity", "end_device.mac_settings.ping_slot_periodicity.value", + "end_device.mac_settings.relay", + "end_device.mac_settings.relay.mode", + "end_device.mac_settings.relay.mode.served", + "end_device.mac_settings.relay.mode.served.backoff", + "end_device.mac_settings.relay.mode.served.mode", + "end_device.mac_settings.relay.mode.served.mode.always", + "end_device.mac_settings.relay.mode.served.mode.dynamic", + "end_device.mac_settings.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.mac_settings.relay.mode.served.mode.end_device_controlled", + "end_device.mac_settings.relay.mode.served.second_channel", + "end_device.mac_settings.relay.mode.served.second_channel.ack_offset", + "end_device.mac_settings.relay.mode.served.second_channel.data_rate_index", + "end_device.mac_settings.relay.mode.served.second_channel.frequency", + "end_device.mac_settings.relay.mode.served.serving_device_id", + "end_device.mac_settings.relay.mode.serving", + "end_device.mac_settings.relay.mode.serving.cad_periodicity", + "end_device.mac_settings.relay.mode.serving.default_channel_index", + "end_device.mac_settings.relay.mode.serving.limits", + "end_device.mac_settings.relay.mode.serving.limits.join_requests", + "end_device.mac_settings.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.mac_settings.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.mac_settings.relay.mode.serving.limits.notifications", + "end_device.mac_settings.relay.mode.serving.limits.notifications.bucket_size", + "end_device.mac_settings.relay.mode.serving.limits.notifications.reload_rate", + "end_device.mac_settings.relay.mode.serving.limits.overall", + "end_device.mac_settings.relay.mode.serving.limits.overall.bucket_size", + "end_device.mac_settings.relay.mode.serving.limits.overall.reload_rate", + "end_device.mac_settings.relay.mode.serving.limits.reset_behavior", + "end_device.mac_settings.relay.mode.serving.limits.uplink_messages", + "end_device.mac_settings.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.mac_settings.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.mac_settings.relay.mode.serving.second_channel", + "end_device.mac_settings.relay.mode.serving.second_channel.ack_offset", + "end_device.mac_settings.relay.mode.serving.second_channel.data_rate_index", + "end_device.mac_settings.relay.mode.serving.second_channel.frequency", + "end_device.mac_settings.relay.mode.serving.uplink_forwarding_rules", "end_device.mac_settings.resets_f_cnt", "end_device.mac_settings.resets_f_cnt.value", "end_device.mac_settings.rx1_data_rate_offset", @@ -2273,6 +3355,42 @@ var SetEndDeviceRequestFieldPathsNested = []string{ "end_device.mac_state.current_parameters.ping_slot_frequency", "end_device.mac_state.current_parameters.rejoin_count_periodicity", "end_device.mac_state.current_parameters.rejoin_time_periodicity", + "end_device.mac_state.current_parameters.relay", + "end_device.mac_state.current_parameters.relay.mode", + "end_device.mac_state.current_parameters.relay.mode.served", + "end_device.mac_state.current_parameters.relay.mode.served.backoff", + "end_device.mac_state.current_parameters.relay.mode.served.mode", + "end_device.mac_state.current_parameters.relay.mode.served.mode.always", + "end_device.mac_state.current_parameters.relay.mode.served.mode.dynamic", + "end_device.mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "end_device.mac_state.current_parameters.relay.mode.served.second_channel", + "end_device.mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "end_device.mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device.mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "end_device.mac_state.current_parameters.relay.mode.served.serving_device_id", + "end_device.mac_state.current_parameters.relay.mode.serving", + "end_device.mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "end_device.mac_state.current_parameters.relay.mode.serving.default_channel_index", + "end_device.mac_state.current_parameters.relay.mode.serving.limits", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.notifications", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.overall", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.mac_state.current_parameters.relay.mode.serving.second_channel", + "end_device.mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device.mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device.mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "end_device.mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device.mac_state.current_parameters.rx1_data_rate_offset", "end_device.mac_state.current_parameters.rx1_delay", "end_device.mac_state.current_parameters.rx2_data_rate_index", @@ -2301,6 +3419,42 @@ var SetEndDeviceRequestFieldPathsNested = []string{ "end_device.mac_state.desired_parameters.ping_slot_frequency", "end_device.mac_state.desired_parameters.rejoin_count_periodicity", "end_device.mac_state.desired_parameters.rejoin_time_periodicity", + "end_device.mac_state.desired_parameters.relay", + "end_device.mac_state.desired_parameters.relay.mode", + "end_device.mac_state.desired_parameters.relay.mode.served", + "end_device.mac_state.desired_parameters.relay.mode.served.backoff", + "end_device.mac_state.desired_parameters.relay.mode.served.mode", + "end_device.mac_state.desired_parameters.relay.mode.served.mode.always", + "end_device.mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "end_device.mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "end_device.mac_state.desired_parameters.relay.mode.served.second_channel", + "end_device.mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "end_device.mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device.mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "end_device.mac_state.desired_parameters.relay.mode.served.serving_device_id", + "end_device.mac_state.desired_parameters.relay.mode.serving", + "end_device.mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "end_device.mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.overall", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.mac_state.desired_parameters.relay.mode.serving.second_channel", + "end_device.mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device.mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device.mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "end_device.mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device.mac_state.desired_parameters.rx1_data_rate_offset", "end_device.mac_state.desired_parameters.rx1_delay", "end_device.mac_state.desired_parameters.rx2_data_rate_index", @@ -2340,6 +3494,8 @@ var SetEndDeviceRequestFieldPathsNested = []string{ "end_device.mac_state.pending_join_request.downlink_settings.rx1_dr_offset", "end_device.mac_state.pending_join_request.downlink_settings.rx2_dr", "end_device.mac_state.pending_join_request.rx_delay", + "end_device.mac_state.pending_relay_downlink", + "end_device.mac_state.pending_relay_downlink.raw_payload", "end_device.mac_state.pending_requests", "end_device.mac_state.ping_slot_periodicity", "end_device.mac_state.ping_slot_periodicity.value", @@ -2415,6 +3571,42 @@ var SetEndDeviceRequestFieldPathsNested = []string{ "end_device.pending_mac_state.current_parameters.ping_slot_frequency", "end_device.pending_mac_state.current_parameters.rejoin_count_periodicity", "end_device.pending_mac_state.current_parameters.rejoin_time_periodicity", + "end_device.pending_mac_state.current_parameters.relay", + "end_device.pending_mac_state.current_parameters.relay.mode", + "end_device.pending_mac_state.current_parameters.relay.mode.served", + "end_device.pending_mac_state.current_parameters.relay.mode.served.backoff", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode.always", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode.dynamic", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel", + "end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "end_device.pending_mac_state.current_parameters.relay.mode.served.serving_device_id", + "end_device.pending_mac_state.current_parameters.relay.mode.serving", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.default_channel_index", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.notifications", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.overall", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device.pending_mac_state.current_parameters.rx1_data_rate_offset", "end_device.pending_mac_state.current_parameters.rx1_delay", "end_device.pending_mac_state.current_parameters.rx2_data_rate_index", @@ -2443,6 +3635,42 @@ var SetEndDeviceRequestFieldPathsNested = []string{ "end_device.pending_mac_state.desired_parameters.ping_slot_frequency", "end_device.pending_mac_state.desired_parameters.rejoin_count_periodicity", "end_device.pending_mac_state.desired_parameters.rejoin_time_periodicity", + "end_device.pending_mac_state.desired_parameters.relay", + "end_device.pending_mac_state.desired_parameters.relay.mode", + "end_device.pending_mac_state.desired_parameters.relay.mode.served", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.backoff", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.always", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.serving_device_id", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.overall", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device.pending_mac_state.desired_parameters.rx1_data_rate_offset", "end_device.pending_mac_state.desired_parameters.rx1_delay", "end_device.pending_mac_state.desired_parameters.rx2_data_rate_index", @@ -2482,6 +3710,8 @@ var SetEndDeviceRequestFieldPathsNested = []string{ "end_device.pending_mac_state.pending_join_request.downlink_settings.rx1_dr_offset", "end_device.pending_mac_state.pending_join_request.downlink_settings.rx2_dr", "end_device.pending_mac_state.pending_join_request.rx_delay", + "end_device.pending_mac_state.pending_relay_downlink", + "end_device.pending_mac_state.pending_relay_downlink.raw_payload", "end_device.pending_mac_state.pending_requests", "end_device.pending_mac_state.ping_slot_periodicity", "end_device.pending_mac_state.ping_slot_periodicity.value", @@ -2719,6 +3949,42 @@ var EndDeviceTemplateFieldPathsNested = []string{ "end_device.mac_settings.desired_ping_slot_data_rate_index.value", "end_device.mac_settings.desired_ping_slot_frequency", "end_device.mac_settings.desired_ping_slot_frequency.value", + "end_device.mac_settings.desired_relay", + "end_device.mac_settings.desired_relay.mode", + "end_device.mac_settings.desired_relay.mode.served", + "end_device.mac_settings.desired_relay.mode.served.backoff", + "end_device.mac_settings.desired_relay.mode.served.mode", + "end_device.mac_settings.desired_relay.mode.served.mode.always", + "end_device.mac_settings.desired_relay.mode.served.mode.dynamic", + "end_device.mac_settings.desired_relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.mac_settings.desired_relay.mode.served.mode.end_device_controlled", + "end_device.mac_settings.desired_relay.mode.served.second_channel", + "end_device.mac_settings.desired_relay.mode.served.second_channel.ack_offset", + "end_device.mac_settings.desired_relay.mode.served.second_channel.data_rate_index", + "end_device.mac_settings.desired_relay.mode.served.second_channel.frequency", + "end_device.mac_settings.desired_relay.mode.served.serving_device_id", + "end_device.mac_settings.desired_relay.mode.serving", + "end_device.mac_settings.desired_relay.mode.serving.cad_periodicity", + "end_device.mac_settings.desired_relay.mode.serving.default_channel_index", + "end_device.mac_settings.desired_relay.mode.serving.limits", + "end_device.mac_settings.desired_relay.mode.serving.limits.join_requests", + "end_device.mac_settings.desired_relay.mode.serving.limits.join_requests.bucket_size", + "end_device.mac_settings.desired_relay.mode.serving.limits.join_requests.reload_rate", + "end_device.mac_settings.desired_relay.mode.serving.limits.notifications", + "end_device.mac_settings.desired_relay.mode.serving.limits.notifications.bucket_size", + "end_device.mac_settings.desired_relay.mode.serving.limits.notifications.reload_rate", + "end_device.mac_settings.desired_relay.mode.serving.limits.overall", + "end_device.mac_settings.desired_relay.mode.serving.limits.overall.bucket_size", + "end_device.mac_settings.desired_relay.mode.serving.limits.overall.reload_rate", + "end_device.mac_settings.desired_relay.mode.serving.limits.reset_behavior", + "end_device.mac_settings.desired_relay.mode.serving.limits.uplink_messages", + "end_device.mac_settings.desired_relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.mac_settings.desired_relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.mac_settings.desired_relay.mode.serving.second_channel", + "end_device.mac_settings.desired_relay.mode.serving.second_channel.ack_offset", + "end_device.mac_settings.desired_relay.mode.serving.second_channel.data_rate_index", + "end_device.mac_settings.desired_relay.mode.serving.second_channel.frequency", + "end_device.mac_settings.desired_relay.mode.serving.uplink_forwarding_rules", "end_device.mac_settings.desired_rx1_data_rate_offset", "end_device.mac_settings.desired_rx1_data_rate_offset.value", "end_device.mac_settings.desired_rx1_delay", @@ -2738,6 +4004,42 @@ var EndDeviceTemplateFieldPathsNested = []string{ "end_device.mac_settings.ping_slot_frequency.value", "end_device.mac_settings.ping_slot_periodicity", "end_device.mac_settings.ping_slot_periodicity.value", + "end_device.mac_settings.relay", + "end_device.mac_settings.relay.mode", + "end_device.mac_settings.relay.mode.served", + "end_device.mac_settings.relay.mode.served.backoff", + "end_device.mac_settings.relay.mode.served.mode", + "end_device.mac_settings.relay.mode.served.mode.always", + "end_device.mac_settings.relay.mode.served.mode.dynamic", + "end_device.mac_settings.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.mac_settings.relay.mode.served.mode.end_device_controlled", + "end_device.mac_settings.relay.mode.served.second_channel", + "end_device.mac_settings.relay.mode.served.second_channel.ack_offset", + "end_device.mac_settings.relay.mode.served.second_channel.data_rate_index", + "end_device.mac_settings.relay.mode.served.second_channel.frequency", + "end_device.mac_settings.relay.mode.served.serving_device_id", + "end_device.mac_settings.relay.mode.serving", + "end_device.mac_settings.relay.mode.serving.cad_periodicity", + "end_device.mac_settings.relay.mode.serving.default_channel_index", + "end_device.mac_settings.relay.mode.serving.limits", + "end_device.mac_settings.relay.mode.serving.limits.join_requests", + "end_device.mac_settings.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.mac_settings.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.mac_settings.relay.mode.serving.limits.notifications", + "end_device.mac_settings.relay.mode.serving.limits.notifications.bucket_size", + "end_device.mac_settings.relay.mode.serving.limits.notifications.reload_rate", + "end_device.mac_settings.relay.mode.serving.limits.overall", + "end_device.mac_settings.relay.mode.serving.limits.overall.bucket_size", + "end_device.mac_settings.relay.mode.serving.limits.overall.reload_rate", + "end_device.mac_settings.relay.mode.serving.limits.reset_behavior", + "end_device.mac_settings.relay.mode.serving.limits.uplink_messages", + "end_device.mac_settings.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.mac_settings.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.mac_settings.relay.mode.serving.second_channel", + "end_device.mac_settings.relay.mode.serving.second_channel.ack_offset", + "end_device.mac_settings.relay.mode.serving.second_channel.data_rate_index", + "end_device.mac_settings.relay.mode.serving.second_channel.frequency", + "end_device.mac_settings.relay.mode.serving.uplink_forwarding_rules", "end_device.mac_settings.resets_f_cnt", "end_device.mac_settings.resets_f_cnt.value", "end_device.mac_settings.rx1_data_rate_offset", @@ -2781,6 +4083,42 @@ var EndDeviceTemplateFieldPathsNested = []string{ "end_device.mac_state.current_parameters.ping_slot_frequency", "end_device.mac_state.current_parameters.rejoin_count_periodicity", "end_device.mac_state.current_parameters.rejoin_time_periodicity", + "end_device.mac_state.current_parameters.relay", + "end_device.mac_state.current_parameters.relay.mode", + "end_device.mac_state.current_parameters.relay.mode.served", + "end_device.mac_state.current_parameters.relay.mode.served.backoff", + "end_device.mac_state.current_parameters.relay.mode.served.mode", + "end_device.mac_state.current_parameters.relay.mode.served.mode.always", + "end_device.mac_state.current_parameters.relay.mode.served.mode.dynamic", + "end_device.mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "end_device.mac_state.current_parameters.relay.mode.served.second_channel", + "end_device.mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "end_device.mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device.mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "end_device.mac_state.current_parameters.relay.mode.served.serving_device_id", + "end_device.mac_state.current_parameters.relay.mode.serving", + "end_device.mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "end_device.mac_state.current_parameters.relay.mode.serving.default_channel_index", + "end_device.mac_state.current_parameters.relay.mode.serving.limits", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.notifications", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.overall", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.mac_state.current_parameters.relay.mode.serving.second_channel", + "end_device.mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device.mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device.mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "end_device.mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device.mac_state.current_parameters.rx1_data_rate_offset", "end_device.mac_state.current_parameters.rx1_delay", "end_device.mac_state.current_parameters.rx2_data_rate_index", @@ -2809,6 +4147,42 @@ var EndDeviceTemplateFieldPathsNested = []string{ "end_device.mac_state.desired_parameters.ping_slot_frequency", "end_device.mac_state.desired_parameters.rejoin_count_periodicity", "end_device.mac_state.desired_parameters.rejoin_time_periodicity", + "end_device.mac_state.desired_parameters.relay", + "end_device.mac_state.desired_parameters.relay.mode", + "end_device.mac_state.desired_parameters.relay.mode.served", + "end_device.mac_state.desired_parameters.relay.mode.served.backoff", + "end_device.mac_state.desired_parameters.relay.mode.served.mode", + "end_device.mac_state.desired_parameters.relay.mode.served.mode.always", + "end_device.mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "end_device.mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "end_device.mac_state.desired_parameters.relay.mode.served.second_channel", + "end_device.mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "end_device.mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device.mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "end_device.mac_state.desired_parameters.relay.mode.served.serving_device_id", + "end_device.mac_state.desired_parameters.relay.mode.serving", + "end_device.mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "end_device.mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.overall", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.mac_state.desired_parameters.relay.mode.serving.second_channel", + "end_device.mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device.mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device.mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "end_device.mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device.mac_state.desired_parameters.rx1_data_rate_offset", "end_device.mac_state.desired_parameters.rx1_delay", "end_device.mac_state.desired_parameters.rx2_data_rate_index", @@ -2848,6 +4222,8 @@ var EndDeviceTemplateFieldPathsNested = []string{ "end_device.mac_state.pending_join_request.downlink_settings.rx1_dr_offset", "end_device.mac_state.pending_join_request.downlink_settings.rx2_dr", "end_device.mac_state.pending_join_request.rx_delay", + "end_device.mac_state.pending_relay_downlink", + "end_device.mac_state.pending_relay_downlink.raw_payload", "end_device.mac_state.pending_requests", "end_device.mac_state.ping_slot_periodicity", "end_device.mac_state.ping_slot_periodicity.value", @@ -2923,6 +4299,42 @@ var EndDeviceTemplateFieldPathsNested = []string{ "end_device.pending_mac_state.current_parameters.ping_slot_frequency", "end_device.pending_mac_state.current_parameters.rejoin_count_periodicity", "end_device.pending_mac_state.current_parameters.rejoin_time_periodicity", + "end_device.pending_mac_state.current_parameters.relay", + "end_device.pending_mac_state.current_parameters.relay.mode", + "end_device.pending_mac_state.current_parameters.relay.mode.served", + "end_device.pending_mac_state.current_parameters.relay.mode.served.backoff", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode.always", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode.dynamic", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel", + "end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "end_device.pending_mac_state.current_parameters.relay.mode.served.serving_device_id", + "end_device.pending_mac_state.current_parameters.relay.mode.serving", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.default_channel_index", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.notifications", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.overall", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device.pending_mac_state.current_parameters.rx1_data_rate_offset", "end_device.pending_mac_state.current_parameters.rx1_delay", "end_device.pending_mac_state.current_parameters.rx2_data_rate_index", @@ -2951,6 +4363,42 @@ var EndDeviceTemplateFieldPathsNested = []string{ "end_device.pending_mac_state.desired_parameters.ping_slot_frequency", "end_device.pending_mac_state.desired_parameters.rejoin_count_periodicity", "end_device.pending_mac_state.desired_parameters.rejoin_time_periodicity", + "end_device.pending_mac_state.desired_parameters.relay", + "end_device.pending_mac_state.desired_parameters.relay.mode", + "end_device.pending_mac_state.desired_parameters.relay.mode.served", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.backoff", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.always", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.serving_device_id", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.overall", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device.pending_mac_state.desired_parameters.rx1_data_rate_offset", "end_device.pending_mac_state.desired_parameters.rx1_delay", "end_device.pending_mac_state.desired_parameters.rx2_data_rate_index", @@ -2990,6 +4438,8 @@ var EndDeviceTemplateFieldPathsNested = []string{ "end_device.pending_mac_state.pending_join_request.downlink_settings.rx1_dr_offset", "end_device.pending_mac_state.pending_join_request.downlink_settings.rx2_dr", "end_device.pending_mac_state.pending_join_request.rx_delay", + "end_device.pending_mac_state.pending_relay_downlink", + "end_device.pending_mac_state.pending_relay_downlink.raw_payload", "end_device.pending_mac_state.pending_requests", "end_device.pending_mac_state.ping_slot_periodicity", "end_device.pending_mac_state.ping_slot_periodicity.value", @@ -3187,6 +4637,44 @@ var BatchGetEndDevicesRequestFieldPathsTopLevel = []string{ "device_ids", "field_mask", } +var ServingRelayParameters_UplinkForwardingRuleFieldPathsNested = []string{ + "device_id", + "last_w_f_cnt", + "limits", + "limits.bucket_size", + "limits.reload_rate", + "session_key_id", +} + +var ServingRelayParameters_UplinkForwardingRuleFieldPathsTopLevel = []string{ + "device_id", + "last_w_f_cnt", + "limits", + "session_key_id", +} +var ServingRelayParameters_ForwardingLimitsFieldPathsNested = []string{ + "join_requests", + "join_requests.bucket_size", + "join_requests.reload_rate", + "notifications", + "notifications.bucket_size", + "notifications.reload_rate", + "overall", + "overall.bucket_size", + "overall.reload_rate", + "reset_behavior", + "uplink_messages", + "uplink_messages.bucket_size", + "uplink_messages.reload_rate", +} + +var ServingRelayParameters_ForwardingLimitsFieldPathsTopLevel = []string{ + "join_requests", + "notifications", + "overall", + "reset_behavior", + "uplink_messages", +} var MACParameters_ChannelFieldPathsNested = []string{ "downlink_frequency", "enable_uplink", @@ -3442,6 +4930,7 @@ var MACState_UplinkMessage_RxMetadataFieldPathsNested = []string{ "gateway_ids.eui", "gateway_ids.gateway_id", "packet_broker", + "relay", "snr", "uplink_token", } @@ -3451,11 +4940,14 @@ var MACState_UplinkMessage_RxMetadataFieldPathsTopLevel = []string{ "downlink_path_constraint", "gateway_ids", "packet_broker", + "relay", "snr", "uplink_token", } var MACState_UplinkMessage_RxMetadata_PacketBrokerMetadataFieldPathsNested []string var MACState_UplinkMessage_RxMetadata_PacketBrokerMetadataFieldPathsTopLevel []string +var MACState_UplinkMessage_RxMetadata_RelayMetadataFieldPathsNested []string +var MACState_UplinkMessage_RxMetadata_RelayMetadataFieldPathsTopLevel []string var MACState_DownlinkMessage_MessageFieldPathsNested = []string{ "m_hdr", "m_hdr.m_type", diff --git a/pkg/ttnpb/end_device.pb.setters.fm.go b/pkg/ttnpb/end_device.pb.setters.fm.go index 542781d369..0fbb850c7f 100644 --- a/pkg/ttnpb/end_device.pb.setters.fm.go +++ b/pkg/ttnpb/end_device.pb.setters.fm.go @@ -128,6 +128,384 @@ func (dst *BoolValue) SetFields(src *BoolValue, paths ...string) error { return nil } +func (dst *ServingRelayParameters) SetFields(src *ServingRelayParameters, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "second_channel": + if len(subs) > 0 { + var newDst, newSrc *RelaySecondChannel + if (src == nil || src.SecondChannel == nil) && dst.SecondChannel == nil { + continue + } + if src != nil { + newSrc = src.SecondChannel + } + if dst.SecondChannel != nil { + newDst = dst.SecondChannel + } else { + newDst = &RelaySecondChannel{} + dst.SecondChannel = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.SecondChannel = src.SecondChannel + } else { + dst.SecondChannel = nil + } + } + case "default_channel_index": + if len(subs) > 0 { + return fmt.Errorf("'default_channel_index' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.DefaultChannelIndex = src.DefaultChannelIndex + } else { + var zero uint32 + dst.DefaultChannelIndex = zero + } + case "cad_periodicity": + if len(subs) > 0 { + return fmt.Errorf("'cad_periodicity' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.CadPeriodicity = src.CadPeriodicity + } else { + dst.CadPeriodicity = 0 + } + case "uplink_forwarding_rules": + if len(subs) > 0 { + return fmt.Errorf("'uplink_forwarding_rules' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.UplinkForwardingRules = src.UplinkForwardingRules + } else { + dst.UplinkForwardingRules = nil + } + case "limits": + if len(subs) > 0 { + var newDst, newSrc *ServingRelayParameters_ForwardingLimits + if (src == nil || src.Limits == nil) && dst.Limits == nil { + continue + } + if src != nil { + newSrc = src.Limits + } + if dst.Limits != nil { + newDst = dst.Limits + } else { + newDst = &ServingRelayParameters_ForwardingLimits{} + dst.Limits = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.Limits = src.Limits + } else { + dst.Limits = nil + } + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *ServedRelayParameters) SetFields(src *ServedRelayParameters, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "backoff": + if len(subs) > 0 { + return fmt.Errorf("'backoff' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Backoff = src.Backoff + } else { + var zero uint32 + dst.Backoff = zero + } + case "second_channel": + if len(subs) > 0 { + var newDst, newSrc *RelaySecondChannel + if (src == nil || src.SecondChannel == nil) && dst.SecondChannel == nil { + continue + } + if src != nil { + newSrc = src.SecondChannel + } + if dst.SecondChannel != nil { + newDst = dst.SecondChannel + } else { + newDst = &RelaySecondChannel{} + dst.SecondChannel = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.SecondChannel = src.SecondChannel + } else { + dst.SecondChannel = nil + } + } + case "serving_device_id": + if len(subs) > 0 { + return fmt.Errorf("'serving_device_id' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.ServingDeviceId = src.ServingDeviceId + } else { + var zero string + dst.ServingDeviceId = zero + } + + case "mode": + if len(subs) == 0 && src == nil { + dst.Mode = nil + continue + } else if len(subs) == 0 { + dst.Mode = src.Mode + continue + } + + subPathMap := _processPaths(subs) + if len(subPathMap) > 1 { + return fmt.Errorf("more than one field specified for oneof field '%s'", name) + } + for oneofName, oneofSubs := range subPathMap { + switch oneofName { + case "always": + var srcTypeOk bool + if src != nil { + _, srcTypeOk = src.Mode.(*ServedRelayParameters_Always) + } + if srcValid := srcTypeOk || src == nil || src.Mode == nil || len(oneofSubs) == 0; !srcValid { + return fmt.Errorf("attempt to set oneof 'always', while different oneof is set in source") + } + _, dstTypeOk := dst.Mode.(*ServedRelayParameters_Always) + if dstValid := dstTypeOk || dst.Mode == nil || len(oneofSubs) == 0; !dstValid { + return fmt.Errorf("attempt to set oneof 'always', while different oneof is set in destination") + } + if len(oneofSubs) > 0 { + var newDst, newSrc *RelayEndDeviceAlwaysMode + if srcTypeOk { + newSrc = src.Mode.(*ServedRelayParameters_Always).Always + } + if dstTypeOk { + newDst = dst.Mode.(*ServedRelayParameters_Always).Always + } else if srcTypeOk { + newDst = &RelayEndDeviceAlwaysMode{} + dst.Mode = &ServedRelayParameters_Always{Always: newDst} + } else { + dst.Mode = nil + continue + } + if err := newDst.SetFields(newSrc, oneofSubs...); err != nil { + return err + } + } else { + if srcTypeOk { + dst.Mode = src.Mode + } else { + dst.Mode = nil + } + } + case "dynamic": + var srcTypeOk bool + if src != nil { + _, srcTypeOk = src.Mode.(*ServedRelayParameters_Dynamic) + } + if srcValid := srcTypeOk || src == nil || src.Mode == nil || len(oneofSubs) == 0; !srcValid { + return fmt.Errorf("attempt to set oneof 'dynamic', while different oneof is set in source") + } + _, dstTypeOk := dst.Mode.(*ServedRelayParameters_Dynamic) + if dstValid := dstTypeOk || dst.Mode == nil || len(oneofSubs) == 0; !dstValid { + return fmt.Errorf("attempt to set oneof 'dynamic', while different oneof is set in destination") + } + if len(oneofSubs) > 0 { + var newDst, newSrc *RelayEndDeviceDynamicMode + if srcTypeOk { + newSrc = src.Mode.(*ServedRelayParameters_Dynamic).Dynamic + } + if dstTypeOk { + newDst = dst.Mode.(*ServedRelayParameters_Dynamic).Dynamic + } else if srcTypeOk { + newDst = &RelayEndDeviceDynamicMode{} + dst.Mode = &ServedRelayParameters_Dynamic{Dynamic: newDst} + } else { + dst.Mode = nil + continue + } + if err := newDst.SetFields(newSrc, oneofSubs...); err != nil { + return err + } + } else { + if srcTypeOk { + dst.Mode = src.Mode + } else { + dst.Mode = nil + } + } + case "end_device_controlled": + var srcTypeOk bool + if src != nil { + _, srcTypeOk = src.Mode.(*ServedRelayParameters_EndDeviceControlled) + } + if srcValid := srcTypeOk || src == nil || src.Mode == nil || len(oneofSubs) == 0; !srcValid { + return fmt.Errorf("attempt to set oneof 'end_device_controlled', while different oneof is set in source") + } + _, dstTypeOk := dst.Mode.(*ServedRelayParameters_EndDeviceControlled) + if dstValid := dstTypeOk || dst.Mode == nil || len(oneofSubs) == 0; !dstValid { + return fmt.Errorf("attempt to set oneof 'end_device_controlled', while different oneof is set in destination") + } + if len(oneofSubs) > 0 { + var newDst, newSrc *RelayEndDeviceControlledMode + if srcTypeOk { + newSrc = src.Mode.(*ServedRelayParameters_EndDeviceControlled).EndDeviceControlled + } + if dstTypeOk { + newDst = dst.Mode.(*ServedRelayParameters_EndDeviceControlled).EndDeviceControlled + } else if srcTypeOk { + newDst = &RelayEndDeviceControlledMode{} + dst.Mode = &ServedRelayParameters_EndDeviceControlled{EndDeviceControlled: newDst} + } else { + dst.Mode = nil + continue + } + if err := newDst.SetFields(newSrc, oneofSubs...); err != nil { + return err + } + } else { + if srcTypeOk { + dst.Mode = src.Mode + } else { + dst.Mode = nil + } + } + + default: + return fmt.Errorf("invalid oneof field: '%s.%s'", name, oneofName) + } + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *RelayParameters) SetFields(src *RelayParameters, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + + case "mode": + if len(subs) == 0 && src == nil { + dst.Mode = nil + continue + } else if len(subs) == 0 { + dst.Mode = src.Mode + continue + } + + subPathMap := _processPaths(subs) + if len(subPathMap) > 1 { + return fmt.Errorf("more than one field specified for oneof field '%s'", name) + } + for oneofName, oneofSubs := range subPathMap { + switch oneofName { + case "serving": + var srcTypeOk bool + if src != nil { + _, srcTypeOk = src.Mode.(*RelayParameters_Serving) + } + if srcValid := srcTypeOk || src == nil || src.Mode == nil || len(oneofSubs) == 0; !srcValid { + return fmt.Errorf("attempt to set oneof 'serving', while different oneof is set in source") + } + _, dstTypeOk := dst.Mode.(*RelayParameters_Serving) + if dstValid := dstTypeOk || dst.Mode == nil || len(oneofSubs) == 0; !dstValid { + return fmt.Errorf("attempt to set oneof 'serving', while different oneof is set in destination") + } + if len(oneofSubs) > 0 { + var newDst, newSrc *ServingRelayParameters + if srcTypeOk { + newSrc = src.Mode.(*RelayParameters_Serving).Serving + } + if dstTypeOk { + newDst = dst.Mode.(*RelayParameters_Serving).Serving + } else if srcTypeOk { + newDst = &ServingRelayParameters{} + dst.Mode = &RelayParameters_Serving{Serving: newDst} + } else { + dst.Mode = nil + continue + } + if err := newDst.SetFields(newSrc, oneofSubs...); err != nil { + return err + } + } else { + if srcTypeOk { + dst.Mode = src.Mode + } else { + dst.Mode = nil + } + } + case "served": + var srcTypeOk bool + if src != nil { + _, srcTypeOk = src.Mode.(*RelayParameters_Served) + } + if srcValid := srcTypeOk || src == nil || src.Mode == nil || len(oneofSubs) == 0; !srcValid { + return fmt.Errorf("attempt to set oneof 'served', while different oneof is set in source") + } + _, dstTypeOk := dst.Mode.(*RelayParameters_Served) + if dstValid := dstTypeOk || dst.Mode == nil || len(oneofSubs) == 0; !dstValid { + return fmt.Errorf("attempt to set oneof 'served', while different oneof is set in destination") + } + if len(oneofSubs) > 0 { + var newDst, newSrc *ServedRelayParameters + if srcTypeOk { + newSrc = src.Mode.(*RelayParameters_Served).Served + } + if dstTypeOk { + newDst = dst.Mode.(*RelayParameters_Served).Served + } else if srcTypeOk { + newDst = &ServedRelayParameters{} + dst.Mode = &RelayParameters_Served{Served: newDst} + } else { + dst.Mode = nil + continue + } + if err := newDst.SetFields(newSrc, oneofSubs...); err != nil { + return err + } + } else { + if srcTypeOk { + dst.Mode = src.Mode + } else { + dst.Mode = nil + } + } + + default: + return fmt.Errorf("invalid oneof field: '%s.%s'", name, oneofName) + } + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + func (dst *MACParameters) SetFields(src *MACParameters, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { @@ -417,6 +795,31 @@ func (dst *MACParameters) SetFields(src *MACParameters, paths ...string) error { dst.PingSlotDataRateIndexValue = nil } } + case "relay": + if len(subs) > 0 { + var newDst, newSrc *RelayParameters + if (src == nil || src.Relay == nil) && dst.Relay == nil { + continue + } + if src != nil { + newSrc = src.Relay + } + if dst.Relay != nil { + newDst = dst.Relay + } else { + newDst = &RelayParameters{} + dst.Relay = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.Relay = src.Relay + } else { + dst.Relay = nil + } + } default: return fmt.Errorf("invalid field: '%s'", name) @@ -1489,6 +1892,56 @@ func (dst *MACSettings) SetFields(src *MACSettings, paths ...string) error { dst.ScheduleDownlinks = nil } } + case "relay": + if len(subs) > 0 { + var newDst, newSrc *RelayParameters + if (src == nil || src.Relay == nil) && dst.Relay == nil { + continue + } + if src != nil { + newSrc = src.Relay + } + if dst.Relay != nil { + newDst = dst.Relay + } else { + newDst = &RelayParameters{} + dst.Relay = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.Relay = src.Relay + } else { + dst.Relay = nil + } + } + case "desired_relay": + if len(subs) > 0 { + var newDst, newSrc *RelayParameters + if (src == nil || src.DesiredRelay == nil) && dst.DesiredRelay == nil { + continue + } + if src != nil { + newSrc = src.DesiredRelay + } + if dst.DesiredRelay != nil { + newDst = dst.DesiredRelay + } else { + newDst = &RelayParameters{} + dst.DesiredRelay = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.DesiredRelay = src.DesiredRelay + } else { + dst.DesiredRelay = nil + } + } default: return fmt.Errorf("invalid field: '%s'", name) @@ -1806,6 +2259,31 @@ func (dst *MACState) SetFields(src *MACState, paths ...string) error { } else { dst.RecentMacCommandIdentifiers = nil } + case "pending_relay_downlink": + if len(subs) > 0 { + var newDst, newSrc *RelayForwardDownlinkReq + if (src == nil || src.PendingRelayDownlink == nil) && dst.PendingRelayDownlink == nil { + continue + } + if src != nil { + newSrc = src.PendingRelayDownlink + } + if dst.PendingRelayDownlink != nil { + newDst = dst.PendingRelayDownlink + } else { + newDst = &RelayForwardDownlinkReq{} + dst.PendingRelayDownlink = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.PendingRelayDownlink = src.PendingRelayDownlink + } else { + dst.PendingRelayDownlink = nil + } + } default: return fmt.Errorf("invalid field: '%s'", name) @@ -3217,6 +3695,191 @@ func (dst *BatchGetEndDevicesRequest) SetFields(src *BatchGetEndDevicesRequest, return nil } +func (dst *ServingRelayParameters_UplinkForwardingRule) SetFields(src *ServingRelayParameters_UplinkForwardingRule, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "limits": + if len(subs) > 0 { + var newDst, newSrc *RelayUplinkForwardLimits + if (src == nil || src.Limits == nil) && dst.Limits == nil { + continue + } + if src != nil { + newSrc = src.Limits + } + if dst.Limits != nil { + newDst = dst.Limits + } else { + newDst = &RelayUplinkForwardLimits{} + dst.Limits = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.Limits = src.Limits + } else { + dst.Limits = nil + } + } + case "last_w_f_cnt": + if len(subs) > 0 { + return fmt.Errorf("'last_w_f_cnt' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.LastWFCnt = src.LastWFCnt + } else { + var zero uint32 + dst.LastWFCnt = zero + } + case "device_id": + if len(subs) > 0 { + return fmt.Errorf("'device_id' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.DeviceId = src.DeviceId + } else { + var zero string + dst.DeviceId = zero + } + case "session_key_id": + if len(subs) > 0 { + return fmt.Errorf("'session_key_id' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.SessionKeyId = src.SessionKeyId + } else { + dst.SessionKeyId = nil + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *ServingRelayParameters_ForwardingLimits) SetFields(src *ServingRelayParameters_ForwardingLimits, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "reset_behavior": + if len(subs) > 0 { + return fmt.Errorf("'reset_behavior' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.ResetBehavior = src.ResetBehavior + } else { + dst.ResetBehavior = 0 + } + case "join_requests": + if len(subs) > 0 { + var newDst, newSrc *RelayForwardLimits + if (src == nil || src.JoinRequests == nil) && dst.JoinRequests == nil { + continue + } + if src != nil { + newSrc = src.JoinRequests + } + if dst.JoinRequests != nil { + newDst = dst.JoinRequests + } else { + newDst = &RelayForwardLimits{} + dst.JoinRequests = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.JoinRequests = src.JoinRequests + } else { + dst.JoinRequests = nil + } + } + case "notifications": + if len(subs) > 0 { + var newDst, newSrc *RelayForwardLimits + if (src == nil || src.Notifications == nil) && dst.Notifications == nil { + continue + } + if src != nil { + newSrc = src.Notifications + } + if dst.Notifications != nil { + newDst = dst.Notifications + } else { + newDst = &RelayForwardLimits{} + dst.Notifications = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.Notifications = src.Notifications + } else { + dst.Notifications = nil + } + } + case "uplink_messages": + if len(subs) > 0 { + var newDst, newSrc *RelayForwardLimits + if (src == nil || src.UplinkMessages == nil) && dst.UplinkMessages == nil { + continue + } + if src != nil { + newSrc = src.UplinkMessages + } + if dst.UplinkMessages != nil { + newDst = dst.UplinkMessages + } else { + newDst = &RelayForwardLimits{} + dst.UplinkMessages = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.UplinkMessages = src.UplinkMessages + } else { + dst.UplinkMessages = nil + } + } + case "overall": + if len(subs) > 0 { + var newDst, newSrc *RelayForwardLimits + if (src == nil || src.Overall == nil) && dst.Overall == nil { + continue + } + if src != nil { + newSrc = src.Overall + } + if dst.Overall != nil { + newDst = dst.Overall + } else { + newDst = &RelayForwardLimits{} + dst.Overall = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.Overall = src.Overall + } else { + dst.Overall = nil + } + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + func (dst *MACParameters_Channel) SetFields(src *MACParameters_Channel, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { @@ -4058,6 +4721,31 @@ func (dst *MACState_UplinkMessage_RxMetadata) SetFields(src *MACState_UplinkMess dst.PacketBroker = nil } } + case "relay": + if len(subs) > 0 { + var newDst, newSrc *MACState_UplinkMessage_RxMetadata_RelayMetadata + if (src == nil || src.Relay == nil) && dst.Relay == nil { + continue + } + if src != nil { + newSrc = src.Relay + } + if dst.Relay != nil { + newDst = dst.Relay + } else { + newDst = &MACState_UplinkMessage_RxMetadata_RelayMetadata{} + dst.Relay = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.Relay = src.Relay + } else { + dst.Relay = nil + } + } default: return fmt.Errorf("invalid field: '%s'", name) @@ -4073,6 +4761,13 @@ func (dst *MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata) SetFields(src return nil } +func (dst *MACState_UplinkMessage_RxMetadata_RelayMetadata) SetFields(src *MACState_UplinkMessage_RxMetadata_RelayMetadata, paths ...string) error { + if len(paths) != 0 { + return fmt.Errorf("message MACState_UplinkMessage_RxMetadata_RelayMetadata has no fields, but paths %s were specified", paths) + } + return nil +} + func (dst *MACState_DownlinkMessage_Message) SetFields(src *MACState_DownlinkMessage_Message, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { diff --git a/pkg/ttnpb/end_device.pb.validate.go b/pkg/ttnpb/end_device.pb.validate.go index 45654db403..f16efcac19 100644 --- a/pkg/ttnpb/end_device.pb.validate.go +++ b/pkg/ttnpb/end_device.pb.validate.go @@ -261,6 +261,466 @@ var _ interface { ErrorName() string } = BoolValueValidationError{} +// ValidateFields checks the field values on ServingRelayParameters with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *ServingRelayParameters) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = ServingRelayParametersFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "second_channel": + + if v, ok := interface{}(m.GetSecondChannel()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return ServingRelayParametersValidationError{ + field: "second_channel", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "default_channel_index": + + if m.GetDefaultChannelIndex() > 255 { + return ServingRelayParametersValidationError{ + field: "default_channel_index", + reason: "value must be less than or equal to 255", + } + } + + case "cad_periodicity": + + if _, ok := RelayCADPeriodicity_name[int32(m.GetCadPeriodicity())]; !ok { + return ServingRelayParametersValidationError{ + field: "cad_periodicity", + reason: "value must be one of the defined enum values", + } + } + + case "uplink_forwarding_rules": + + if len(m.GetUplinkForwardingRules()) > 16 { + return ServingRelayParametersValidationError{ + field: "uplink_forwarding_rules", + reason: "value must contain no more than 16 item(s)", + } + } + + for idx, item := range m.GetUplinkForwardingRules() { + _, _ = idx, item + + if v, ok := interface{}(item).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return ServingRelayParametersValidationError{ + field: fmt.Sprintf("uplink_forwarding_rules[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + case "limits": + + if v, ok := interface{}(m.GetLimits()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return ServingRelayParametersValidationError{ + field: "limits", + reason: "embedded message failed validation", + cause: err, + } + } + } + + default: + return ServingRelayParametersValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// ServingRelayParametersValidationError is the validation error returned by +// ServingRelayParameters.ValidateFields if the designated constraints aren't met. +type ServingRelayParametersValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ServingRelayParametersValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ServingRelayParametersValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ServingRelayParametersValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ServingRelayParametersValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ServingRelayParametersValidationError) ErrorName() string { + return "ServingRelayParametersValidationError" +} + +// Error satisfies the builtin error interface +func (e ServingRelayParametersValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sServingRelayParameters.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ServingRelayParametersValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ServingRelayParametersValidationError{} + +// ValidateFields checks the field values on ServedRelayParameters with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *ServedRelayParameters) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = ServedRelayParametersFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "backoff": + + if m.GetBackoff() > 63 { + return ServedRelayParametersValidationError{ + field: "backoff", + reason: "value must be less than or equal to 63", + } + } + + case "second_channel": + + if v, ok := interface{}(m.GetSecondChannel()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return ServedRelayParametersValidationError{ + field: "second_channel", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "serving_device_id": + + if utf8.RuneCountInString(m.GetServingDeviceId()) > 36 { + return ServedRelayParametersValidationError{ + field: "serving_device_id", + reason: "value length must be at most 36 runes", + } + } + + if !_ServedRelayParameters_ServingDeviceId_Pattern.MatchString(m.GetServingDeviceId()) { + return ServedRelayParametersValidationError{ + field: "serving_device_id", + reason: "value does not match regex pattern \"^[a-z0-9](?:[-]?[a-z0-9]){2,}$\"", + } + } + + case "mode": + if m.Mode == nil { + return ServedRelayParametersValidationError{ + field: "mode", + reason: "value is required", + } + } + if len(subs) == 0 { + subs = []string{ + "always", "dynamic", "end_device_controlled", + } + } + for name, subs := range _processPaths(subs) { + _ = subs + switch name { + case "always": + w, ok := m.Mode.(*ServedRelayParameters_Always) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetAlways()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return ServedRelayParametersValidationError{ + field: "always", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "dynamic": + w, ok := m.Mode.(*ServedRelayParameters_Dynamic) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetDynamic()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return ServedRelayParametersValidationError{ + field: "dynamic", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "end_device_controlled": + w, ok := m.Mode.(*ServedRelayParameters_EndDeviceControlled) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetEndDeviceControlled()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return ServedRelayParametersValidationError{ + field: "end_device_controlled", + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + } + default: + return ServedRelayParametersValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// ServedRelayParametersValidationError is the validation error returned by +// ServedRelayParameters.ValidateFields if the designated constraints aren't met. +type ServedRelayParametersValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ServedRelayParametersValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ServedRelayParametersValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ServedRelayParametersValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ServedRelayParametersValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ServedRelayParametersValidationError) ErrorName() string { + return "ServedRelayParametersValidationError" +} + +// Error satisfies the builtin error interface +func (e ServedRelayParametersValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sServedRelayParameters.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ServedRelayParametersValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ServedRelayParametersValidationError{} + +var _ServedRelayParameters_ServingDeviceId_Pattern = regexp.MustCompile("^[a-z0-9](?:[-]?[a-z0-9]){2,}$") + +// ValidateFields checks the field values on RelayParameters with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *RelayParameters) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = RelayParametersFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "mode": + if m.Mode == nil { + return RelayParametersValidationError{ + field: "mode", + reason: "value is required", + } + } + if len(subs) == 0 { + subs = []string{ + "serving", "served", + } + } + for name, subs := range _processPaths(subs) { + _ = subs + switch name { + case "serving": + w, ok := m.Mode.(*RelayParameters_Serving) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetServing()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return RelayParametersValidationError{ + field: "serving", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "served": + w, ok := m.Mode.(*RelayParameters_Served) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetServed()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return RelayParametersValidationError{ + field: "served", + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + } + default: + return RelayParametersValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// RelayParametersValidationError is the validation error returned by +// RelayParameters.ValidateFields if the designated constraints aren't met. +type RelayParametersValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e RelayParametersValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e RelayParametersValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e RelayParametersValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e RelayParametersValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e RelayParametersValidationError) ErrorName() string { return "RelayParametersValidationError" } + +// Error satisfies the builtin error interface +func (e RelayParametersValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sRelayParameters.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = RelayParametersValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RelayParametersValidationError{} + // ValidateFields checks the field values on MACParameters with the rules // defined in the proto definition for this message. If any rules are // violated, an error is returned. @@ -476,6 +936,18 @@ func (m *MACParameters) ValidateFields(paths ...string) error { } } + case "relay": + + if v, ok := interface{}(m.GetRelay()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACParametersValidationError{ + field: "relay", + reason: "embedded message failed validation", + cause: err, + } + } + } + default: return MACParametersValidationError{ field: name, @@ -1275,6 +1747,30 @@ func (m *MACSettings) ValidateFields(paths ...string) error { } } + case "relay": + + if v, ok := interface{}(m.GetRelay()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACSettingsValidationError{ + field: "relay", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "desired_relay": + + if v, ok := interface{}(m.GetDesiredRelay()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACSettingsValidationError{ + field: "desired_relay", + reason: "embedded message failed validation", + cause: err, + } + } + } + default: return MACSettingsValidationError{ field: name, @@ -1638,13 +2134,25 @@ func (m *MACState) ValidateFields(paths ...string) error { } } } - + + } + + case "last_adr_change_f_cnt_up": + // no validation rules for LastAdrChangeFCntUp + case "recent_mac_command_identifiers": + + case "pending_relay_downlink": + + if v, ok := interface{}(m.GetPendingRelayDownlink()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACStateValidationError{ + field: "pending_relay_downlink", + reason: "embedded message failed validation", + cause: err, + } + } } - case "last_adr_change_f_cnt_up": - // no validation rules for LastAdrChangeFCntUp - case "recent_mac_command_identifiers": - default: return MACStateValidationError{ field: name, @@ -4290,6 +4798,259 @@ var _ interface { var _BatchGetEndDevicesRequest_DeviceIds_Pattern = regexp.MustCompile("^[a-z0-9](?:[-]?[a-z0-9]){2,}$") +// ValidateFields checks the field values on +// ServingRelayParameters_UplinkForwardingRule with the rules defined in the +// proto definition for this message. If any rules are violated, an error is returned. +func (m *ServingRelayParameters_UplinkForwardingRule) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = ServingRelayParameters_UplinkForwardingRuleFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "limits": + + if v, ok := interface{}(m.GetLimits()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return ServingRelayParameters_UplinkForwardingRuleValidationError{ + field: "limits", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "last_w_f_cnt": + // no validation rules for LastWFCnt + case "device_id": + + if m.GetDeviceId() != "" { + + if utf8.RuneCountInString(m.GetDeviceId()) > 36 { + return ServingRelayParameters_UplinkForwardingRuleValidationError{ + field: "device_id", + reason: "value length must be at most 36 runes", + } + } + + if !_ServingRelayParameters_UplinkForwardingRule_DeviceId_Pattern.MatchString(m.GetDeviceId()) { + return ServingRelayParameters_UplinkForwardingRuleValidationError{ + field: "device_id", + reason: "value does not match regex pattern \"^[a-z0-9](?:[-]?[a-z0-9]){2,}$\"", + } + } + + } + + case "session_key_id": + // no validation rules for SessionKeyId + default: + return ServingRelayParameters_UplinkForwardingRuleValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// ServingRelayParameters_UplinkForwardingRuleValidationError is the validation +// error returned by +// ServingRelayParameters_UplinkForwardingRule.ValidateFields if the +// designated constraints aren't met. +type ServingRelayParameters_UplinkForwardingRuleValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ServingRelayParameters_UplinkForwardingRuleValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ServingRelayParameters_UplinkForwardingRuleValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ServingRelayParameters_UplinkForwardingRuleValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ServingRelayParameters_UplinkForwardingRuleValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ServingRelayParameters_UplinkForwardingRuleValidationError) ErrorName() string { + return "ServingRelayParameters_UplinkForwardingRuleValidationError" +} + +// Error satisfies the builtin error interface +func (e ServingRelayParameters_UplinkForwardingRuleValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sServingRelayParameters_UplinkForwardingRule.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ServingRelayParameters_UplinkForwardingRuleValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ServingRelayParameters_UplinkForwardingRuleValidationError{} + +var _ServingRelayParameters_UplinkForwardingRule_DeviceId_Pattern = regexp.MustCompile("^[a-z0-9](?:[-]?[a-z0-9]){2,}$") + +// ValidateFields checks the field values on +// ServingRelayParameters_ForwardingLimits with the rules defined in the proto +// definition for this message. If any rules are violated, an error is returned. +func (m *ServingRelayParameters_ForwardingLimits) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = ServingRelayParameters_ForwardingLimitsFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "reset_behavior": + // no validation rules for ResetBehavior + case "join_requests": + + if v, ok := interface{}(m.GetJoinRequests()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return ServingRelayParameters_ForwardingLimitsValidationError{ + field: "join_requests", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "notifications": + + if v, ok := interface{}(m.GetNotifications()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return ServingRelayParameters_ForwardingLimitsValidationError{ + field: "notifications", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "uplink_messages": + + if v, ok := interface{}(m.GetUplinkMessages()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return ServingRelayParameters_ForwardingLimitsValidationError{ + field: "uplink_messages", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "overall": + + if v, ok := interface{}(m.GetOverall()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return ServingRelayParameters_ForwardingLimitsValidationError{ + field: "overall", + reason: "embedded message failed validation", + cause: err, + } + } + } + + default: + return ServingRelayParameters_ForwardingLimitsValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// ServingRelayParameters_ForwardingLimitsValidationError is the validation +// error returned by ServingRelayParameters_ForwardingLimits.ValidateFields if +// the designated constraints aren't met. +type ServingRelayParameters_ForwardingLimitsValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ServingRelayParameters_ForwardingLimitsValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ServingRelayParameters_ForwardingLimitsValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ServingRelayParameters_ForwardingLimitsValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ServingRelayParameters_ForwardingLimitsValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ServingRelayParameters_ForwardingLimitsValidationError) ErrorName() string { + return "ServingRelayParameters_ForwardingLimitsValidationError" +} + +// Error satisfies the builtin error interface +func (e ServingRelayParameters_ForwardingLimitsValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sServingRelayParameters_ForwardingLimits.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ServingRelayParameters_ForwardingLimitsValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ServingRelayParameters_ForwardingLimitsValidationError{} + // ValidateFields checks the field values on MACParameters_Channel with the // rules defined in the proto definition for this message. If any rules are // violated, an error is returned. @@ -5984,6 +6745,18 @@ func (m *MACState_UplinkMessage_RxMetadata) ValidateFields(paths ...string) erro } } + case "relay": + + if v, ok := interface{}(m.GetRelay()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACState_UplinkMessage_RxMetadataValidationError{ + field: "relay", + reason: "embedded message failed validation", + cause: err, + } + } + } + default: return MACState_UplinkMessage_RxMetadataValidationError{ field: name, @@ -6128,6 +6901,79 @@ var _ interface { ErrorName() string } = MACState_UplinkMessage_RxMetadata_PacketBrokerMetadataValidationError{} +// ValidateFields checks the field values on +// MACState_UplinkMessage_RxMetadata_RelayMetadata with the rules defined in +// the proto definition for this message. If any rules are violated, an error +// is returned. +func (m *MACState_UplinkMessage_RxMetadata_RelayMetadata) ValidateFields(paths ...string) error { + if len(paths) > 0 { + return fmt.Errorf("message MACState_UplinkMessage_RxMetadata_RelayMetadata has no fields, but paths %s were specified", paths) + } + return nil +} + +// MACState_UplinkMessage_RxMetadata_RelayMetadataValidationError is the +// validation error returned by +// MACState_UplinkMessage_RxMetadata_RelayMetadata.ValidateFields if the +// designated constraints aren't met. +type MACState_UplinkMessage_RxMetadata_RelayMetadataValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e MACState_UplinkMessage_RxMetadata_RelayMetadataValidationError) Field() string { + return e.field +} + +// Reason function returns reason value. +func (e MACState_UplinkMessage_RxMetadata_RelayMetadataValidationError) Reason() string { + return e.reason +} + +// Cause function returns cause value. +func (e MACState_UplinkMessage_RxMetadata_RelayMetadataValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e MACState_UplinkMessage_RxMetadata_RelayMetadataValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e MACState_UplinkMessage_RxMetadata_RelayMetadataValidationError) ErrorName() string { + return "MACState_UplinkMessage_RxMetadata_RelayMetadataValidationError" +} + +// Error satisfies the builtin error interface +func (e MACState_UplinkMessage_RxMetadata_RelayMetadataValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sMACState_UplinkMessage_RxMetadata_RelayMetadata.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = MACState_UplinkMessage_RxMetadata_RelayMetadataValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = MACState_UplinkMessage_RxMetadata_RelayMetadataValidationError{} + // ValidateFields checks the field values on MACState_DownlinkMessage_Message // with the rules defined in the proto definition for this message. If any // rules are violated, an error is returned. diff --git a/pkg/ttnpb/end_device_flags.pb.go b/pkg/ttnpb/end_device_flags.pb.go index 55531cc5c7..d4ff756cbb 100644 --- a/pkg/ttnpb/end_device_flags.pb.go +++ b/pkg/ttnpb/end_device_flags.pb.go @@ -172,6 +172,323 @@ func (m *BoolValue) SetFromFlags(flags *pflag.FlagSet, prefix string) (paths []s return paths, nil } +// AddSelectFlagsForServingRelayParameters adds flags to select fields in ServingRelayParameters. +func AddSelectFlagsForServingRelayParameters(flags *pflag.FlagSet, prefix string, hidden bool) { + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("second-channel", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("second-channel", prefix), true), flagsplugin.WithHidden(hidden))) + AddSelectFlagsForRelaySecondChannel(flags, flagsplugin.Prefix("second-channel", prefix), hidden) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("default-channel-index", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("default-channel-index", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("cad-periodicity", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("cad-periodicity", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("uplink-forwarding-rules", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("uplink-forwarding-rules", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("limits", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("limits", prefix), true), flagsplugin.WithHidden(hidden))) + // NOTE: limits (ServingRelayParameters_ForwardingLimits) does not seem to have select flags. +} + +// SelectFromFlags outputs the fieldmask paths forServingRelayParameters message from select flags. +func PathsFromSelectFlagsForServingRelayParameters(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("second_channel", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("second_channel", prefix)) + } + if selectPaths, err := PathsFromSelectFlagsForRelaySecondChannel(flags, flagsplugin.Prefix("second_channel", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, selectPaths...) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("default_channel_index", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("default_channel_index", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("cad_periodicity", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("cad_periodicity", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("uplink_forwarding_rules", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("uplink_forwarding_rules", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("limits", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("limits", prefix)) + } + // NOTE: limits (ServingRelayParameters_ForwardingLimits) does not seem to have select flags. + return paths, nil +} + +// AddSetFlagsForServingRelayParameters adds flags to select fields in ServingRelayParameters. +func AddSetFlagsForServingRelayParameters(flags *pflag.FlagSet, prefix string, hidden bool) { + AddSetFlagsForRelaySecondChannel(flags, flagsplugin.Prefix("second-channel", prefix), hidden) + flags.AddFlag(flagsplugin.NewUint32Flag(flagsplugin.Prefix("default-channel-index", prefix), "", flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewStringFlag(flagsplugin.Prefix("cad-periodicity", prefix), flagsplugin.EnumValueDesc(RelayCADPeriodicity_value), flagsplugin.WithHidden(hidden))) + // FIXME: Skipping UplinkForwardingRules because repeated messages are currently not supported. + // FIXME: Skipping Limits because it does not seem to implement AddSetFlags. +} + +// SetFromFlags sets the ServingRelayParameters message from flags. +func (m *ServingRelayParameters) SetFromFlags(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if changed := flagsplugin.IsAnyPrefixSet(flags, flagsplugin.Prefix("second_channel", prefix)); changed { + if m.SecondChannel == nil { + m.SecondChannel = &RelaySecondChannel{} + } + if setPaths, err := m.SecondChannel.SetFromFlags(flags, flagsplugin.Prefix("second_channel", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, setPaths...) + } + } + if val, changed, err := flagsplugin.GetUint32(flags, flagsplugin.Prefix("default_channel_index", prefix)); err != nil { + return nil, err + } else if changed { + m.DefaultChannelIndex = val + paths = append(paths, flagsplugin.Prefix("default_channel_index", prefix)) + } + if val, changed, err := flagsplugin.GetString(flags, flagsplugin.Prefix("cad_periodicity", prefix)); err != nil { + return nil, err + } else if changed { + enumValue, err := flagsplugin.SetEnumString(val, RelayCADPeriodicity_value) + if err != nil { + return nil, err + } + m.CadPeriodicity = RelayCADPeriodicity(enumValue) + paths = append(paths, flagsplugin.Prefix("cad_periodicity", prefix)) + } + // FIXME: Skipping UplinkForwardingRules because it does not seem to implement AddSetFlags. + // FIXME: Skipping Limits because it does not seem to implement AddSetFlags. + return paths, nil +} + +// AddSelectFlagsForServedRelayParameters adds flags to select fields in ServedRelayParameters. +func AddSelectFlagsForServedRelayParameters(flags *pflag.FlagSet, prefix string, hidden bool) { + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("mode.always", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("mode.always", prefix), true), flagsplugin.WithHidden(hidden))) + AddSelectFlagsForRelayEndDeviceAlwaysMode(flags, flagsplugin.Prefix("mode.always", prefix), hidden) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("mode.dynamic", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("mode.dynamic", prefix), true), flagsplugin.WithHidden(hidden))) + AddSelectFlagsForRelayEndDeviceDynamicMode(flags, flagsplugin.Prefix("mode.dynamic", prefix), hidden) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("mode.end-device-controlled", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("mode.end-device-controlled", prefix), true), flagsplugin.WithHidden(hidden))) + AddSelectFlagsForRelayEndDeviceControlledMode(flags, flagsplugin.Prefix("mode.end-device-controlled", prefix), hidden) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("backoff", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("backoff", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("second-channel", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("second-channel", prefix), true), flagsplugin.WithHidden(hidden))) + AddSelectFlagsForRelaySecondChannel(flags, flagsplugin.Prefix("second-channel", prefix), hidden) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("serving-device-id", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("serving-device-id", prefix), false), flagsplugin.WithHidden(hidden))) +} + +// SelectFromFlags outputs the fieldmask paths forServedRelayParameters message from select flags. +func PathsFromSelectFlagsForServedRelayParameters(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("mode.always", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("mode.always", prefix)) + } + if selectPaths, err := PathsFromSelectFlagsForRelayEndDeviceAlwaysMode(flags, flagsplugin.Prefix("mode.always", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, selectPaths...) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("mode.dynamic", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("mode.dynamic", prefix)) + } + if selectPaths, err := PathsFromSelectFlagsForRelayEndDeviceDynamicMode(flags, flagsplugin.Prefix("mode.dynamic", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, selectPaths...) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("mode.end_device_controlled", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("mode.end_device_controlled", prefix)) + } + if selectPaths, err := PathsFromSelectFlagsForRelayEndDeviceControlledMode(flags, flagsplugin.Prefix("mode.end_device_controlled", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, selectPaths...) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("backoff", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("backoff", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("second_channel", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("second_channel", prefix)) + } + if selectPaths, err := PathsFromSelectFlagsForRelaySecondChannel(flags, flagsplugin.Prefix("second_channel", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, selectPaths...) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("serving_device_id", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("serving_device_id", prefix)) + } + return paths, nil +} + +// AddSetFlagsForServedRelayParameters adds flags to select fields in ServedRelayParameters. +func AddSetFlagsForServedRelayParameters(flags *pflag.FlagSet, prefix string, hidden bool) { + AddSetFlagsForRelayEndDeviceAlwaysMode(flags, flagsplugin.Prefix("mode.always", prefix), hidden) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("mode.always", prefix), "", flagsplugin.WithHidden(hidden))) + AddSetFlagsForRelayEndDeviceDynamicMode(flags, flagsplugin.Prefix("mode.dynamic", prefix), hidden) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("mode.dynamic", prefix), "", flagsplugin.WithHidden(hidden))) + AddSetFlagsForRelayEndDeviceControlledMode(flags, flagsplugin.Prefix("mode.end-device-controlled", prefix), hidden) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("mode.end-device-controlled", prefix), "", flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewUint32Flag(flagsplugin.Prefix("backoff", prefix), "", flagsplugin.WithHidden(hidden))) + AddSetFlagsForRelaySecondChannel(flags, flagsplugin.Prefix("second-channel", prefix), hidden) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("second-channel", prefix), "", flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewStringFlag(flagsplugin.Prefix("serving-device-id", prefix), "", flagsplugin.WithHidden(hidden))) +} + +// SetFromFlags sets the ServedRelayParameters message from flags. +func (m *ServedRelayParameters) SetFromFlags(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if changed := flagsplugin.IsAnyPrefixSet(flags, flagsplugin.Prefix("mode.always", prefix)); changed { + ov := &ServedRelayParameters_Always{} + if ov.Always == nil { + ov.Always = &RelayEndDeviceAlwaysMode{} + } + if setPaths, err := ov.Always.SetFromFlags(flags, flagsplugin.Prefix("mode.always", prefix)); err != nil { + return nil, err + } else if len(setPaths) == 0 { + paths = append(paths, "mode.always") + } else { + paths = append(paths, setPaths...) + } + m.Mode = ov + } + if changed := flagsplugin.IsAnyPrefixSet(flags, flagsplugin.Prefix("mode.dynamic", prefix)); changed { + ov := &ServedRelayParameters_Dynamic{} + if ov.Dynamic == nil { + ov.Dynamic = &RelayEndDeviceDynamicMode{} + } + if setPaths, err := ov.Dynamic.SetFromFlags(flags, flagsplugin.Prefix("mode.dynamic", prefix)); err != nil { + return nil, err + } else if len(setPaths) == 0 { + paths = append(paths, "mode.dynamic") + } else { + paths = append(paths, setPaths...) + } + m.Mode = ov + } + if changed := flagsplugin.IsAnyPrefixSet(flags, flagsplugin.Prefix("mode.end_device_controlled", prefix)); changed { + ov := &ServedRelayParameters_EndDeviceControlled{} + if ov.EndDeviceControlled == nil { + ov.EndDeviceControlled = &RelayEndDeviceControlledMode{} + } + if setPaths, err := ov.EndDeviceControlled.SetFromFlags(flags, flagsplugin.Prefix("mode.end_device_controlled", prefix)); err != nil { + return nil, err + } else if len(setPaths) == 0 { + paths = append(paths, "mode.end_device_controlled") + } else { + paths = append(paths, setPaths...) + } + m.Mode = ov + } + if val, changed, err := flagsplugin.GetUint32(flags, flagsplugin.Prefix("backoff", prefix)); err != nil { + return nil, err + } else if changed { + m.Backoff = val + paths = append(paths, flagsplugin.Prefix("backoff", prefix)) + } + if changed := flagsplugin.IsAnyPrefixSet(flags, flagsplugin.Prefix("second_channel", prefix)); changed { + if m.SecondChannel == nil { + m.SecondChannel = &RelaySecondChannel{} + } + if setPaths, err := m.SecondChannel.SetFromFlags(flags, flagsplugin.Prefix("second_channel", prefix)); err != nil { + return nil, err + } else if len(setPaths) == 0 { + paths = append(paths, "second_channel") + } else { + paths = append(paths, setPaths...) + } + } + if val, changed, err := flagsplugin.GetString(flags, flagsplugin.Prefix("serving_device_id", prefix)); err != nil { + return nil, err + } else if changed { + m.ServingDeviceId = val + paths = append(paths, flagsplugin.Prefix("serving_device_id", prefix)) + } + return paths, nil +} + +// AddSelectFlagsForRelayParameters adds flags to select fields in RelayParameters. +func AddSelectFlagsForRelayParameters(flags *pflag.FlagSet, prefix string, hidden bool) { + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("mode.serving", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("mode.serving", prefix), true), flagsplugin.WithHidden(hidden))) + AddSelectFlagsForServingRelayParameters(flags, flagsplugin.Prefix("mode.serving", prefix), hidden) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("mode.served", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("mode.served", prefix), true), flagsplugin.WithHidden(hidden))) + AddSelectFlagsForServedRelayParameters(flags, flagsplugin.Prefix("mode.served", prefix), hidden) +} + +// SelectFromFlags outputs the fieldmask paths forRelayParameters message from select flags. +func PathsFromSelectFlagsForRelayParameters(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("mode.serving", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("mode.serving", prefix)) + } + if selectPaths, err := PathsFromSelectFlagsForServingRelayParameters(flags, flagsplugin.Prefix("mode.serving", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, selectPaths...) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("mode.served", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("mode.served", prefix)) + } + if selectPaths, err := PathsFromSelectFlagsForServedRelayParameters(flags, flagsplugin.Prefix("mode.served", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, selectPaths...) + } + return paths, nil +} + +// AddSetFlagsForRelayParameters adds flags to select fields in RelayParameters. +func AddSetFlagsForRelayParameters(flags *pflag.FlagSet, prefix string, hidden bool) { + AddSetFlagsForServingRelayParameters(flags, flagsplugin.Prefix("mode.serving", prefix), hidden) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("mode.serving", prefix), "", flagsplugin.WithHidden(hidden))) + AddSetFlagsForServedRelayParameters(flags, flagsplugin.Prefix("mode.served", prefix), hidden) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("mode.served", prefix), "", flagsplugin.WithHidden(hidden))) +} + +// SetFromFlags sets the RelayParameters message from flags. +func (m *RelayParameters) SetFromFlags(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if changed := flagsplugin.IsAnyPrefixSet(flags, flagsplugin.Prefix("mode.serving", prefix)); changed { + ov := &RelayParameters_Serving{} + if ov.Serving == nil { + ov.Serving = &ServingRelayParameters{} + } + if setPaths, err := ov.Serving.SetFromFlags(flags, flagsplugin.Prefix("mode.serving", prefix)); err != nil { + return nil, err + } else if len(setPaths) == 0 { + paths = append(paths, "mode.serving") + } else { + paths = append(paths, setPaths...) + } + m.Mode = ov + } + if changed := flagsplugin.IsAnyPrefixSet(flags, flagsplugin.Prefix("mode.served", prefix)); changed { + ov := &RelayParameters_Served{} + if ov.Served == nil { + ov.Served = &ServedRelayParameters{} + } + if setPaths, err := ov.Served.SetFromFlags(flags, flagsplugin.Prefix("mode.served", prefix)); err != nil { + return nil, err + } else if len(setPaths) == 0 { + paths = append(paths, "mode.served") + } else { + paths = append(paths, setPaths...) + } + m.Mode = ov + } + return paths, nil +} + // AddSelectFlagsForMACParameters_Channel adds flags to select fields in MACParameters_Channel. func AddSelectFlagsForMACParameters_Channel(flags *pflag.FlagSet, prefix string, hidden bool) { flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("uplink-frequency", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("uplink-frequency", prefix), false), flagsplugin.WithHidden(hidden))) @@ -292,6 +609,8 @@ func AddSelectFlagsForMACParameters(flags *pflag.FlagSet, prefix string, hidden AddSelectFlagsForADRAckDelayExponentValue(flags, flagsplugin.Prefix("adr-ack-delay-exponent", prefix), true) flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("ping-slot-data-rate-index-value", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("ping-slot-data-rate-index-value", prefix), true), flagsplugin.WithHidden(hidden))) AddSelectFlagsForDataRateIndexValue(flags, flagsplugin.Prefix("ping-slot-data-rate-index-value", prefix), true) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("relay", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("relay", prefix), true), flagsplugin.WithHidden(hidden))) + AddSelectFlagsForRelayParameters(flags, flagsplugin.Prefix("relay", prefix), hidden) } // SelectFromFlags outputs the fieldmask paths forMACParameters message from select flags. @@ -431,6 +750,16 @@ func PathsFromSelectFlagsForMACParameters(flags *pflag.FlagSet, prefix string) ( } else { paths = append(paths, selectPaths...) } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("relay", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("relay", prefix)) + } + if selectPaths, err := PathsFromSelectFlagsForRelayParameters(flags, flagsplugin.Prefix("relay", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, selectPaths...) + } return paths, nil } @@ -463,6 +792,7 @@ func AddSetFlagsForMACParameters(flags *pflag.FlagSet, prefix string, hidden boo flagsplugin.AddAlias(flags, flagsplugin.Prefix("adr-ack-delay-exponent.value", prefix), flagsplugin.Prefix("adr-ack-delay-exponent", prefix), flagsplugin.WithHidden(hidden)) AddSetFlagsForDataRateIndexValue(flags, flagsplugin.Prefix("ping-slot-data-rate-index-value", prefix), true) flagsplugin.AddAlias(flags, flagsplugin.Prefix("ping-slot-data-rate-index-value.value", prefix), flagsplugin.Prefix("ping-slot-data-rate-index-value", prefix), flagsplugin.WithHidden(hidden)) + AddSetFlagsForRelayParameters(flags, flagsplugin.Prefix("relay", prefix), hidden) } // SetFromFlags sets the MACParameters message from flags. @@ -646,6 +976,16 @@ func (m *MACParameters) SetFromFlags(flags *pflag.FlagSet, prefix string) (paths paths = append(paths, setPaths...) } } + if changed := flagsplugin.IsAnyPrefixSet(flags, flagsplugin.Prefix("relay", prefix)); changed { + if m.Relay == nil { + m.Relay = &RelayParameters{} + } + if setPaths, err := m.Relay.SetFromFlags(flags, flagsplugin.Prefix("relay", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, setPaths...) + } + } return paths, nil } @@ -1157,6 +1497,10 @@ func AddSelectFlagsForMACSettings(flags *pflag.FlagSet, prefix string, hidden bo AddSelectFlagsForADRSettings(flags, flagsplugin.Prefix("adr", prefix), hidden) flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("schedule-downlinks", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("schedule-downlinks", prefix), true), flagsplugin.WithHidden(hidden))) AddSelectFlagsForBoolValue(flags, flagsplugin.Prefix("schedule-downlinks", prefix), true) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("relay", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("relay", prefix), true), flagsplugin.WithHidden(hidden))) + AddSelectFlagsForRelayParameters(flags, flagsplugin.Prefix("relay", prefix), hidden) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("desired-relay", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("desired-relay", prefix), true), flagsplugin.WithHidden(hidden))) + AddSelectFlagsForRelayParameters(flags, flagsplugin.Prefix("desired-relay", prefix), hidden) } // SelectFromFlags outputs the fieldmask paths forMACSettings message from select flags. @@ -1466,6 +1810,26 @@ func PathsFromSelectFlagsForMACSettings(flags *pflag.FlagSet, prefix string) (pa } else { paths = append(paths, selectPaths...) } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("relay", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("relay", prefix)) + } + if selectPaths, err := PathsFromSelectFlagsForRelayParameters(flags, flagsplugin.Prefix("relay", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, selectPaths...) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("desired_relay", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("desired_relay", prefix)) + } + if selectPaths, err := PathsFromSelectFlagsForRelayParameters(flags, flagsplugin.Prefix("desired_relay", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, selectPaths...) + } return paths, nil } @@ -1531,6 +1895,8 @@ func AddSetFlagsForMACSettings(flags *pflag.FlagSet, prefix string, hidden bool) AddSetFlagsForADRSettings(flags, flagsplugin.Prefix("adr", prefix), hidden) AddSetFlagsForBoolValue(flags, flagsplugin.Prefix("schedule-downlinks", prefix), true) flagsplugin.AddAlias(flags, flagsplugin.Prefix("schedule-downlinks.value", prefix), flagsplugin.Prefix("schedule-downlinks", prefix), flagsplugin.WithHidden(hidden)) + AddSetFlagsForRelayParameters(flags, flagsplugin.Prefix("relay", prefix), hidden) + AddSetFlagsForRelayParameters(flags, flagsplugin.Prefix("desired-relay", prefix), hidden) } // SetFromFlags sets the MACSettings message from flags. @@ -1847,6 +2213,26 @@ func (m *MACSettings) SetFromFlags(flags *pflag.FlagSet, prefix string) (paths [ paths = append(paths, setPaths...) } } + if changed := flagsplugin.IsAnyPrefixSet(flags, flagsplugin.Prefix("relay", prefix)); changed { + if m.Relay == nil { + m.Relay = &RelayParameters{} + } + if setPaths, err := m.Relay.SetFromFlags(flags, flagsplugin.Prefix("relay", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, setPaths...) + } + } + if changed := flagsplugin.IsAnyPrefixSet(flags, flagsplugin.Prefix("desired_relay", prefix)); changed { + if m.DesiredRelay == nil { + m.DesiredRelay = &RelayParameters{} + } + if setPaths, err := m.DesiredRelay.SetFromFlags(flags, flagsplugin.Prefix("desired_relay", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, setPaths...) + } + } return paths, nil } @@ -2156,6 +2542,8 @@ func AddSelectFlagsForMACState(flags *pflag.FlagSet, prefix string, hidden bool) flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("rejected-data-rate-ranges", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("rejected-data-rate-ranges", prefix), false), flagsplugin.WithHidden(hidden))) flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("last-adr-change-f-cnt-up", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("last-adr-change-f-cnt-up", prefix), false), flagsplugin.WithHidden(hidden))) flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("recent-mac-command-identifiers", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("recent-mac-command-identifiers", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("pending-relay-downlink", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("pending-relay-downlink", prefix), true), flagsplugin.WithHidden(hidden))) + AddSelectFlagsForRelayForwardDownlinkReq(flags, flagsplugin.Prefix("pending-relay-downlink", prefix), hidden) } // SelectFromFlags outputs the fieldmask paths forMACState message from select flags. @@ -2305,6 +2693,16 @@ func PathsFromSelectFlagsForMACState(flags *pflag.FlagSet, prefix string) (paths } else if selected && val { paths = append(paths, flagsplugin.Prefix("recent_mac_command_identifiers", prefix)) } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("pending_relay_downlink", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("pending_relay_downlink", prefix)) + } + if selectPaths, err := PathsFromSelectFlagsForRelayForwardDownlinkReq(flags, flagsplugin.Prefix("pending_relay_downlink", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, selectPaths...) + } return paths, nil } @@ -2334,6 +2732,7 @@ func AddSetFlagsForMACState(flags *pflag.FlagSet, prefix string, hidden bool) { // FIXME: Skipping RejectedDataRateRanges because maps with uint64 key types are currently not supported. flags.AddFlag(flagsplugin.NewUint32Flag(flagsplugin.Prefix("last-adr-change-f-cnt-up", prefix), "", flagsplugin.WithHidden(hidden))) flags.AddFlag(flagsplugin.NewStringSliceFlag(flagsplugin.Prefix("recent-mac-command-identifiers", prefix), flagsplugin.EnumValueDesc(MACCommandIdentifier_value), flagsplugin.WithHidden(hidden))) + AddSetFlagsForRelayForwardDownlinkReq(flags, flagsplugin.Prefix("pending-relay-downlink", prefix), hidden) } // SetFromFlags sets the MACState message from flags. @@ -2497,6 +2896,16 @@ func (m *MACState) SetFromFlags(flags *pflag.FlagSet, prefix string) (paths []st } paths = append(paths, flagsplugin.Prefix("recent_mac_command_identifiers", prefix)) } + if changed := flagsplugin.IsAnyPrefixSet(flags, flagsplugin.Prefix("pending_relay_downlink", prefix)); changed { + if m.PendingRelayDownlink == nil { + m.PendingRelayDownlink = &RelayForwardDownlinkReq{} + } + if setPaths, err := m.PendingRelayDownlink.SetFromFlags(flags, flagsplugin.Prefix("pending_relay_downlink", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, setPaths...) + } + } return paths, nil } diff --git a/pkg/ttnpb/end_device_json.pb.go b/pkg/ttnpb/end_device_json.pb.go index 51fdb9c4d7..071761ae40 100644 --- a/pkg/ttnpb/end_device_json.pb.go +++ b/pkg/ttnpb/end_device_json.pb.go @@ -224,6 +224,446 @@ func (x *BoolValue) UnmarshalJSON(b []byte) error { return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) } +// MarshalProtoJSON marshals the ServingRelayParameters_UplinkForwardingRule message to JSON. +func (x *ServingRelayParameters_UplinkForwardingRule) MarshalProtoJSON(s *jsonplugin.MarshalState) { + if x == nil { + s.WriteNil() + return + } + s.WriteObjectStart() + var wroteField bool + if x.Limits != nil || s.HasField("limits") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("limits") + x.Limits.MarshalProtoJSON(s.WithField("limits")) + } + if x.LastWFCnt != 0 || s.HasField("last_w_f_cnt") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("last_w_f_cnt") + s.WriteUint32(x.LastWFCnt) + } + if x.DeviceId != "" || s.HasField("device_id") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("device_id") + s.WriteString(x.DeviceId) + } + if len(x.SessionKeyId) > 0 || s.HasField("session_key_id") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("session_key_id") + s.WriteBytes(x.SessionKeyId) + } + s.WriteObjectEnd() +} + +// MarshalJSON marshals the ServingRelayParameters_UplinkForwardingRule to JSON. +func (x *ServingRelayParameters_UplinkForwardingRule) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// UnmarshalProtoJSON unmarshals the ServingRelayParameters_UplinkForwardingRule message from JSON. +func (x *ServingRelayParameters_UplinkForwardingRule) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + if s.ReadNil() { + return + } + s.ReadObject(func(key string) { + switch key { + default: + s.ReadAny() // ignore unknown field + case "limits": + if s.ReadNil() { + x.Limits = nil + return + } + x.Limits = &RelayUplinkForwardLimits{} + x.Limits.UnmarshalProtoJSON(s.WithField("limits", true)) + case "last_w_f_cnt", "lastWFCnt": + s.AddField("last_w_f_cnt") + x.LastWFCnt = s.ReadUint32() + case "device_id", "deviceId": + s.AddField("device_id") + x.DeviceId = s.ReadString() + case "session_key_id", "sessionKeyId": + s.AddField("session_key_id") + x.SessionKeyId = s.ReadBytes() + } + }) +} + +// UnmarshalJSON unmarshals the ServingRelayParameters_UplinkForwardingRule from JSON. +func (x *ServingRelayParameters_UplinkForwardingRule) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the ServingRelayParameters_ForwardingLimits message to JSON. +func (x *ServingRelayParameters_ForwardingLimits) MarshalProtoJSON(s *jsonplugin.MarshalState) { + if x == nil { + s.WriteNil() + return + } + s.WriteObjectStart() + var wroteField bool + if x.ResetBehavior != 0 || s.HasField("reset_behavior") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("reset_behavior") + x.ResetBehavior.MarshalProtoJSON(s) + } + if x.JoinRequests != nil || s.HasField("join_requests") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("join_requests") + x.JoinRequests.MarshalProtoJSON(s.WithField("join_requests")) + } + if x.Notifications != nil || s.HasField("notifications") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("notifications") + x.Notifications.MarshalProtoJSON(s.WithField("notifications")) + } + if x.UplinkMessages != nil || s.HasField("uplink_messages") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("uplink_messages") + x.UplinkMessages.MarshalProtoJSON(s.WithField("uplink_messages")) + } + if x.Overall != nil || s.HasField("overall") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("overall") + x.Overall.MarshalProtoJSON(s.WithField("overall")) + } + s.WriteObjectEnd() +} + +// MarshalJSON marshals the ServingRelayParameters_ForwardingLimits to JSON. +func (x *ServingRelayParameters_ForwardingLimits) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// UnmarshalProtoJSON unmarshals the ServingRelayParameters_ForwardingLimits message from JSON. +func (x *ServingRelayParameters_ForwardingLimits) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + if s.ReadNil() { + return + } + s.ReadObject(func(key string) { + switch key { + default: + s.ReadAny() // ignore unknown field + case "reset_behavior", "resetBehavior": + s.AddField("reset_behavior") + x.ResetBehavior.UnmarshalProtoJSON(s) + case "join_requests", "joinRequests": + if s.ReadNil() { + x.JoinRequests = nil + return + } + x.JoinRequests = &RelayForwardLimits{} + x.JoinRequests.UnmarshalProtoJSON(s.WithField("join_requests", true)) + case "notifications": + if s.ReadNil() { + x.Notifications = nil + return + } + x.Notifications = &RelayForwardLimits{} + x.Notifications.UnmarshalProtoJSON(s.WithField("notifications", true)) + case "uplink_messages", "uplinkMessages": + if s.ReadNil() { + x.UplinkMessages = nil + return + } + x.UplinkMessages = &RelayForwardLimits{} + x.UplinkMessages.UnmarshalProtoJSON(s.WithField("uplink_messages", true)) + case "overall": + if s.ReadNil() { + x.Overall = nil + return + } + x.Overall = &RelayForwardLimits{} + x.Overall.UnmarshalProtoJSON(s.WithField("overall", true)) + } + }) +} + +// UnmarshalJSON unmarshals the ServingRelayParameters_ForwardingLimits from JSON. +func (x *ServingRelayParameters_ForwardingLimits) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the ServingRelayParameters message to JSON. +func (x *ServingRelayParameters) MarshalProtoJSON(s *jsonplugin.MarshalState) { + if x == nil { + s.WriteNil() + return + } + s.WriteObjectStart() + var wroteField bool + if x.SecondChannel != nil || s.HasField("second_channel") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("second_channel") + x.SecondChannel.MarshalProtoJSON(s.WithField("second_channel")) + } + if x.DefaultChannelIndex != 0 || s.HasField("default_channel_index") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("default_channel_index") + s.WriteUint32(x.DefaultChannelIndex) + } + if x.CadPeriodicity != 0 || s.HasField("cad_periodicity") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("cad_periodicity") + x.CadPeriodicity.MarshalProtoJSON(s) + } + if len(x.UplinkForwardingRules) > 0 || s.HasField("uplink_forwarding_rules") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("uplink_forwarding_rules") + s.WriteArrayStart() + var wroteElement bool + for _, element := range x.UplinkForwardingRules { + s.WriteMoreIf(&wroteElement) + element.MarshalProtoJSON(s.WithField("uplink_forwarding_rules")) + } + s.WriteArrayEnd() + } + if x.Limits != nil || s.HasField("limits") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("limits") + x.Limits.MarshalProtoJSON(s.WithField("limits")) + } + s.WriteObjectEnd() +} + +// MarshalJSON marshals the ServingRelayParameters to JSON. +func (x *ServingRelayParameters) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// UnmarshalProtoJSON unmarshals the ServingRelayParameters message from JSON. +func (x *ServingRelayParameters) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + if s.ReadNil() { + return + } + s.ReadObject(func(key string) { + switch key { + default: + s.ReadAny() // ignore unknown field + case "second_channel", "secondChannel": + if s.ReadNil() { + x.SecondChannel = nil + return + } + x.SecondChannel = &RelaySecondChannel{} + x.SecondChannel.UnmarshalProtoJSON(s.WithField("second_channel", true)) + case "default_channel_index", "defaultChannelIndex": + s.AddField("default_channel_index") + x.DefaultChannelIndex = s.ReadUint32() + case "cad_periodicity", "cadPeriodicity": + s.AddField("cad_periodicity") + x.CadPeriodicity.UnmarshalProtoJSON(s) + case "uplink_forwarding_rules", "uplinkForwardingRules": + s.AddField("uplink_forwarding_rules") + if s.ReadNil() { + x.UplinkForwardingRules = nil + return + } + s.ReadArray(func() { + if s.ReadNil() { + x.UplinkForwardingRules = append(x.UplinkForwardingRules, nil) + return + } + v := &ServingRelayParameters_UplinkForwardingRule{} + v.UnmarshalProtoJSON(s.WithField("uplink_forwarding_rules", false)) + if s.Err() != nil { + return + } + x.UplinkForwardingRules = append(x.UplinkForwardingRules, v) + }) + case "limits": + if s.ReadNil() { + x.Limits = nil + return + } + x.Limits = &ServingRelayParameters_ForwardingLimits{} + x.Limits.UnmarshalProtoJSON(s.WithField("limits", true)) + } + }) +} + +// UnmarshalJSON unmarshals the ServingRelayParameters from JSON. +func (x *ServingRelayParameters) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the ServedRelayParameters message to JSON. +func (x *ServedRelayParameters) MarshalProtoJSON(s *jsonplugin.MarshalState) { + if x == nil { + s.WriteNil() + return + } + s.WriteObjectStart() + var wroteField bool + if x.Mode != nil { + switch ov := x.Mode.(type) { + case *ServedRelayParameters_Always: + s.WriteMoreIf(&wroteField) + s.WriteObjectField("always") + // NOTE: RelayEndDeviceAlwaysMode does not seem to implement MarshalProtoJSON. + golang.MarshalMessage(s, ov.Always) + case *ServedRelayParameters_Dynamic: + s.WriteMoreIf(&wroteField) + s.WriteObjectField("dynamic") + ov.Dynamic.MarshalProtoJSON(s.WithField("dynamic")) + case *ServedRelayParameters_EndDeviceControlled: + s.WriteMoreIf(&wroteField) + s.WriteObjectField("end_device_controlled") + // NOTE: RelayEndDeviceControlledMode does not seem to implement MarshalProtoJSON. + golang.MarshalMessage(s, ov.EndDeviceControlled) + } + } + if x.Backoff != 0 || s.HasField("backoff") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("backoff") + s.WriteUint32(x.Backoff) + } + if x.SecondChannel != nil || s.HasField("second_channel") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("second_channel") + x.SecondChannel.MarshalProtoJSON(s.WithField("second_channel")) + } + if x.ServingDeviceId != "" || s.HasField("serving_device_id") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("serving_device_id") + s.WriteString(x.ServingDeviceId) + } + s.WriteObjectEnd() +} + +// MarshalJSON marshals the ServedRelayParameters to JSON. +func (x *ServedRelayParameters) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// UnmarshalProtoJSON unmarshals the ServedRelayParameters message from JSON. +func (x *ServedRelayParameters) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + if s.ReadNil() { + return + } + s.ReadObject(func(key string) { + switch key { + default: + s.ReadAny() // ignore unknown field + case "always": + s.AddField("always") + ov := &ServedRelayParameters_Always{} + x.Mode = ov + if s.ReadNil() { + ov.Always = nil + return + } + // NOTE: RelayEndDeviceAlwaysMode does not seem to implement UnmarshalProtoJSON. + var v RelayEndDeviceAlwaysMode + golang.UnmarshalMessage(s, &v) + ov.Always = &v + case "dynamic": + ov := &ServedRelayParameters_Dynamic{} + x.Mode = ov + if s.ReadNil() { + ov.Dynamic = nil + return + } + ov.Dynamic = &RelayEndDeviceDynamicMode{} + ov.Dynamic.UnmarshalProtoJSON(s.WithField("dynamic", true)) + case "end_device_controlled", "endDeviceControlled": + s.AddField("end_device_controlled") + ov := &ServedRelayParameters_EndDeviceControlled{} + x.Mode = ov + if s.ReadNil() { + ov.EndDeviceControlled = nil + return + } + // NOTE: RelayEndDeviceControlledMode does not seem to implement UnmarshalProtoJSON. + var v RelayEndDeviceControlledMode + golang.UnmarshalMessage(s, &v) + ov.EndDeviceControlled = &v + case "backoff": + s.AddField("backoff") + x.Backoff = s.ReadUint32() + case "second_channel", "secondChannel": + if s.ReadNil() { + x.SecondChannel = nil + return + } + x.SecondChannel = &RelaySecondChannel{} + x.SecondChannel.UnmarshalProtoJSON(s.WithField("second_channel", true)) + case "serving_device_id", "servingDeviceId": + s.AddField("serving_device_id") + x.ServingDeviceId = s.ReadString() + } + }) +} + +// UnmarshalJSON unmarshals the ServedRelayParameters from JSON. +func (x *ServedRelayParameters) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the RelayParameters message to JSON. +func (x *RelayParameters) MarshalProtoJSON(s *jsonplugin.MarshalState) { + if x == nil { + s.WriteNil() + return + } + s.WriteObjectStart() + var wroteField bool + if x.Mode != nil { + switch ov := x.Mode.(type) { + case *RelayParameters_Serving: + s.WriteMoreIf(&wroteField) + s.WriteObjectField("serving") + ov.Serving.MarshalProtoJSON(s.WithField("serving")) + case *RelayParameters_Served: + s.WriteMoreIf(&wroteField) + s.WriteObjectField("served") + ov.Served.MarshalProtoJSON(s.WithField("served")) + } + } + s.WriteObjectEnd() +} + +// MarshalJSON marshals the RelayParameters to JSON. +func (x *RelayParameters) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// UnmarshalProtoJSON unmarshals the RelayParameters message from JSON. +func (x *RelayParameters) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + if s.ReadNil() { + return + } + s.ReadObject(func(key string) { + switch key { + default: + s.ReadAny() // ignore unknown field + case "serving": + ov := &RelayParameters_Serving{} + x.Mode = ov + if s.ReadNil() { + ov.Serving = nil + return + } + ov.Serving = &ServingRelayParameters{} + ov.Serving.UnmarshalProtoJSON(s.WithField("serving", true)) + case "served": + ov := &RelayParameters_Served{} + x.Mode = ov + if s.ReadNil() { + ov.Served = nil + return + } + ov.Served = &ServedRelayParameters{} + ov.Served.UnmarshalProtoJSON(s.WithField("served", true)) + } + }) +} + +// UnmarshalJSON unmarshals the RelayParameters from JSON. +func (x *RelayParameters) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + // MarshalProtoJSON marshals the MACParameters_Channel message to JSON. func (x *MACParameters_Channel) MarshalProtoJSON(s *jsonplugin.MarshalState) { if x == nil { @@ -422,6 +862,11 @@ func (x *MACParameters) MarshalProtoJSON(s *jsonplugin.MarshalState) { s.WriteObjectField("ping_slot_data_rate_index_value") x.PingSlotDataRateIndexValue.MarshalProtoJSON(s.WithField("ping_slot_data_rate_index_value")) } + if x.Relay != nil || s.HasField("relay") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("relay") + x.Relay.MarshalProtoJSON(s.WithField("relay")) + } s.WriteObjectEnd() } @@ -545,6 +990,13 @@ func (x *MACParameters) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { } x.PingSlotDataRateIndexValue = &DataRateIndexValue{} x.PingSlotDataRateIndexValue.UnmarshalProtoJSON(s.WithField("ping_slot_data_rate_index_value", false)) + case "relay": + if s.ReadNil() { + x.Relay = nil + return + } + x.Relay = &RelayParameters{} + x.Relay.UnmarshalProtoJSON(s.WithField("relay", true)) } }) } @@ -1229,6 +1681,16 @@ func (x *MACSettings) MarshalProtoJSON(s *jsonplugin.MarshalState) { s.WriteObjectField("schedule_downlinks") x.ScheduleDownlinks.MarshalProtoJSON(s.WithField("schedule_downlinks")) } + if x.Relay != nil || s.HasField("relay") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("relay") + x.Relay.MarshalProtoJSON(s.WithField("relay")) + } + if x.DesiredRelay != nil || s.HasField("desired_relay") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("desired_relay") + x.DesiredRelay.MarshalProtoJSON(s.WithField("desired_relay")) + } s.WriteObjectEnd() } @@ -1534,6 +1996,20 @@ func (x *MACSettings) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { } x.ScheduleDownlinks = &BoolValue{} x.ScheduleDownlinks.UnmarshalProtoJSON(s.WithField("schedule_downlinks", false)) + case "relay": + if s.ReadNil() { + x.Relay = nil + return + } + x.Relay = &RelayParameters{} + x.Relay.UnmarshalProtoJSON(s.WithField("relay", true)) + case "desired_relay", "desiredRelay": + if s.ReadNil() { + x.DesiredRelay = nil + return + } + x.DesiredRelay = &RelayParameters{} + x.DesiredRelay.UnmarshalProtoJSON(s.WithField("desired_relay", true)) } }) } @@ -1742,6 +2218,12 @@ func (x *MACState_UplinkMessage_RxMetadata) MarshalProtoJSON(s *jsonplugin.Marsh // NOTE: MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata does not seem to implement MarshalProtoJSON. golang.MarshalMessage(s, x.PacketBroker) } + if x.Relay != nil || s.HasField("relay") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("relay") + // NOTE: MACState_UplinkMessage_RxMetadata_RelayMetadata does not seem to implement MarshalProtoJSON. + golang.MarshalMessage(s, x.Relay) + } s.WriteObjectEnd() } @@ -1788,6 +2270,16 @@ func (x *MACState_UplinkMessage_RxMetadata) UnmarshalProtoJSON(s *jsonplugin.Unm var v MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata golang.UnmarshalMessage(s, &v) x.PacketBroker = &v + case "relay": + s.AddField("relay") + if s.ReadNil() { + x.Relay = nil + return + } + // NOTE: MACState_UplinkMessage_RxMetadata_RelayMetadata does not seem to implement UnmarshalProtoJSON. + var v MACState_UplinkMessage_RxMetadata_RelayMetadata + golang.UnmarshalMessage(s, &v) + x.Relay = &v } }) } @@ -2381,6 +2873,12 @@ func (x *MACState) MarshalProtoJSON(s *jsonplugin.MarshalState) { } s.WriteArrayEnd() } + if x.PendingRelayDownlink != nil || s.HasField("pending_relay_downlink") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("pending_relay_downlink") + // NOTE: RelayForwardDownlinkReq does not seem to implement MarshalProtoJSON. + golang.MarshalMessage(s, x.PendingRelayDownlink) + } s.WriteObjectEnd() } @@ -2609,6 +3107,16 @@ func (x *MACState) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { v.UnmarshalProtoJSON(s) x.RecentMacCommandIdentifiers = append(x.RecentMacCommandIdentifiers, v) }) + case "pending_relay_downlink", "pendingRelayDownlink": + s.AddField("pending_relay_downlink") + if s.ReadNil() { + x.PendingRelayDownlink = nil + return + } + // NOTE: RelayForwardDownlinkReq does not seem to implement UnmarshalProtoJSON. + var v RelayForwardDownlinkReq + golang.UnmarshalMessage(s, &v) + x.PendingRelayDownlink = &v } }) } diff --git a/pkg/ttnpb/field_mask_validation.go b/pkg/ttnpb/field_mask_validation.go index 7ab678dea1..fa39c8db22 100644 --- a/pkg/ttnpb/field_mask_validation.go +++ b/pkg/ttnpb/field_mask_validation.go @@ -148,6 +148,42 @@ var nsEndDeviceReadFieldPaths = [...]string{ "mac_settings.desired_ping_slot_data_rate_index.value", "mac_settings.desired_ping_slot_frequency", "mac_settings.desired_ping_slot_frequency.value", + "mac_settings.desired_relay", + "mac_settings.desired_relay.mode", + "mac_settings.desired_relay.mode.served", + "mac_settings.desired_relay.mode.served.backoff", + "mac_settings.desired_relay.mode.served.mode", + "mac_settings.desired_relay.mode.served.mode.always", + "mac_settings.desired_relay.mode.served.mode.dynamic", + "mac_settings.desired_relay.mode.served.mode.dynamic.smart_enable_level", + "mac_settings.desired_relay.mode.served.mode.end_device_controlled", + "mac_settings.desired_relay.mode.served.second_channel", + "mac_settings.desired_relay.mode.served.second_channel.ack_offset", + "mac_settings.desired_relay.mode.served.second_channel.data_rate_index", + "mac_settings.desired_relay.mode.served.second_channel.frequency", + "mac_settings.desired_relay.mode.served.serving_device_id", + "mac_settings.desired_relay.mode.serving", + "mac_settings.desired_relay.mode.serving.cad_periodicity", + "mac_settings.desired_relay.mode.serving.default_channel_index", + "mac_settings.desired_relay.mode.serving.limits", + "mac_settings.desired_relay.mode.serving.limits.join_requests", + "mac_settings.desired_relay.mode.serving.limits.join_requests.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.join_requests.reload_rate", + "mac_settings.desired_relay.mode.serving.limits.notifications", + "mac_settings.desired_relay.mode.serving.limits.notifications.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.notifications.reload_rate", + "mac_settings.desired_relay.mode.serving.limits.overall", + "mac_settings.desired_relay.mode.serving.limits.overall.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.overall.reload_rate", + "mac_settings.desired_relay.mode.serving.limits.reset_behavior", + "mac_settings.desired_relay.mode.serving.limits.uplink_messages", + "mac_settings.desired_relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_settings.desired_relay.mode.serving.second_channel", + "mac_settings.desired_relay.mode.serving.second_channel.ack_offset", + "mac_settings.desired_relay.mode.serving.second_channel.data_rate_index", + "mac_settings.desired_relay.mode.serving.second_channel.frequency", + "mac_settings.desired_relay.mode.serving.uplink_forwarding_rules", "mac_settings.desired_rx1_data_rate_offset", "mac_settings.desired_rx1_data_rate_offset.value", "mac_settings.desired_rx1_delay", @@ -165,6 +201,42 @@ var nsEndDeviceReadFieldPaths = [...]string{ "mac_settings.ping_slot_frequency.value", "mac_settings.ping_slot_periodicity", "mac_settings.ping_slot_periodicity.value", + "mac_settings.relay", + "mac_settings.relay.mode", + "mac_settings.relay.mode.served", + "mac_settings.relay.mode.served.backoff", + "mac_settings.relay.mode.served.mode", + "mac_settings.relay.mode.served.mode.always", + "mac_settings.relay.mode.served.mode.dynamic", + "mac_settings.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_settings.relay.mode.served.mode.end_device_controlled", + "mac_settings.relay.mode.served.second_channel", + "mac_settings.relay.mode.served.second_channel.ack_offset", + "mac_settings.relay.mode.served.second_channel.data_rate_index", + "mac_settings.relay.mode.served.second_channel.frequency", + "mac_settings.relay.mode.served.serving_device_id", + "mac_settings.relay.mode.serving", + "mac_settings.relay.mode.serving.cad_periodicity", + "mac_settings.relay.mode.serving.default_channel_index", + "mac_settings.relay.mode.serving.limits", + "mac_settings.relay.mode.serving.limits.join_requests", + "mac_settings.relay.mode.serving.limits.join_requests.bucket_size", + "mac_settings.relay.mode.serving.limits.join_requests.reload_rate", + "mac_settings.relay.mode.serving.limits.notifications", + "mac_settings.relay.mode.serving.limits.notifications.bucket_size", + "mac_settings.relay.mode.serving.limits.notifications.reload_rate", + "mac_settings.relay.mode.serving.limits.overall", + "mac_settings.relay.mode.serving.limits.overall.bucket_size", + "mac_settings.relay.mode.serving.limits.overall.reload_rate", + "mac_settings.relay.mode.serving.limits.reset_behavior", + "mac_settings.relay.mode.serving.limits.uplink_messages", + "mac_settings.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_settings.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_settings.relay.mode.serving.second_channel", + "mac_settings.relay.mode.serving.second_channel.ack_offset", + "mac_settings.relay.mode.serving.second_channel.data_rate_index", + "mac_settings.relay.mode.serving.second_channel.frequency", + "mac_settings.relay.mode.serving.uplink_forwarding_rules", "mac_settings.resets_f_cnt", "mac_settings.resets_f_cnt.value", "mac_settings.rx1_data_rate_offset", @@ -207,6 +279,42 @@ var nsEndDeviceReadFieldPaths = [...]string{ "mac_state.current_parameters.ping_slot_frequency", "mac_state.current_parameters.rejoin_count_periodicity", "mac_state.current_parameters.rejoin_time_periodicity", + "mac_state.current_parameters.relay", + "mac_state.current_parameters.relay.mode", + "mac_state.current_parameters.relay.mode.served", + "mac_state.current_parameters.relay.mode.served.backoff", + "mac_state.current_parameters.relay.mode.served.mode", + "mac_state.current_parameters.relay.mode.served.mode.always", + "mac_state.current_parameters.relay.mode.served.mode.dynamic", + "mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "mac_state.current_parameters.relay.mode.served.second_channel", + "mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "mac_state.current_parameters.relay.mode.served.serving_device_id", + "mac_state.current_parameters.relay.mode.serving", + "mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "mac_state.current_parameters.relay.mode.serving.default_channel_index", + "mac_state.current_parameters.relay.mode.serving.limits", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.notifications", + "mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.overall", + "mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_state.current_parameters.relay.mode.serving.second_channel", + "mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "mac_state.current_parameters.rx1_data_rate_offset", "mac_state.current_parameters.rx1_delay", "mac_state.current_parameters.rx2_data_rate_index", @@ -232,6 +340,42 @@ var nsEndDeviceReadFieldPaths = [...]string{ "mac_state.desired_parameters.ping_slot_frequency", "mac_state.desired_parameters.rejoin_count_periodicity", "mac_state.desired_parameters.rejoin_time_periodicity", + "mac_state.desired_parameters.relay", + "mac_state.desired_parameters.relay.mode", + "mac_state.desired_parameters.relay.mode.served", + "mac_state.desired_parameters.relay.mode.served.backoff", + "mac_state.desired_parameters.relay.mode.served.mode", + "mac_state.desired_parameters.relay.mode.served.mode.always", + "mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "mac_state.desired_parameters.relay.mode.served.second_channel", + "mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "mac_state.desired_parameters.relay.mode.served.serving_device_id", + "mac_state.desired_parameters.relay.mode.serving", + "mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "mac_state.desired_parameters.relay.mode.serving.limits", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.overall", + "mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.second_channel", + "mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "mac_state.desired_parameters.rx1_data_rate_offset", "mac_state.desired_parameters.rx1_delay", "mac_state.desired_parameters.rx2_data_rate_index", @@ -256,6 +400,8 @@ var nsEndDeviceReadFieldPaths = [...]string{ "mac_state.pending_application_downlink.frm_payload", "mac_state.pending_application_downlink.priority", "mac_state.pending_application_downlink.session_key_id", + "mac_state.pending_relay_downlink", + "mac_state.pending_relay_downlink.raw_payload", "mac_state.pending_requests", "mac_state.ping_slot_periodicity", "mac_state.ping_slot_periodicity.value", @@ -291,6 +437,42 @@ var nsEndDeviceReadFieldPaths = [...]string{ "pending_mac_state.current_parameters.ping_slot_frequency", "pending_mac_state.current_parameters.rejoin_count_periodicity", "pending_mac_state.current_parameters.rejoin_time_periodicity", + "pending_mac_state.current_parameters.relay", + "pending_mac_state.current_parameters.relay.mode", + "pending_mac_state.current_parameters.relay.mode.served", + "pending_mac_state.current_parameters.relay.mode.served.backoff", + "pending_mac_state.current_parameters.relay.mode.served.mode", + "pending_mac_state.current_parameters.relay.mode.served.mode.always", + "pending_mac_state.current_parameters.relay.mode.served.mode.dynamic", + "pending_mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "pending_mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "pending_mac_state.current_parameters.relay.mode.served.second_channel", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "pending_mac_state.current_parameters.relay.mode.served.serving_device_id", + "pending_mac_state.current_parameters.relay.mode.serving", + "pending_mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "pending_mac_state.current_parameters.relay.mode.serving.default_channel_index", + "pending_mac_state.current_parameters.relay.mode.serving.limits", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "pending_mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "pending_mac_state.current_parameters.rx1_data_rate_offset", "pending_mac_state.current_parameters.rx1_delay", "pending_mac_state.current_parameters.rx2_data_rate_index", @@ -316,6 +498,42 @@ var nsEndDeviceReadFieldPaths = [...]string{ "pending_mac_state.desired_parameters.ping_slot_frequency", "pending_mac_state.desired_parameters.rejoin_count_periodicity", "pending_mac_state.desired_parameters.rejoin_time_periodicity", + "pending_mac_state.desired_parameters.relay", + "pending_mac_state.desired_parameters.relay.mode", + "pending_mac_state.desired_parameters.relay.mode.served", + "pending_mac_state.desired_parameters.relay.mode.served.backoff", + "pending_mac_state.desired_parameters.relay.mode.served.mode", + "pending_mac_state.desired_parameters.relay.mode.served.mode.always", + "pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "pending_mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "pending_mac_state.desired_parameters.relay.mode.served.serving_device_id", + "pending_mac_state.desired_parameters.relay.mode.serving", + "pending_mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "pending_mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "pending_mac_state.desired_parameters.relay.mode.serving.limits", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "pending_mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "pending_mac_state.desired_parameters.rx1_data_rate_offset", "pending_mac_state.desired_parameters.rx1_delay", "pending_mac_state.desired_parameters.rx2_data_rate_index", @@ -792,6 +1010,42 @@ var RPCFieldMaskPaths = map[string]RPCFieldMaskPathValue{ "mac_settings.desired_ping_slot_data_rate_index.value", "mac_settings.desired_ping_slot_frequency", "mac_settings.desired_ping_slot_frequency.value", + "mac_settings.desired_relay", + "mac_settings.desired_relay.mode", + "mac_settings.desired_relay.mode.served", + "mac_settings.desired_relay.mode.served.backoff", + "mac_settings.desired_relay.mode.served.mode", + "mac_settings.desired_relay.mode.served.mode.always", + "mac_settings.desired_relay.mode.served.mode.dynamic", + "mac_settings.desired_relay.mode.served.mode.dynamic.smart_enable_level", + "mac_settings.desired_relay.mode.served.mode.end_device_controlled", + "mac_settings.desired_relay.mode.served.second_channel", + "mac_settings.desired_relay.mode.served.second_channel.ack_offset", + "mac_settings.desired_relay.mode.served.second_channel.data_rate_index", + "mac_settings.desired_relay.mode.served.second_channel.frequency", + "mac_settings.desired_relay.mode.served.serving_device_id", + "mac_settings.desired_relay.mode.serving", + "mac_settings.desired_relay.mode.serving.cad_periodicity", + "mac_settings.desired_relay.mode.serving.default_channel_index", + "mac_settings.desired_relay.mode.serving.limits", + "mac_settings.desired_relay.mode.serving.limits.join_requests", + "mac_settings.desired_relay.mode.serving.limits.join_requests.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.join_requests.reload_rate", + "mac_settings.desired_relay.mode.serving.limits.notifications", + "mac_settings.desired_relay.mode.serving.limits.notifications.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.notifications.reload_rate", + "mac_settings.desired_relay.mode.serving.limits.overall", + "mac_settings.desired_relay.mode.serving.limits.overall.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.overall.reload_rate", + "mac_settings.desired_relay.mode.serving.limits.reset_behavior", + "mac_settings.desired_relay.mode.serving.limits.uplink_messages", + "mac_settings.desired_relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_settings.desired_relay.mode.serving.second_channel", + "mac_settings.desired_relay.mode.serving.second_channel.ack_offset", + "mac_settings.desired_relay.mode.serving.second_channel.data_rate_index", + "mac_settings.desired_relay.mode.serving.second_channel.frequency", + "mac_settings.desired_relay.mode.serving.uplink_forwarding_rules", "mac_settings.desired_rx1_data_rate_offset", "mac_settings.desired_rx1_data_rate_offset.value", "mac_settings.desired_rx1_delay", @@ -809,6 +1063,42 @@ var RPCFieldMaskPaths = map[string]RPCFieldMaskPathValue{ "mac_settings.ping_slot_frequency.value", "mac_settings.ping_slot_periodicity", "mac_settings.ping_slot_periodicity.value", + "mac_settings.relay", + "mac_settings.relay.mode", + "mac_settings.relay.mode.served", + "mac_settings.relay.mode.served.backoff", + "mac_settings.relay.mode.served.mode", + "mac_settings.relay.mode.served.mode.always", + "mac_settings.relay.mode.served.mode.dynamic", + "mac_settings.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_settings.relay.mode.served.mode.end_device_controlled", + "mac_settings.relay.mode.served.second_channel", + "mac_settings.relay.mode.served.second_channel.ack_offset", + "mac_settings.relay.mode.served.second_channel.data_rate_index", + "mac_settings.relay.mode.served.second_channel.frequency", + "mac_settings.relay.mode.served.serving_device_id", + "mac_settings.relay.mode.serving", + "mac_settings.relay.mode.serving.cad_periodicity", + "mac_settings.relay.mode.serving.default_channel_index", + "mac_settings.relay.mode.serving.limits", + "mac_settings.relay.mode.serving.limits.join_requests", + "mac_settings.relay.mode.serving.limits.join_requests.bucket_size", + "mac_settings.relay.mode.serving.limits.join_requests.reload_rate", + "mac_settings.relay.mode.serving.limits.notifications", + "mac_settings.relay.mode.serving.limits.notifications.bucket_size", + "mac_settings.relay.mode.serving.limits.notifications.reload_rate", + "mac_settings.relay.mode.serving.limits.overall", + "mac_settings.relay.mode.serving.limits.overall.bucket_size", + "mac_settings.relay.mode.serving.limits.overall.reload_rate", + "mac_settings.relay.mode.serving.limits.reset_behavior", + "mac_settings.relay.mode.serving.limits.uplink_messages", + "mac_settings.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_settings.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_settings.relay.mode.serving.second_channel", + "mac_settings.relay.mode.serving.second_channel.ack_offset", + "mac_settings.relay.mode.serving.second_channel.data_rate_index", + "mac_settings.relay.mode.serving.second_channel.frequency", + "mac_settings.relay.mode.serving.uplink_forwarding_rules", "mac_settings.resets_f_cnt", "mac_settings.resets_f_cnt.value", "mac_settings.rx1_data_rate_offset", @@ -851,6 +1141,42 @@ var RPCFieldMaskPaths = map[string]RPCFieldMaskPathValue{ "mac_state.current_parameters.ping_slot_frequency", "mac_state.current_parameters.rejoin_count_periodicity", "mac_state.current_parameters.rejoin_time_periodicity", + "mac_state.current_parameters.relay", + "mac_state.current_parameters.relay.mode", + "mac_state.current_parameters.relay.mode.served", + "mac_state.current_parameters.relay.mode.served.backoff", + "mac_state.current_parameters.relay.mode.served.mode", + "mac_state.current_parameters.relay.mode.served.mode.always", + "mac_state.current_parameters.relay.mode.served.mode.dynamic", + "mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "mac_state.current_parameters.relay.mode.served.second_channel", + "mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "mac_state.current_parameters.relay.mode.served.serving_device_id", + "mac_state.current_parameters.relay.mode.serving", + "mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "mac_state.current_parameters.relay.mode.serving.default_channel_index", + "mac_state.current_parameters.relay.mode.serving.limits", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.notifications", + "mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.overall", + "mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_state.current_parameters.relay.mode.serving.second_channel", + "mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "mac_state.current_parameters.rx1_data_rate_offset", "mac_state.current_parameters.rx1_delay", "mac_state.current_parameters.rx2_data_rate_index", @@ -876,6 +1202,42 @@ var RPCFieldMaskPaths = map[string]RPCFieldMaskPathValue{ "mac_state.desired_parameters.ping_slot_frequency", "mac_state.desired_parameters.rejoin_count_periodicity", "mac_state.desired_parameters.rejoin_time_periodicity", + "mac_state.desired_parameters.relay", + "mac_state.desired_parameters.relay.mode", + "mac_state.desired_parameters.relay.mode.served", + "mac_state.desired_parameters.relay.mode.served.backoff", + "mac_state.desired_parameters.relay.mode.served.mode", + "mac_state.desired_parameters.relay.mode.served.mode.always", + "mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "mac_state.desired_parameters.relay.mode.served.second_channel", + "mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "mac_state.desired_parameters.relay.mode.served.serving_device_id", + "mac_state.desired_parameters.relay.mode.serving", + "mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "mac_state.desired_parameters.relay.mode.serving.limits", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.overall", + "mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.second_channel", + "mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "mac_state.desired_parameters.rx1_data_rate_offset", "mac_state.desired_parameters.rx1_delay", "mac_state.desired_parameters.rx2_data_rate_index", @@ -900,6 +1262,8 @@ var RPCFieldMaskPaths = map[string]RPCFieldMaskPathValue{ "mac_state.pending_application_downlink.frm_payload", "mac_state.pending_application_downlink.priority", "mac_state.pending_application_downlink.session_key_id", + "mac_state.pending_relay_downlink", + "mac_state.pending_relay_downlink.raw_payload", "mac_state.pending_requests", "mac_state.ping_slot_periodicity", "mac_state.ping_slot_periodicity.value", @@ -935,6 +1299,42 @@ var RPCFieldMaskPaths = map[string]RPCFieldMaskPathValue{ "pending_mac_state.current_parameters.ping_slot_frequency", "pending_mac_state.current_parameters.rejoin_count_periodicity", "pending_mac_state.current_parameters.rejoin_time_periodicity", + "pending_mac_state.current_parameters.relay", + "pending_mac_state.current_parameters.relay.mode", + "pending_mac_state.current_parameters.relay.mode.served", + "pending_mac_state.current_parameters.relay.mode.served.backoff", + "pending_mac_state.current_parameters.relay.mode.served.mode", + "pending_mac_state.current_parameters.relay.mode.served.mode.always", + "pending_mac_state.current_parameters.relay.mode.served.mode.dynamic", + "pending_mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "pending_mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "pending_mac_state.current_parameters.relay.mode.served.second_channel", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "pending_mac_state.current_parameters.relay.mode.served.serving_device_id", + "pending_mac_state.current_parameters.relay.mode.serving", + "pending_mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "pending_mac_state.current_parameters.relay.mode.serving.default_channel_index", + "pending_mac_state.current_parameters.relay.mode.serving.limits", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "pending_mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "pending_mac_state.current_parameters.rx1_data_rate_offset", "pending_mac_state.current_parameters.rx1_delay", "pending_mac_state.current_parameters.rx2_data_rate_index", @@ -960,6 +1360,42 @@ var RPCFieldMaskPaths = map[string]RPCFieldMaskPathValue{ "pending_mac_state.desired_parameters.ping_slot_frequency", "pending_mac_state.desired_parameters.rejoin_count_periodicity", "pending_mac_state.desired_parameters.rejoin_time_periodicity", + "pending_mac_state.desired_parameters.relay", + "pending_mac_state.desired_parameters.relay.mode", + "pending_mac_state.desired_parameters.relay.mode.served", + "pending_mac_state.desired_parameters.relay.mode.served.backoff", + "pending_mac_state.desired_parameters.relay.mode.served.mode", + "pending_mac_state.desired_parameters.relay.mode.served.mode.always", + "pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "pending_mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "pending_mac_state.desired_parameters.relay.mode.served.serving_device_id", + "pending_mac_state.desired_parameters.relay.mode.serving", + "pending_mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "pending_mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "pending_mac_state.desired_parameters.relay.mode.serving.limits", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "pending_mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "pending_mac_state.desired_parameters.rx1_data_rate_offset", "pending_mac_state.desired_parameters.rx1_delay", "pending_mac_state.desired_parameters.rx2_data_rate_index", diff --git a/pkg/ttnpb/i18n.go b/pkg/ttnpb/i18n.go index a9a67c0f7e..6c2b8d0296 100644 --- a/pkg/ttnpb/i18n.go +++ b/pkg/ttnpb/i18n.go @@ -87,6 +87,14 @@ func init() { defineEnum(MACCommandIdentifier_CID_BEACON_FREQ, "beacon frequency") defineEnum(MACCommandIdentifier_CID_DEVICE_MODE, "device mode") + defineEnum(MACCommandIdentifier_CID_RELAY_END_DEVICE_CONF, "end device relay configuration") + defineEnum(MACCommandIdentifier_CID_RELAY_UPDATE_UPLINK_LIST, "update uplink forwarding rules") + defineEnum(MACCommandIdentifier_CID_RELAY_CONF, "relay configuration") + defineEnum(MACCommandIdentifier_CID_RELAY_CTRL_UPLINK_LIST, "manage uplink forwarding rules") + defineEnum(MACCommandIdentifier_CID_RELAY_NOTIFY_NEW_END_DEVICE, "new end device under relay") + defineEnum(MACCommandIdentifier_CID_RELAY_FILTER_LIST, "manage join request forwarding rules") + defineEnum(MACCommandIdentifier_CID_RELAY_CONFIGURE_FWD_LIMIT, "manage uplink forwarding limits") + defineEnum(LocationSource_SOURCE_UNKNOWN, "unknown location source") defineEnum(LocationSource_SOURCE_GPS, "determined by GPS") defineEnum(LocationSource_SOURCE_REGISTRY, "set in and updated from a registry") diff --git a/pkg/ttnpb/lorawan.go b/pkg/ttnpb/lorawan.go index c0f84555aa..2d13b350fc 100644 --- a/pkg/ttnpb/lorawan.go +++ b/pkg/ttnpb/lorawan.go @@ -1197,3 +1197,43 @@ func (m *Message) EndDeviceIdentifiers() *EndDeviceIdentifiers { } return nil } + +// FieldIsZero returns whether path p is zero. +func (v *RelaySecondChannel) FieldIsZero(p string) bool { + if v == nil { + return true + } + switch p { + case "ack_offset": + return v.AckOffset == 0 + case "data_rate_index": + return v.DataRateIndex == 0 + case "frequency": + return v.Frequency == 0 + } + panic(fmt.Sprintf("unknown path '%s'", p)) +} + +// FieldIsZero returns whether path p is zero. +func (v *RelayEndDeviceDynamicMode) FieldIsZero(p string) bool { + if v == nil { + return true + } + switch p { + case "smart_enable_level": + return v.SmartEnableLevel == 0 + } + panic(fmt.Sprintf("unknown path '%s'", p)) +} + +// FieldIsZero returns whether path p is zero. +func (v *RelayForwardDownlinkReq) FieldIsZero(p string) bool { + if v == nil { + return true + } + switch p { + case "raw_payload": + return v.RawPayload == nil + } + panic(fmt.Sprintf("unknown path '%s'", p)) +} diff --git a/pkg/ttnpb/lorawan.pb.go b/pkg/ttnpb/lorawan.pb.go index 6f8ebae936..04fc47efe9 100644 --- a/pkg/ttnpb/lorawan.pb.go +++ b/pkg/ttnpb/lorawan.pb.go @@ -720,27 +720,34 @@ func (TxSchedulePriority) EnumDescriptor() ([]byte, []int) { type MACCommandIdentifier int32 const ( - MACCommandIdentifier_CID_RFU_0 MACCommandIdentifier = 0 - MACCommandIdentifier_CID_RESET MACCommandIdentifier = 1 - MACCommandIdentifier_CID_LINK_CHECK MACCommandIdentifier = 2 - MACCommandIdentifier_CID_LINK_ADR MACCommandIdentifier = 3 - MACCommandIdentifier_CID_DUTY_CYCLE MACCommandIdentifier = 4 - MACCommandIdentifier_CID_RX_PARAM_SETUP MACCommandIdentifier = 5 - MACCommandIdentifier_CID_DEV_STATUS MACCommandIdentifier = 6 - MACCommandIdentifier_CID_NEW_CHANNEL MACCommandIdentifier = 7 - MACCommandIdentifier_CID_RX_TIMING_SETUP MACCommandIdentifier = 8 - MACCommandIdentifier_CID_TX_PARAM_SETUP MACCommandIdentifier = 9 - MACCommandIdentifier_CID_DL_CHANNEL MACCommandIdentifier = 10 - MACCommandIdentifier_CID_REKEY MACCommandIdentifier = 11 - MACCommandIdentifier_CID_ADR_PARAM_SETUP MACCommandIdentifier = 12 - MACCommandIdentifier_CID_DEVICE_TIME MACCommandIdentifier = 13 - MACCommandIdentifier_CID_FORCE_REJOIN MACCommandIdentifier = 14 - MACCommandIdentifier_CID_REJOIN_PARAM_SETUP MACCommandIdentifier = 15 - MACCommandIdentifier_CID_PING_SLOT_INFO MACCommandIdentifier = 16 - MACCommandIdentifier_CID_PING_SLOT_CHANNEL MACCommandIdentifier = 17 - MACCommandIdentifier_CID_BEACON_TIMING MACCommandIdentifier = 18 // Deprecated - MACCommandIdentifier_CID_BEACON_FREQ MACCommandIdentifier = 19 - MACCommandIdentifier_CID_DEVICE_MODE MACCommandIdentifier = 32 + MACCommandIdentifier_CID_RFU_0 MACCommandIdentifier = 0 + MACCommandIdentifier_CID_RESET MACCommandIdentifier = 1 + MACCommandIdentifier_CID_LINK_CHECK MACCommandIdentifier = 2 + MACCommandIdentifier_CID_LINK_ADR MACCommandIdentifier = 3 + MACCommandIdentifier_CID_DUTY_CYCLE MACCommandIdentifier = 4 + MACCommandIdentifier_CID_RX_PARAM_SETUP MACCommandIdentifier = 5 + MACCommandIdentifier_CID_DEV_STATUS MACCommandIdentifier = 6 + MACCommandIdentifier_CID_NEW_CHANNEL MACCommandIdentifier = 7 + MACCommandIdentifier_CID_RX_TIMING_SETUP MACCommandIdentifier = 8 + MACCommandIdentifier_CID_TX_PARAM_SETUP MACCommandIdentifier = 9 + MACCommandIdentifier_CID_DL_CHANNEL MACCommandIdentifier = 10 + MACCommandIdentifier_CID_REKEY MACCommandIdentifier = 11 + MACCommandIdentifier_CID_ADR_PARAM_SETUP MACCommandIdentifier = 12 + MACCommandIdentifier_CID_DEVICE_TIME MACCommandIdentifier = 13 + MACCommandIdentifier_CID_FORCE_REJOIN MACCommandIdentifier = 14 + MACCommandIdentifier_CID_REJOIN_PARAM_SETUP MACCommandIdentifier = 15 + MACCommandIdentifier_CID_PING_SLOT_INFO MACCommandIdentifier = 16 + MACCommandIdentifier_CID_PING_SLOT_CHANNEL MACCommandIdentifier = 17 + MACCommandIdentifier_CID_BEACON_TIMING MACCommandIdentifier = 18 // Deprecated + MACCommandIdentifier_CID_BEACON_FREQ MACCommandIdentifier = 19 + MACCommandIdentifier_CID_DEVICE_MODE MACCommandIdentifier = 32 + MACCommandIdentifier_CID_RELAY_CONF MACCommandIdentifier = 64 + MACCommandIdentifier_CID_RELAY_END_DEVICE_CONF MACCommandIdentifier = 65 + MACCommandIdentifier_CID_RELAY_FILTER_LIST MACCommandIdentifier = 66 + MACCommandIdentifier_CID_RELAY_UPDATE_UPLINK_LIST MACCommandIdentifier = 67 + MACCommandIdentifier_CID_RELAY_CTRL_UPLINK_LIST MACCommandIdentifier = 68 + MACCommandIdentifier_CID_RELAY_CONFIGURE_FWD_LIMIT MACCommandIdentifier = 69 + MACCommandIdentifier_CID_RELAY_NOTIFY_NEW_END_DEVICE MACCommandIdentifier = 70 ) // Enum value maps for MACCommandIdentifier. @@ -767,29 +774,43 @@ var ( 18: "CID_BEACON_TIMING", 19: "CID_BEACON_FREQ", 32: "CID_DEVICE_MODE", + 64: "CID_RELAY_CONF", + 65: "CID_RELAY_END_DEVICE_CONF", + 66: "CID_RELAY_FILTER_LIST", + 67: "CID_RELAY_UPDATE_UPLINK_LIST", + 68: "CID_RELAY_CTRL_UPLINK_LIST", + 69: "CID_RELAY_CONFIGURE_FWD_LIMIT", + 70: "CID_RELAY_NOTIFY_NEW_END_DEVICE", } MACCommandIdentifier_value = map[string]int32{ - "CID_RFU_0": 0, - "CID_RESET": 1, - "CID_LINK_CHECK": 2, - "CID_LINK_ADR": 3, - "CID_DUTY_CYCLE": 4, - "CID_RX_PARAM_SETUP": 5, - "CID_DEV_STATUS": 6, - "CID_NEW_CHANNEL": 7, - "CID_RX_TIMING_SETUP": 8, - "CID_TX_PARAM_SETUP": 9, - "CID_DL_CHANNEL": 10, - "CID_REKEY": 11, - "CID_ADR_PARAM_SETUP": 12, - "CID_DEVICE_TIME": 13, - "CID_FORCE_REJOIN": 14, - "CID_REJOIN_PARAM_SETUP": 15, - "CID_PING_SLOT_INFO": 16, - "CID_PING_SLOT_CHANNEL": 17, - "CID_BEACON_TIMING": 18, - "CID_BEACON_FREQ": 19, - "CID_DEVICE_MODE": 32, + "CID_RFU_0": 0, + "CID_RESET": 1, + "CID_LINK_CHECK": 2, + "CID_LINK_ADR": 3, + "CID_DUTY_CYCLE": 4, + "CID_RX_PARAM_SETUP": 5, + "CID_DEV_STATUS": 6, + "CID_NEW_CHANNEL": 7, + "CID_RX_TIMING_SETUP": 8, + "CID_TX_PARAM_SETUP": 9, + "CID_DL_CHANNEL": 10, + "CID_REKEY": 11, + "CID_ADR_PARAM_SETUP": 12, + "CID_DEVICE_TIME": 13, + "CID_FORCE_REJOIN": 14, + "CID_REJOIN_PARAM_SETUP": 15, + "CID_PING_SLOT_INFO": 16, + "CID_PING_SLOT_CHANNEL": 17, + "CID_BEACON_TIMING": 18, + "CID_BEACON_FREQ": 19, + "CID_DEVICE_MODE": 32, + "CID_RELAY_CONF": 64, + "CID_RELAY_END_DEVICE_CONF": 65, + "CID_RELAY_FILTER_LIST": 66, + "CID_RELAY_UPDATE_UPLINK_LIST": 67, + "CID_RELAY_CTRL_UPLINK_LIST": 68, + "CID_RELAY_CONFIGURE_FWD_LIMIT": 69, + "CID_RELAY_NOTIFY_NEW_END_DEVICE": 70, } ) @@ -820,6 +841,370 @@ func (MACCommandIdentifier) EnumDescriptor() ([]byte, []int) { return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{11} } +type RelayCADPeriodicity int32 + +const ( + RelayCADPeriodicity_RELAY_CAD_PERIODICITY_1_SECOND RelayCADPeriodicity = 0 + RelayCADPeriodicity_RELAY_CAD_PERIODICITY_500_MILLISECONDS RelayCADPeriodicity = 1 + RelayCADPeriodicity_RELAY_CAD_PERIODICITY_250_MILLISECONDS RelayCADPeriodicity = 2 + RelayCADPeriodicity_RELAY_CAD_PERIODICITY_100_MILLISECONDS RelayCADPeriodicity = 3 + RelayCADPeriodicity_RELAY_CAD_PERIODICITY_50_MILLISECONDS RelayCADPeriodicity = 4 + RelayCADPeriodicity_RELAY_CAD_PERIODICITY_20_MILLISECONDS RelayCADPeriodicity = 5 // sic +) + +// Enum value maps for RelayCADPeriodicity. +var ( + RelayCADPeriodicity_name = map[int32]string{ + 0: "RELAY_CAD_PERIODICITY_1_SECOND", + 1: "RELAY_CAD_PERIODICITY_500_MILLISECONDS", + 2: "RELAY_CAD_PERIODICITY_250_MILLISECONDS", + 3: "RELAY_CAD_PERIODICITY_100_MILLISECONDS", + 4: "RELAY_CAD_PERIODICITY_50_MILLISECONDS", + 5: "RELAY_CAD_PERIODICITY_20_MILLISECONDS", + } + RelayCADPeriodicity_value = map[string]int32{ + "RELAY_CAD_PERIODICITY_1_SECOND": 0, + "RELAY_CAD_PERIODICITY_500_MILLISECONDS": 1, + "RELAY_CAD_PERIODICITY_250_MILLISECONDS": 2, + "RELAY_CAD_PERIODICITY_100_MILLISECONDS": 3, + "RELAY_CAD_PERIODICITY_50_MILLISECONDS": 4, + "RELAY_CAD_PERIODICITY_20_MILLISECONDS": 5, + } +) + +func (x RelayCADPeriodicity) Enum() *RelayCADPeriodicity { + p := new(RelayCADPeriodicity) + *p = x + return p +} + +func (x RelayCADPeriodicity) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RelayCADPeriodicity) Descriptor() protoreflect.EnumDescriptor { + return file_ttn_lorawan_v3_lorawan_proto_enumTypes[12].Descriptor() +} + +func (RelayCADPeriodicity) Type() protoreflect.EnumType { + return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[12] +} + +func (x RelayCADPeriodicity) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use RelayCADPeriodicity.Descriptor instead. +func (RelayCADPeriodicity) EnumDescriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{12} +} + +type RelaySecondChAckOffset int32 + +const ( + RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_0 RelaySecondChAckOffset = 0 // 0 kHz + RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_200 RelaySecondChAckOffset = 1 // 200 kHz + RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_400 RelaySecondChAckOffset = 2 // 400 kHz + RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_800 RelaySecondChAckOffset = 3 // 800 kHz + RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_1600 RelaySecondChAckOffset = 4 // 1.6 MHz + RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_3200 RelaySecondChAckOffset = 5 // 3.2 MHz +) + +// Enum value maps for RelaySecondChAckOffset. +var ( + RelaySecondChAckOffset_name = map[int32]string{ + 0: "RELAY_SECOND_CH_ACK_OFFSET_0", + 1: "RELAY_SECOND_CH_ACK_OFFSET_200", + 2: "RELAY_SECOND_CH_ACK_OFFSET_400", + 3: "RELAY_SECOND_CH_ACK_OFFSET_800", + 4: "RELAY_SECOND_CH_ACK_OFFSET_1600", + 5: "RELAY_SECOND_CH_ACK_OFFSET_3200", + } + RelaySecondChAckOffset_value = map[string]int32{ + "RELAY_SECOND_CH_ACK_OFFSET_0": 0, + "RELAY_SECOND_CH_ACK_OFFSET_200": 1, + "RELAY_SECOND_CH_ACK_OFFSET_400": 2, + "RELAY_SECOND_CH_ACK_OFFSET_800": 3, + "RELAY_SECOND_CH_ACK_OFFSET_1600": 4, + "RELAY_SECOND_CH_ACK_OFFSET_3200": 5, + } +) + +func (x RelaySecondChAckOffset) Enum() *RelaySecondChAckOffset { + p := new(RelaySecondChAckOffset) + *p = x + return p +} + +func (x RelaySecondChAckOffset) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RelaySecondChAckOffset) Descriptor() protoreflect.EnumDescriptor { + return file_ttn_lorawan_v3_lorawan_proto_enumTypes[13].Descriptor() +} + +func (RelaySecondChAckOffset) Type() protoreflect.EnumType { + return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[13] +} + +func (x RelaySecondChAckOffset) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use RelaySecondChAckOffset.Descriptor instead. +func (RelaySecondChAckOffset) EnumDescriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{13} +} + +type RelayLimitBucketSize int32 + +const ( + RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_1 RelayLimitBucketSize = 0 + RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_2 RelayLimitBucketSize = 1 + RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_4 RelayLimitBucketSize = 2 + RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_12 RelayLimitBucketSize = 3 // sic +) + +// Enum value maps for RelayLimitBucketSize. +var ( + RelayLimitBucketSize_name = map[int32]string{ + 0: "RELAY_LIMIT_BUCKET_SIZE_1", + 1: "RELAY_LIMIT_BUCKET_SIZE_2", + 2: "RELAY_LIMIT_BUCKET_SIZE_4", + 3: "RELAY_LIMIT_BUCKET_SIZE_12", + } + RelayLimitBucketSize_value = map[string]int32{ + "RELAY_LIMIT_BUCKET_SIZE_1": 0, + "RELAY_LIMIT_BUCKET_SIZE_2": 1, + "RELAY_LIMIT_BUCKET_SIZE_4": 2, + "RELAY_LIMIT_BUCKET_SIZE_12": 3, + } +) + +func (x RelayLimitBucketSize) Enum() *RelayLimitBucketSize { + p := new(RelayLimitBucketSize) + *p = x + return p +} + +func (x RelayLimitBucketSize) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RelayLimitBucketSize) Descriptor() protoreflect.EnumDescriptor { + return file_ttn_lorawan_v3_lorawan_proto_enumTypes[14].Descriptor() +} + +func (RelayLimitBucketSize) Type() protoreflect.EnumType { + return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[14] +} + +func (x RelayLimitBucketSize) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use RelayLimitBucketSize.Descriptor instead. +func (RelayLimitBucketSize) EnumDescriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{14} +} + +type RelaySmartEnableLevel int32 + +const ( + RelaySmartEnableLevel_RELAY_SMART_ENABLE_LEVEL_8 RelaySmartEnableLevel = 0 + RelaySmartEnableLevel_RELAY_SMART_ENABLE_LEVEL_16 RelaySmartEnableLevel = 1 + RelaySmartEnableLevel_RELAY_SMART_ENABLE_LEVEL_32 RelaySmartEnableLevel = 2 + RelaySmartEnableLevel_RELAY_SMART_ENABLE_LEVEL_64 RelaySmartEnableLevel = 3 +) + +// Enum value maps for RelaySmartEnableLevel. +var ( + RelaySmartEnableLevel_name = map[int32]string{ + 0: "RELAY_SMART_ENABLE_LEVEL_8", + 1: "RELAY_SMART_ENABLE_LEVEL_16", + 2: "RELAY_SMART_ENABLE_LEVEL_32", + 3: "RELAY_SMART_ENABLE_LEVEL_64", + } + RelaySmartEnableLevel_value = map[string]int32{ + "RELAY_SMART_ENABLE_LEVEL_8": 0, + "RELAY_SMART_ENABLE_LEVEL_16": 1, + "RELAY_SMART_ENABLE_LEVEL_32": 2, + "RELAY_SMART_ENABLE_LEVEL_64": 3, + } +) + +func (x RelaySmartEnableLevel) Enum() *RelaySmartEnableLevel { + p := new(RelaySmartEnableLevel) + *p = x + return p +} + +func (x RelaySmartEnableLevel) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RelaySmartEnableLevel) Descriptor() protoreflect.EnumDescriptor { + return file_ttn_lorawan_v3_lorawan_proto_enumTypes[15].Descriptor() +} + +func (RelaySmartEnableLevel) Type() protoreflect.EnumType { + return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[15] +} + +func (x RelaySmartEnableLevel) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use RelaySmartEnableLevel.Descriptor instead. +func (RelaySmartEnableLevel) EnumDescriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{15} +} + +type RelayWORChannel int32 + +const ( + RelayWORChannel_RELAY_WOR_CHANNEL_DEFAULT RelayWORChannel = 0 + RelayWORChannel_RELAY_WOR_CHANNEL_SECONDARY RelayWORChannel = 1 +) + +// Enum value maps for RelayWORChannel. +var ( + RelayWORChannel_name = map[int32]string{ + 0: "RELAY_WOR_CHANNEL_DEFAULT", + 1: "RELAY_WOR_CHANNEL_SECONDARY", + } + RelayWORChannel_value = map[string]int32{ + "RELAY_WOR_CHANNEL_DEFAULT": 0, + "RELAY_WOR_CHANNEL_SECONDARY": 1, + } +) + +func (x RelayWORChannel) Enum() *RelayWORChannel { + p := new(RelayWORChannel) + *p = x + return p +} + +func (x RelayWORChannel) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RelayWORChannel) Descriptor() protoreflect.EnumDescriptor { + return file_ttn_lorawan_v3_lorawan_proto_enumTypes[16].Descriptor() +} + +func (RelayWORChannel) Type() protoreflect.EnumType { + return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[16] +} + +func (x RelayWORChannel) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use RelayWORChannel.Descriptor instead. +func (RelayWORChannel) EnumDescriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{16} +} + +type RelayResetLimitCounter int32 + +const ( + RelayResetLimitCounter_RELAY_RESET_LIMIT_COUNTER_ZERO RelayResetLimitCounter = 0 + RelayResetLimitCounter_RELAY_RESET_LIMIT_COUNTER_RELOAD_RATE RelayResetLimitCounter = 1 + RelayResetLimitCounter_RELAY_RESET_LIMIT_COUNTER_MAX_VALUE RelayResetLimitCounter = 2 + RelayResetLimitCounter_RELAY_RESET_LIMIT_COUNTER_NO_RESET RelayResetLimitCounter = 3 +) + +// Enum value maps for RelayResetLimitCounter. +var ( + RelayResetLimitCounter_name = map[int32]string{ + 0: "RELAY_RESET_LIMIT_COUNTER_ZERO", + 1: "RELAY_RESET_LIMIT_COUNTER_RELOAD_RATE", + 2: "RELAY_RESET_LIMIT_COUNTER_MAX_VALUE", + 3: "RELAY_RESET_LIMIT_COUNTER_NO_RESET", + } + RelayResetLimitCounter_value = map[string]int32{ + "RELAY_RESET_LIMIT_COUNTER_ZERO": 0, + "RELAY_RESET_LIMIT_COUNTER_RELOAD_RATE": 1, + "RELAY_RESET_LIMIT_COUNTER_MAX_VALUE": 2, + "RELAY_RESET_LIMIT_COUNTER_NO_RESET": 3, + } +) + +func (x RelayResetLimitCounter) Enum() *RelayResetLimitCounter { + p := new(RelayResetLimitCounter) + *p = x + return p +} + +func (x RelayResetLimitCounter) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RelayResetLimitCounter) Descriptor() protoreflect.EnumDescriptor { + return file_ttn_lorawan_v3_lorawan_proto_enumTypes[17].Descriptor() +} + +func (RelayResetLimitCounter) Type() protoreflect.EnumType { + return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[17] +} + +func (x RelayResetLimitCounter) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use RelayResetLimitCounter.Descriptor instead. +func (RelayResetLimitCounter) EnumDescriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{17} +} + +type RelayCtrlUplinkListAction int32 + +const ( + RelayCtrlUplinkListAction_RELAY_CTRL_UPLINK_LIST_ACTION_READ_W_F_CNT RelayCtrlUplinkListAction = 0 + RelayCtrlUplinkListAction_RELAY_CTRL_UPLINK_LIST_ACTION_REMOVE_TRUSTED_END_DEVICE RelayCtrlUplinkListAction = 1 +) + +// Enum value maps for RelayCtrlUplinkListAction. +var ( + RelayCtrlUplinkListAction_name = map[int32]string{ + 0: "RELAY_CTRL_UPLINK_LIST_ACTION_READ_W_F_CNT", + 1: "RELAY_CTRL_UPLINK_LIST_ACTION_REMOVE_TRUSTED_END_DEVICE", + } + RelayCtrlUplinkListAction_value = map[string]int32{ + "RELAY_CTRL_UPLINK_LIST_ACTION_READ_W_F_CNT": 0, + "RELAY_CTRL_UPLINK_LIST_ACTION_REMOVE_TRUSTED_END_DEVICE": 1, + } +) + +func (x RelayCtrlUplinkListAction) Enum() *RelayCtrlUplinkListAction { + p := new(RelayCtrlUplinkListAction) + *p = x + return p +} + +func (x RelayCtrlUplinkListAction) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RelayCtrlUplinkListAction) Descriptor() protoreflect.EnumDescriptor { + return file_ttn_lorawan_v3_lorawan_proto_enumTypes[18].Descriptor() +} + +func (RelayCtrlUplinkListAction) Type() protoreflect.EnumType { + return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[18] +} + +func (x RelayCtrlUplinkListAction) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use RelayCtrlUplinkListAction.Descriptor instead. +func (RelayCtrlUplinkListAction) EnumDescriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{18} +} + type AggregatedDutyCycle int32 const ( @@ -892,11 +1277,11 @@ func (x AggregatedDutyCycle) String() string { } func (AggregatedDutyCycle) Descriptor() protoreflect.EnumDescriptor { - return file_ttn_lorawan_v3_lorawan_proto_enumTypes[12].Descriptor() + return file_ttn_lorawan_v3_lorawan_proto_enumTypes[19].Descriptor() } func (AggregatedDutyCycle) Type() protoreflect.EnumType { - return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[12] + return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[19] } func (x AggregatedDutyCycle) Number() protoreflect.EnumNumber { @@ -905,7 +1290,7 @@ func (x AggregatedDutyCycle) Number() protoreflect.EnumNumber { // Deprecated: Use AggregatedDutyCycle.Descriptor instead. func (AggregatedDutyCycle) EnumDescriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{12} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{19} } type PingSlotPeriod int32 @@ -956,11 +1341,11 @@ func (x PingSlotPeriod) String() string { } func (PingSlotPeriod) Descriptor() protoreflect.EnumDescriptor { - return file_ttn_lorawan_v3_lorawan_proto_enumTypes[13].Descriptor() + return file_ttn_lorawan_v3_lorawan_proto_enumTypes[20].Descriptor() } func (PingSlotPeriod) Type() protoreflect.EnumType { - return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[13] + return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[20] } func (x PingSlotPeriod) Number() protoreflect.EnumNumber { @@ -969,7 +1354,7 @@ func (x PingSlotPeriod) Number() protoreflect.EnumNumber { // Deprecated: Use PingSlotPeriod.Descriptor instead. func (PingSlotPeriod) EnumDescriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{13} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20} } type RejoinCountExponent int32 @@ -1044,11 +1429,11 @@ func (x RejoinCountExponent) String() string { } func (RejoinCountExponent) Descriptor() protoreflect.EnumDescriptor { - return file_ttn_lorawan_v3_lorawan_proto_enumTypes[14].Descriptor() + return file_ttn_lorawan_v3_lorawan_proto_enumTypes[21].Descriptor() } func (RejoinCountExponent) Type() protoreflect.EnumType { - return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[14] + return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[21] } func (x RejoinCountExponent) Number() protoreflect.EnumNumber { @@ -1057,7 +1442,7 @@ func (x RejoinCountExponent) Number() protoreflect.EnumNumber { // Deprecated: Use RejoinCountExponent.Descriptor instead. func (RejoinCountExponent) EnumDescriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{14} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{21} } type RejoinTimeExponent int32 @@ -1132,11 +1517,11 @@ func (x RejoinTimeExponent) String() string { } func (RejoinTimeExponent) Descriptor() protoreflect.EnumDescriptor { - return file_ttn_lorawan_v3_lorawan_proto_enumTypes[15].Descriptor() + return file_ttn_lorawan_v3_lorawan_proto_enumTypes[22].Descriptor() } func (RejoinTimeExponent) Type() protoreflect.EnumType { - return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[15] + return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[22] } func (x RejoinTimeExponent) Number() protoreflect.EnumNumber { @@ -1145,7 +1530,7 @@ func (x RejoinTimeExponent) Number() protoreflect.EnumNumber { // Deprecated: Use RejoinTimeExponent.Descriptor instead. func (RejoinTimeExponent) EnumDescriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{15} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{22} } type RejoinPeriodExponent int32 @@ -1196,11 +1581,11 @@ func (x RejoinPeriodExponent) String() string { } func (RejoinPeriodExponent) Descriptor() protoreflect.EnumDescriptor { - return file_ttn_lorawan_v3_lorawan_proto_enumTypes[16].Descriptor() + return file_ttn_lorawan_v3_lorawan_proto_enumTypes[23].Descriptor() } func (RejoinPeriodExponent) Type() protoreflect.EnumType { - return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[16] + return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[23] } func (x RejoinPeriodExponent) Number() protoreflect.EnumNumber { @@ -1209,7 +1594,7 @@ func (x RejoinPeriodExponent) Number() protoreflect.EnumNumber { // Deprecated: Use RejoinPeriodExponent.Descriptor instead. func (RejoinPeriodExponent) EnumDescriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{16} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{23} } type DeviceEIRP int32 @@ -1284,11 +1669,11 @@ func (x DeviceEIRP) String() string { } func (DeviceEIRP) Descriptor() protoreflect.EnumDescriptor { - return file_ttn_lorawan_v3_lorawan_proto_enumTypes[17].Descriptor() + return file_ttn_lorawan_v3_lorawan_proto_enumTypes[24].Descriptor() } func (DeviceEIRP) Type() protoreflect.EnumType { - return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[17] + return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[24] } func (x DeviceEIRP) Number() protoreflect.EnumNumber { @@ -1297,7 +1682,7 @@ func (x DeviceEIRP) Number() protoreflect.EnumNumber { // Deprecated: Use DeviceEIRP.Descriptor instead. func (DeviceEIRP) EnumDescriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{17} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{24} } type ADRAckLimitExponent int32 @@ -1372,11 +1757,11 @@ func (x ADRAckLimitExponent) String() string { } func (ADRAckLimitExponent) Descriptor() protoreflect.EnumDescriptor { - return file_ttn_lorawan_v3_lorawan_proto_enumTypes[18].Descriptor() + return file_ttn_lorawan_v3_lorawan_proto_enumTypes[25].Descriptor() } func (ADRAckLimitExponent) Type() protoreflect.EnumType { - return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[18] + return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[25] } func (x ADRAckLimitExponent) Number() protoreflect.EnumNumber { @@ -1385,7 +1770,7 @@ func (x ADRAckLimitExponent) Number() protoreflect.EnumNumber { // Deprecated: Use ADRAckLimitExponent.Descriptor instead. func (ADRAckLimitExponent) EnumDescriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{18} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{25} } type ADRAckDelayExponent int32 @@ -1460,11 +1845,11 @@ func (x ADRAckDelayExponent) String() string { } func (ADRAckDelayExponent) Descriptor() protoreflect.EnumDescriptor { - return file_ttn_lorawan_v3_lorawan_proto_enumTypes[19].Descriptor() + return file_ttn_lorawan_v3_lorawan_proto_enumTypes[26].Descriptor() } func (ADRAckDelayExponent) Type() protoreflect.EnumType { - return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[19] + return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[26] } func (x ADRAckDelayExponent) Number() protoreflect.EnumNumber { @@ -1473,7 +1858,7 @@ func (x ADRAckDelayExponent) Number() protoreflect.EnumNumber { // Deprecated: Use ADRAckDelayExponent.Descriptor instead. func (ADRAckDelayExponent) EnumDescriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{19} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26} } type RxDelay int32 @@ -1548,11 +1933,11 @@ func (x RxDelay) String() string { } func (RxDelay) Descriptor() protoreflect.EnumDescriptor { - return file_ttn_lorawan_v3_lorawan_proto_enumTypes[20].Descriptor() + return file_ttn_lorawan_v3_lorawan_proto_enumTypes[27].Descriptor() } func (RxDelay) Type() protoreflect.EnumType { - return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[20] + return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[27] } func (x RxDelay) Number() protoreflect.EnumNumber { @@ -1561,7 +1946,7 @@ func (x RxDelay) Number() protoreflect.EnumNumber { // Deprecated: Use RxDelay.Descriptor instead. func (RxDelay) EnumDescriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{27} } type Minor int32 @@ -1636,11 +2021,11 @@ func (x Minor) String() string { } func (Minor) Descriptor() protoreflect.EnumDescriptor { - return file_ttn_lorawan_v3_lorawan_proto_enumTypes[21].Descriptor() + return file_ttn_lorawan_v3_lorawan_proto_enumTypes[28].Descriptor() } func (Minor) Type() protoreflect.EnumType { - return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[21] + return &file_ttn_lorawan_v3_lorawan_proto_enumTypes[28] } func (x Minor) Number() protoreflect.EnumNumber { @@ -1649,7 +2034,7 @@ func (x Minor) Number() protoreflect.EnumNumber { // Deprecated: Use Minor.Descriptor instead. func (Minor) EnumDescriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{21} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{28} } // Message represents a LoRaWAN message @@ -3250,29 +3635,336 @@ func (x *TxRequest) GetAdvanced() *structpb.Struct { return nil } -type MACCommand struct { +type RelaySecondChannel struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Cid MACCommandIdentifier `protobuf:"varint,1,opt,name=cid,proto3,enum=ttn.lorawan.v3.MACCommandIdentifier" json:"cid,omitempty"` - // Types that are assignable to Payload: - // *MACCommand_RawPayload - // *MACCommand_ResetInd_ - // *MACCommand_ResetConf_ - // *MACCommand_LinkCheckAns_ - // *MACCommand_LinkAdrReq - // *MACCommand_LinkAdrAns - // *MACCommand_DutyCycleReq_ - // *MACCommand_RxParamSetupReq_ - // *MACCommand_RxParamSetupAns_ - // *MACCommand_DevStatusAns_ - // *MACCommand_NewChannelReq_ - // *MACCommand_NewChannelAns_ - // *MACCommand_DlChannelReq - // *MACCommand_DlChannelAns - // *MACCommand_RxTimingSetupReq_ - // *MACCommand_TxParamSetupReq_ + // The frequency (Hz) offset used for the WOR acknowledgement. + AckOffset RelaySecondChAckOffset `protobuf:"varint,1,opt,name=ack_offset,json=ackOffset,proto3,enum=ttn.lorawan.v3.RelaySecondChAckOffset" json:"ack_offset,omitempty"` + // The data rate index used by the WOR and WOR acknowledgement. + DataRateIndex DataRateIndex `protobuf:"varint,2,opt,name=data_rate_index,json=dataRateIndex,proto3,enum=ttn.lorawan.v3.DataRateIndex" json:"data_rate_index,omitempty"` + // The frequency (Hz) used by the wake on radio message. + Frequency uint64 `protobuf:"varint,3,opt,name=frequency,proto3" json:"frequency,omitempty"` +} + +func (x *RelaySecondChannel) Reset() { + *x = RelaySecondChannel{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RelaySecondChannel) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RelaySecondChannel) ProtoMessage() {} + +func (x *RelaySecondChannel) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RelaySecondChannel.ProtoReflect.Descriptor instead. +func (*RelaySecondChannel) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20} +} + +func (x *RelaySecondChannel) GetAckOffset() RelaySecondChAckOffset { + if x != nil { + return x.AckOffset + } + return RelaySecondChAckOffset_RELAY_SECOND_CH_ACK_OFFSET_0 +} + +func (x *RelaySecondChannel) GetDataRateIndex() DataRateIndex { + if x != nil { + return x.DataRateIndex + } + return DataRateIndex_DATA_RATE_0 +} + +func (x *RelaySecondChannel) GetFrequency() uint64 { + if x != nil { + return x.Frequency + } + return 0 +} + +type RelayUplinkForwardLimits struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The multiplier used to compute the total bucket size for the limits. + // The multiplier is multiplied by the reload rate in order to compute the total bucket size. + BucketSize RelayLimitBucketSize `protobuf:"varint,1,opt,name=bucket_size,json=bucketSize,proto3,enum=ttn.lorawan.v3.RelayLimitBucketSize" json:"bucket_size,omitempty"` + // The number of tokens which are replenished in the bucket every hour. + ReloadRate uint32 `protobuf:"varint,2,opt,name=reload_rate,json=reloadRate,proto3" json:"reload_rate,omitempty"` +} + +func (x *RelayUplinkForwardLimits) Reset() { + *x = RelayUplinkForwardLimits{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RelayUplinkForwardLimits) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RelayUplinkForwardLimits) ProtoMessage() {} + +func (x *RelayUplinkForwardLimits) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RelayUplinkForwardLimits.ProtoReflect.Descriptor instead. +func (*RelayUplinkForwardLimits) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{21} +} + +func (x *RelayUplinkForwardLimits) GetBucketSize() RelayLimitBucketSize { + if x != nil { + return x.BucketSize + } + return RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_1 +} + +func (x *RelayUplinkForwardLimits) GetReloadRate() uint32 { + if x != nil { + return x.ReloadRate + } + return 0 +} + +type RelayForwardLimits struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The multiplier used to compute the total bucket size for the limits. + // The multiplier is multiplied by the reload rate in order to compute the total bucket size. + BucketSize RelayLimitBucketSize `protobuf:"varint,1,opt,name=bucket_size,json=bucketSize,proto3,enum=ttn.lorawan.v3.RelayLimitBucketSize" json:"bucket_size,omitempty"` + // The number of tokens which are replenished in the bucket every hour. + ReloadRate uint32 `protobuf:"varint,2,opt,name=reload_rate,json=reloadRate,proto3" json:"reload_rate,omitempty"` +} + +func (x *RelayForwardLimits) Reset() { + *x = RelayForwardLimits{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RelayForwardLimits) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RelayForwardLimits) ProtoMessage() {} + +func (x *RelayForwardLimits) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RelayForwardLimits.ProtoReflect.Descriptor instead. +func (*RelayForwardLimits) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{22} +} + +func (x *RelayForwardLimits) GetBucketSize() RelayLimitBucketSize { + if x != nil { + return x.BucketSize + } + return RelayLimitBucketSize_RELAY_LIMIT_BUCKET_SIZE_1 +} + +func (x *RelayForwardLimits) GetReloadRate() uint32 { + if x != nil { + return x.ReloadRate + } + return 0 +} + +type RelayEndDeviceAlwaysMode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *RelayEndDeviceAlwaysMode) Reset() { + *x = RelayEndDeviceAlwaysMode{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RelayEndDeviceAlwaysMode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RelayEndDeviceAlwaysMode) ProtoMessage() {} + +func (x *RelayEndDeviceAlwaysMode) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RelayEndDeviceAlwaysMode.ProtoReflect.Descriptor instead. +func (*RelayEndDeviceAlwaysMode) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{23} +} + +type RelayEndDeviceDynamicMode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The number of consecutive uplinks without a valid downlink before the end device attempts + // to use the relay mode to transmit messages. + SmartEnableLevel RelaySmartEnableLevel `protobuf:"varint,1,opt,name=smart_enable_level,json=smartEnableLevel,proto3,enum=ttn.lorawan.v3.RelaySmartEnableLevel" json:"smart_enable_level,omitempty"` +} + +func (x *RelayEndDeviceDynamicMode) Reset() { + *x = RelayEndDeviceDynamicMode{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RelayEndDeviceDynamicMode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RelayEndDeviceDynamicMode) ProtoMessage() {} + +func (x *RelayEndDeviceDynamicMode) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[24] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RelayEndDeviceDynamicMode.ProtoReflect.Descriptor instead. +func (*RelayEndDeviceDynamicMode) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{24} +} + +func (x *RelayEndDeviceDynamicMode) GetSmartEnableLevel() RelaySmartEnableLevel { + if x != nil { + return x.SmartEnableLevel + } + return RelaySmartEnableLevel_RELAY_SMART_ENABLE_LEVEL_8 +} + +type RelayEndDeviceControlledMode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *RelayEndDeviceControlledMode) Reset() { + *x = RelayEndDeviceControlledMode{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RelayEndDeviceControlledMode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RelayEndDeviceControlledMode) ProtoMessage() {} + +func (x *RelayEndDeviceControlledMode) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RelayEndDeviceControlledMode.ProtoReflect.Descriptor instead. +func (*RelayEndDeviceControlledMode) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{25} +} + +type MACCommand struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Cid MACCommandIdentifier `protobuf:"varint,1,opt,name=cid,proto3,enum=ttn.lorawan.v3.MACCommandIdentifier" json:"cid,omitempty"` + // Types that are assignable to Payload: + // *MACCommand_RawPayload + // *MACCommand_ResetInd_ + // *MACCommand_ResetConf_ + // *MACCommand_LinkCheckAns_ + // *MACCommand_LinkAdrReq + // *MACCommand_LinkAdrAns + // *MACCommand_DutyCycleReq_ + // *MACCommand_RxParamSetupReq_ + // *MACCommand_RxParamSetupAns_ + // *MACCommand_DevStatusAns_ + // *MACCommand_NewChannelReq_ + // *MACCommand_NewChannelAns_ + // *MACCommand_DlChannelReq + // *MACCommand_DlChannelAns + // *MACCommand_RxTimingSetupReq_ + // *MACCommand_TxParamSetupReq_ // *MACCommand_RekeyInd_ // *MACCommand_RekeyConf_ // *MACCommand_AdrParamSetupReq @@ -3288,13 +3980,24 @@ type MACCommand struct { // *MACCommand_BeaconFreqAns_ // *MACCommand_DeviceModeInd_ // *MACCommand_DeviceModeConf_ + // *MACCommand_RelayConfReq_ + // *MACCommand_RelayConfAns_ + // *MACCommand_RelayEndDeviceConfReq_ + // *MACCommand_RelayEndDeviceConfAns_ + // *MACCommand_RelayUpdateUplinkListReq_ + // *MACCommand_RelayUpdateUplinkListAns_ + // *MACCommand_RelayCtrlUplinkListReq_ + // *MACCommand_RelayCtrlUplinkListAns_ + // *MACCommand_RelayConfigureFwdLimitReq_ + // *MACCommand_RelayConfigureFwdLimitAns_ + // *MACCommand_RelayNotifyNewEndDeviceReq_ Payload isMACCommand_Payload `protobuf_oneof:"payload"` } func (x *MACCommand) Reset() { *x = MACCommand{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[20] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3307,7 +4010,7 @@ func (x *MACCommand) String() string { func (*MACCommand) ProtoMessage() {} func (x *MACCommand) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[20] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3320,7 +4023,7 @@ func (x *MACCommand) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand.ProtoReflect.Descriptor instead. func (*MACCommand) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26} } func (x *MACCommand) GetCid() MACCommandIdentifier { @@ -3554,12 +4257,89 @@ func (x *MACCommand) GetDeviceModeConf() *MACCommand_DeviceModeConf { return nil } -type isMACCommand_Payload interface { - isMACCommand_Payload() +func (x *MACCommand) GetRelayConfReq() *MACCommand_RelayConfReq { + if x, ok := x.GetPayload().(*MACCommand_RelayConfReq_); ok { + return x.RelayConfReq + } + return nil } -type MACCommand_RawPayload struct { - RawPayload []byte `protobuf:"bytes,2,opt,name=raw_payload,json=rawPayload,proto3,oneof"` +func (x *MACCommand) GetRelayConfAns() *MACCommand_RelayConfAns { + if x, ok := x.GetPayload().(*MACCommand_RelayConfAns_); ok { + return x.RelayConfAns + } + return nil +} + +func (x *MACCommand) GetRelayEndDeviceConfReq() *MACCommand_RelayEndDeviceConfReq { + if x, ok := x.GetPayload().(*MACCommand_RelayEndDeviceConfReq_); ok { + return x.RelayEndDeviceConfReq + } + return nil +} + +func (x *MACCommand) GetRelayEndDeviceConfAns() *MACCommand_RelayEndDeviceConfAns { + if x, ok := x.GetPayload().(*MACCommand_RelayEndDeviceConfAns_); ok { + return x.RelayEndDeviceConfAns + } + return nil +} + +func (x *MACCommand) GetRelayUpdateUplinkListReq() *MACCommand_RelayUpdateUplinkListReq { + if x, ok := x.GetPayload().(*MACCommand_RelayUpdateUplinkListReq_); ok { + return x.RelayUpdateUplinkListReq + } + return nil +} + +func (x *MACCommand) GetRelayUpdateUplinkListAns() *MACCommand_RelayUpdateUplinkListAns { + if x, ok := x.GetPayload().(*MACCommand_RelayUpdateUplinkListAns_); ok { + return x.RelayUpdateUplinkListAns + } + return nil +} + +func (x *MACCommand) GetRelayCtrlUplinkListReq() *MACCommand_RelayCtrlUplinkListReq { + if x, ok := x.GetPayload().(*MACCommand_RelayCtrlUplinkListReq_); ok { + return x.RelayCtrlUplinkListReq + } + return nil +} + +func (x *MACCommand) GetRelayCtrlUplinkListAns() *MACCommand_RelayCtrlUplinkListAns { + if x, ok := x.GetPayload().(*MACCommand_RelayCtrlUplinkListAns_); ok { + return x.RelayCtrlUplinkListAns + } + return nil +} + +func (x *MACCommand) GetRelayConfigureFwdLimitReq() *MACCommand_RelayConfigureFwdLimitReq { + if x, ok := x.GetPayload().(*MACCommand_RelayConfigureFwdLimitReq_); ok { + return x.RelayConfigureFwdLimitReq + } + return nil +} + +func (x *MACCommand) GetRelayConfigureFwdLimitAns() *MACCommand_RelayConfigureFwdLimitAns { + if x, ok := x.GetPayload().(*MACCommand_RelayConfigureFwdLimitAns_); ok { + return x.RelayConfigureFwdLimitAns + } + return nil +} + +func (x *MACCommand) GetRelayNotifyNewEndDeviceReq() *MACCommand_RelayNotifyNewEndDeviceReq { + if x, ok := x.GetPayload().(*MACCommand_RelayNotifyNewEndDeviceReq_); ok { + return x.RelayNotifyNewEndDeviceReq + } + return nil +} + +type isMACCommand_Payload interface { + isMACCommand_Payload() +} + +type MACCommand_RawPayload struct { + RawPayload []byte `protobuf:"bytes,2,opt,name=raw_payload,json=rawPayload,proto3,oneof"` } type MACCommand_ResetInd_ struct { @@ -3682,6 +4462,50 @@ type MACCommand_DeviceModeConf_ struct { DeviceModeConf *MACCommand_DeviceModeConf `protobuf:"bytes,32,opt,name=device_mode_conf,json=deviceModeConf,proto3,oneof"` } +type MACCommand_RelayConfReq_ struct { + RelayConfReq *MACCommand_RelayConfReq `protobuf:"bytes,33,opt,name=relay_conf_req,json=relayConfReq,proto3,oneof"` +} + +type MACCommand_RelayConfAns_ struct { + RelayConfAns *MACCommand_RelayConfAns `protobuf:"bytes,34,opt,name=relay_conf_ans,json=relayConfAns,proto3,oneof"` +} + +type MACCommand_RelayEndDeviceConfReq_ struct { + RelayEndDeviceConfReq *MACCommand_RelayEndDeviceConfReq `protobuf:"bytes,35,opt,name=relay_end_device_conf_req,json=relayEndDeviceConfReq,proto3,oneof"` +} + +type MACCommand_RelayEndDeviceConfAns_ struct { + RelayEndDeviceConfAns *MACCommand_RelayEndDeviceConfAns `protobuf:"bytes,36,opt,name=relay_end_device_conf_ans,json=relayEndDeviceConfAns,proto3,oneof"` +} + +type MACCommand_RelayUpdateUplinkListReq_ struct { + RelayUpdateUplinkListReq *MACCommand_RelayUpdateUplinkListReq `protobuf:"bytes,39,opt,name=relay_update_uplink_list_req,json=relayUpdateUplinkListReq,proto3,oneof"` +} + +type MACCommand_RelayUpdateUplinkListAns_ struct { + RelayUpdateUplinkListAns *MACCommand_RelayUpdateUplinkListAns `protobuf:"bytes,40,opt,name=relay_update_uplink_list_ans,json=relayUpdateUplinkListAns,proto3,oneof"` +} + +type MACCommand_RelayCtrlUplinkListReq_ struct { + RelayCtrlUplinkListReq *MACCommand_RelayCtrlUplinkListReq `protobuf:"bytes,41,opt,name=relay_ctrl_uplink_list_req,json=relayCtrlUplinkListReq,proto3,oneof"` +} + +type MACCommand_RelayCtrlUplinkListAns_ struct { + RelayCtrlUplinkListAns *MACCommand_RelayCtrlUplinkListAns `protobuf:"bytes,42,opt,name=relay_ctrl_uplink_list_ans,json=relayCtrlUplinkListAns,proto3,oneof"` +} + +type MACCommand_RelayConfigureFwdLimitReq_ struct { + RelayConfigureFwdLimitReq *MACCommand_RelayConfigureFwdLimitReq `protobuf:"bytes,43,opt,name=relay_configure_fwd_limit_req,json=relayConfigureFwdLimitReq,proto3,oneof"` +} + +type MACCommand_RelayConfigureFwdLimitAns_ struct { + RelayConfigureFwdLimitAns *MACCommand_RelayConfigureFwdLimitAns `protobuf:"bytes,44,opt,name=relay_configure_fwd_limit_ans,json=relayConfigureFwdLimitAns,proto3,oneof"` +} + +type MACCommand_RelayNotifyNewEndDeviceReq_ struct { + RelayNotifyNewEndDeviceReq *MACCommand_RelayNotifyNewEndDeviceReq `protobuf:"bytes,45,opt,name=relay_notify_new_end_device_req,json=relayNotifyNewEndDeviceReq,proto3,oneof"` +} + func (*MACCommand_RawPayload) isMACCommand_Payload() {} func (*MACCommand_ResetInd_) isMACCommand_Payload() {} @@ -3744,6 +4568,28 @@ func (*MACCommand_DeviceModeInd_) isMACCommand_Payload() {} func (*MACCommand_DeviceModeConf_) isMACCommand_Payload() {} +func (*MACCommand_RelayConfReq_) isMACCommand_Payload() {} + +func (*MACCommand_RelayConfAns_) isMACCommand_Payload() {} + +func (*MACCommand_RelayEndDeviceConfReq_) isMACCommand_Payload() {} + +func (*MACCommand_RelayEndDeviceConfAns_) isMACCommand_Payload() {} + +func (*MACCommand_RelayUpdateUplinkListReq_) isMACCommand_Payload() {} + +func (*MACCommand_RelayUpdateUplinkListAns_) isMACCommand_Payload() {} + +func (*MACCommand_RelayCtrlUplinkListReq_) isMACCommand_Payload() {} + +func (*MACCommand_RelayCtrlUplinkListAns_) isMACCommand_Payload() {} + +func (*MACCommand_RelayConfigureFwdLimitReq_) isMACCommand_Payload() {} + +func (*MACCommand_RelayConfigureFwdLimitAns_) isMACCommand_Payload() {} + +func (*MACCommand_RelayNotifyNewEndDeviceReq_) isMACCommand_Payload() {} + type MACCommands struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3755,7 +4601,7 @@ type MACCommands struct { func (x *MACCommands) Reset() { *x = MACCommands{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[21] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3768,7 +4614,7 @@ func (x *MACCommands) String() string { func (*MACCommands) ProtoMessage() {} func (x *MACCommands) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[21] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3781,7 +4627,7 @@ func (x *MACCommands) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommands.ProtoReflect.Descriptor instead. func (*MACCommands) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{21} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{27} } func (x *MACCommands) GetCommands() []*MACCommand { @@ -3802,7 +4648,7 @@ type FrequencyValue struct { func (x *FrequencyValue) Reset() { *x = FrequencyValue{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[22] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3815,7 +4661,7 @@ func (x *FrequencyValue) String() string { func (*FrequencyValue) ProtoMessage() {} func (x *FrequencyValue) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[22] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3828,7 +4674,7 @@ func (x *FrequencyValue) ProtoReflect() protoreflect.Message { // Deprecated: Use FrequencyValue.ProtoReflect.Descriptor instead. func (*FrequencyValue) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{22} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{28} } func (x *FrequencyValue) GetValue() uint64 { @@ -3849,7 +4695,7 @@ type ZeroableFrequencyValue struct { func (x *ZeroableFrequencyValue) Reset() { *x = ZeroableFrequencyValue{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[23] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3862,7 +4708,7 @@ func (x *ZeroableFrequencyValue) String() string { func (*ZeroableFrequencyValue) ProtoMessage() {} func (x *ZeroableFrequencyValue) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[23] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3875,7 +4721,7 @@ func (x *ZeroableFrequencyValue) ProtoReflect() protoreflect.Message { // Deprecated: Use ZeroableFrequencyValue.ProtoReflect.Descriptor instead. func (*ZeroableFrequencyValue) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{23} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{29} } func (x *ZeroableFrequencyValue) GetValue() uint64 { @@ -3896,7 +4742,7 @@ type DataRateOffsetValue struct { func (x *DataRateOffsetValue) Reset() { *x = DataRateOffsetValue{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[24] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3909,7 +4755,7 @@ func (x *DataRateOffsetValue) String() string { func (*DataRateOffsetValue) ProtoMessage() {} func (x *DataRateOffsetValue) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[24] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3922,7 +4768,7 @@ func (x *DataRateOffsetValue) ProtoReflect() protoreflect.Message { // Deprecated: Use DataRateOffsetValue.ProtoReflect.Descriptor instead. func (*DataRateOffsetValue) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{24} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{30} } func (x *DataRateOffsetValue) GetValue() DataRateOffset { @@ -3943,7 +4789,7 @@ type DataRateIndexValue struct { func (x *DataRateIndexValue) Reset() { *x = DataRateIndexValue{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[25] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3956,7 +4802,7 @@ func (x *DataRateIndexValue) String() string { func (*DataRateIndexValue) ProtoMessage() {} func (x *DataRateIndexValue) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[25] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3969,7 +4815,7 @@ func (x *DataRateIndexValue) ProtoReflect() protoreflect.Message { // Deprecated: Use DataRateIndexValue.ProtoReflect.Descriptor instead. func (*DataRateIndexValue) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{25} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{31} } func (x *DataRateIndexValue) GetValue() DataRateIndex { @@ -3990,7 +4836,7 @@ type PingSlotPeriodValue struct { func (x *PingSlotPeriodValue) Reset() { *x = PingSlotPeriodValue{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[26] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4003,7 +4849,7 @@ func (x *PingSlotPeriodValue) String() string { func (*PingSlotPeriodValue) ProtoMessage() {} func (x *PingSlotPeriodValue) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[26] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4016,7 +4862,7 @@ func (x *PingSlotPeriodValue) ProtoReflect() protoreflect.Message { // Deprecated: Use PingSlotPeriodValue.ProtoReflect.Descriptor instead. func (*PingSlotPeriodValue) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{32} } func (x *PingSlotPeriodValue) GetValue() PingSlotPeriod { @@ -4037,7 +4883,7 @@ type AggregatedDutyCycleValue struct { func (x *AggregatedDutyCycleValue) Reset() { *x = AggregatedDutyCycleValue{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[27] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4050,7 +4896,7 @@ func (x *AggregatedDutyCycleValue) String() string { func (*AggregatedDutyCycleValue) ProtoMessage() {} func (x *AggregatedDutyCycleValue) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[27] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4063,7 +4909,7 @@ func (x *AggregatedDutyCycleValue) ProtoReflect() protoreflect.Message { // Deprecated: Use AggregatedDutyCycleValue.ProtoReflect.Descriptor instead. func (*AggregatedDutyCycleValue) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{27} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{33} } func (x *AggregatedDutyCycleValue) GetValue() AggregatedDutyCycle { @@ -4084,7 +4930,7 @@ type RxDelayValue struct { func (x *RxDelayValue) Reset() { *x = RxDelayValue{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[28] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4097,7 +4943,7 @@ func (x *RxDelayValue) String() string { func (*RxDelayValue) ProtoMessage() {} func (x *RxDelayValue) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[28] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4110,7 +4956,7 @@ func (x *RxDelayValue) ProtoReflect() protoreflect.Message { // Deprecated: Use RxDelayValue.ProtoReflect.Descriptor instead. func (*RxDelayValue) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{28} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{34} } func (x *RxDelayValue) GetValue() RxDelay { @@ -4131,7 +4977,7 @@ type ADRAckLimitExponentValue struct { func (x *ADRAckLimitExponentValue) Reset() { *x = ADRAckLimitExponentValue{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[29] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4144,7 +4990,7 @@ func (x *ADRAckLimitExponentValue) String() string { func (*ADRAckLimitExponentValue) ProtoMessage() {} func (x *ADRAckLimitExponentValue) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[29] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4157,7 +5003,7 @@ func (x *ADRAckLimitExponentValue) ProtoReflect() protoreflect.Message { // Deprecated: Use ADRAckLimitExponentValue.ProtoReflect.Descriptor instead. func (*ADRAckLimitExponentValue) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{29} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{35} } func (x *ADRAckLimitExponentValue) GetValue() ADRAckLimitExponent { @@ -4178,7 +5024,7 @@ type ADRAckDelayExponentValue struct { func (x *ADRAckDelayExponentValue) Reset() { *x = ADRAckDelayExponentValue{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[30] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4191,7 +5037,7 @@ func (x *ADRAckDelayExponentValue) String() string { func (*ADRAckDelayExponentValue) ProtoMessage() {} func (x *ADRAckDelayExponentValue) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[30] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4204,7 +5050,7 @@ func (x *ADRAckDelayExponentValue) ProtoReflect() protoreflect.Message { // Deprecated: Use ADRAckDelayExponentValue.ProtoReflect.Descriptor instead. func (*ADRAckDelayExponentValue) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{30} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{36} } func (x *ADRAckDelayExponentValue) GetValue() ADRAckDelayExponent { @@ -4225,7 +5071,7 @@ type DeviceEIRPValue struct { func (x *DeviceEIRPValue) Reset() { *x = DeviceEIRPValue{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[31] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4238,7 +5084,7 @@ func (x *DeviceEIRPValue) String() string { func (*DeviceEIRPValue) ProtoMessage() {} func (x *DeviceEIRPValue) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[31] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4251,7 +5097,7 @@ func (x *DeviceEIRPValue) ProtoReflect() protoreflect.Message { // Deprecated: Use DeviceEIRPValue.ProtoReflect.Descriptor instead. func (*DeviceEIRPValue) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{31} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{37} } func (x *DeviceEIRPValue) GetValue() DeviceEIRP { @@ -4261,37 +5107,36 @@ func (x *DeviceEIRPValue) GetValue() DeviceEIRP { return DeviceEIRP_DEVICE_EIRP_8 } -// Transmission settings for downlink. -type TxSettings_Downlink struct { +type RelayForwardUplinkReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Index of the antenna on which the uplink was received and/or downlink must be sent. - AntennaIndex uint32 `protobuf:"varint,1,opt,name=antenna_index,json=antennaIndex,proto3" json:"antenna_index,omitempty"` - // Transmission power (dBm). Only on downlink. - TxPower float32 `protobuf:"fixed32,2,opt,name=tx_power,json=txPower,proto3" json:"tx_power,omitempty"` - // Invert LoRa polarization; false for LoRaWAN uplink, true for downlink. - InvertPolarization bool `protobuf:"varint,3,opt,name=invert_polarization,json=invertPolarization,proto3" json:"invert_polarization,omitempty"` + DataRate *DataRate `protobuf:"bytes,1,opt,name=data_rate,json=dataRate,proto3" json:"data_rate,omitempty"` + Snr int32 `protobuf:"varint,2,opt,name=snr,proto3" json:"snr,omitempty"` + Rssi int32 `protobuf:"varint,3,opt,name=rssi,proto3" json:"rssi,omitempty"` + WorChannel RelayWORChannel `protobuf:"varint,4,opt,name=wor_channel,json=worChannel,proto3,enum=ttn.lorawan.v3.RelayWORChannel" json:"wor_channel,omitempty"` + Frequency uint64 `protobuf:"varint,5,opt,name=frequency,proto3" json:"frequency,omitempty"` // Uplink channel frequency (Hz). + RawPayload []byte `protobuf:"bytes,6,opt,name=raw_payload,json=rawPayload,proto3" json:"raw_payload,omitempty"` } -func (x *TxSettings_Downlink) Reset() { - *x = TxSettings_Downlink{} +func (x *RelayForwardUplinkReq) Reset() { + *x = RelayForwardUplinkReq{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[32] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TxSettings_Downlink) String() string { +func (x *RelayForwardUplinkReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TxSettings_Downlink) ProtoMessage() {} +func (*RelayForwardUplinkReq) ProtoMessage() {} -func (x *TxSettings_Downlink) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[32] +func (x *RelayForwardUplinkReq) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4302,57 +5147,78 @@ func (x *TxSettings_Downlink) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TxSettings_Downlink.ProtoReflect.Descriptor instead. -func (*TxSettings_Downlink) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{14, 0} +// Deprecated: Use RelayForwardUplinkReq.ProtoReflect.Descriptor instead. +func (*RelayForwardUplinkReq) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{38} } -func (x *TxSettings_Downlink) GetAntennaIndex() uint32 { +func (x *RelayForwardUplinkReq) GetDataRate() *DataRate { if x != nil { - return x.AntennaIndex + return x.DataRate + } + return nil +} + +func (x *RelayForwardUplinkReq) GetSnr() int32 { + if x != nil { + return x.Snr } return 0 } -func (x *TxSettings_Downlink) GetTxPower() float32 { +func (x *RelayForwardUplinkReq) GetRssi() int32 { if x != nil { - return x.TxPower + return x.Rssi } return 0 } -func (x *TxSettings_Downlink) GetInvertPolarization() bool { +func (x *RelayForwardUplinkReq) GetWorChannel() RelayWORChannel { if x != nil { - return x.InvertPolarization + return x.WorChannel } - return false + return RelayWORChannel_RELAY_WOR_CHANNEL_DEFAULT } -type MACCommand_ResetInd struct { +func (x *RelayForwardUplinkReq) GetFrequency() uint64 { + if x != nil { + return x.Frequency + } + return 0 +} + +func (x *RelayForwardUplinkReq) GetRawPayload() []byte { + if x != nil { + return x.RawPayload + } + return nil +} + +type RelayForwardDownlinkReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MinorVersion Minor `protobuf:"varint,1,opt,name=minor_version,json=minorVersion,proto3,enum=ttn.lorawan.v3.Minor" json:"minor_version,omitempty"` + RawPayload []byte `protobuf:"bytes,1,opt,name=raw_payload,json=rawPayload,proto3" json:"raw_payload,omitempty"` } -func (x *MACCommand_ResetInd) Reset() { - *x = MACCommand_ResetInd{} +func (x *RelayForwardDownlinkReq) Reset() { + *x = RelayForwardDownlinkReq{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[33] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *MACCommand_ResetInd) String() string { +func (x *RelayForwardDownlinkReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MACCommand_ResetInd) ProtoMessage() {} +func (*RelayForwardDownlinkReq) ProtoMessage() {} -func (x *MACCommand_ResetInd) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[33] +func (x *RelayForwardDownlinkReq) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4363,43 +5229,45 @@ func (x *MACCommand_ResetInd) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MACCommand_ResetInd.ProtoReflect.Descriptor instead. -func (*MACCommand_ResetInd) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 0} +// Deprecated: Use RelayForwardDownlinkReq.ProtoReflect.Descriptor instead. +func (*RelayForwardDownlinkReq) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{39} } -func (x *MACCommand_ResetInd) GetMinorVersion() Minor { +func (x *RelayForwardDownlinkReq) GetRawPayload() []byte { if x != nil { - return x.MinorVersion + return x.RawPayload } - return Minor_MINOR_RFU_0 + return nil } -type MACCommand_ResetConf struct { +type RelayUplinkToken struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MinorVersion Minor `protobuf:"varint,1,opt,name=minor_version,json=minorVersion,proto3,enum=ttn.lorawan.v3.Minor" json:"minor_version,omitempty"` + Ids *EndDeviceIdentifiers `protobuf:"bytes,1,opt,name=ids,proto3" json:"ids,omitempty"` + SessionKeyId []byte `protobuf:"bytes,2,opt,name=session_key_id,json=sessionKeyId,proto3" json:"session_key_id,omitempty"` + FullFCnt uint32 `protobuf:"varint,3,opt,name=full_f_cnt,json=fullFCnt,proto3" json:"full_f_cnt,omitempty"` } -func (x *MACCommand_ResetConf) Reset() { - *x = MACCommand_ResetConf{} +func (x *RelayUplinkToken) Reset() { + *x = RelayUplinkToken{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[34] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *MACCommand_ResetConf) String() string { +func (x *RelayUplinkToken) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MACCommand_ResetConf) ProtoMessage() {} +func (*RelayUplinkToken) ProtoMessage() {} -func (x *MACCommand_ResetConf) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[34] +func (x *RelayUplinkToken) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4410,45 +5278,63 @@ func (x *MACCommand_ResetConf) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MACCommand_ResetConf.ProtoReflect.Descriptor instead. -func (*MACCommand_ResetConf) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 1} +// Deprecated: Use RelayUplinkToken.ProtoReflect.Descriptor instead. +func (*RelayUplinkToken) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{40} } -func (x *MACCommand_ResetConf) GetMinorVersion() Minor { +func (x *RelayUplinkToken) GetIds() *EndDeviceIdentifiers { if x != nil { - return x.MinorVersion + return x.Ids } - return Minor_MINOR_RFU_0 + return nil } -type MACCommand_LinkCheckAns struct { +func (x *RelayUplinkToken) GetSessionKeyId() []byte { + if x != nil { + return x.SessionKeyId + } + return nil +} + +func (x *RelayUplinkToken) GetFullFCnt() uint32 { + if x != nil { + return x.FullFCnt + } + return 0 +} + +// Transmission settings for downlink. +type TxSettings_Downlink struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Indicates the link margin in dB of the received LinkCheckReq, relative to the demodulation floor. - Margin uint32 `protobuf:"varint,1,opt,name=margin,proto3" json:"margin,omitempty"` - GatewayCount uint32 `protobuf:"varint,2,opt,name=gateway_count,json=gatewayCount,proto3" json:"gateway_count,omitempty"` + // Index of the antenna on which the uplink was received and/or downlink must be sent. + AntennaIndex uint32 `protobuf:"varint,1,opt,name=antenna_index,json=antennaIndex,proto3" json:"antenna_index,omitempty"` + // Transmission power (dBm). Only on downlink. + TxPower float32 `protobuf:"fixed32,2,opt,name=tx_power,json=txPower,proto3" json:"tx_power,omitempty"` + // Invert LoRa polarization; false for LoRaWAN uplink, true for downlink. + InvertPolarization bool `protobuf:"varint,3,opt,name=invert_polarization,json=invertPolarization,proto3" json:"invert_polarization,omitempty"` } -func (x *MACCommand_LinkCheckAns) Reset() { - *x = MACCommand_LinkCheckAns{} +func (x *TxSettings_Downlink) Reset() { + *x = TxSettings_Downlink{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[35] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *MACCommand_LinkCheckAns) String() string { +func (x *TxSettings_Downlink) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MACCommand_LinkCheckAns) ProtoMessage() {} +func (*TxSettings_Downlink) ProtoMessage() {} -func (x *MACCommand_LinkCheckAns) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[35] +func (x *TxSettings_Downlink) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4459,9 +5345,166 @@ func (x *MACCommand_LinkCheckAns) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MACCommand_LinkCheckAns.ProtoReflect.Descriptor instead. +// Deprecated: Use TxSettings_Downlink.ProtoReflect.Descriptor instead. +func (*TxSettings_Downlink) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{14, 0} +} + +func (x *TxSettings_Downlink) GetAntennaIndex() uint32 { + if x != nil { + return x.AntennaIndex + } + return 0 +} + +func (x *TxSettings_Downlink) GetTxPower() float32 { + if x != nil { + return x.TxPower + } + return 0 +} + +func (x *TxSettings_Downlink) GetInvertPolarization() bool { + if x != nil { + return x.InvertPolarization + } + return false +} + +type MACCommand_ResetInd struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MinorVersion Minor `protobuf:"varint,1,opt,name=minor_version,json=minorVersion,proto3,enum=ttn.lorawan.v3.Minor" json:"minor_version,omitempty"` +} + +func (x *MACCommand_ResetInd) Reset() { + *x = MACCommand_ResetInd{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MACCommand_ResetInd) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MACCommand_ResetInd) ProtoMessage() {} + +func (x *MACCommand_ResetInd) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[42] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MACCommand_ResetInd.ProtoReflect.Descriptor instead. +func (*MACCommand_ResetInd) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 0} +} + +func (x *MACCommand_ResetInd) GetMinorVersion() Minor { + if x != nil { + return x.MinorVersion + } + return Minor_MINOR_RFU_0 +} + +type MACCommand_ResetConf struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MinorVersion Minor `protobuf:"varint,1,opt,name=minor_version,json=minorVersion,proto3,enum=ttn.lorawan.v3.Minor" json:"minor_version,omitempty"` +} + +func (x *MACCommand_ResetConf) Reset() { + *x = MACCommand_ResetConf{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MACCommand_ResetConf) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MACCommand_ResetConf) ProtoMessage() {} + +func (x *MACCommand_ResetConf) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[43] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MACCommand_ResetConf.ProtoReflect.Descriptor instead. +func (*MACCommand_ResetConf) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 1} +} + +func (x *MACCommand_ResetConf) GetMinorVersion() Minor { + if x != nil { + return x.MinorVersion + } + return Minor_MINOR_RFU_0 +} + +type MACCommand_LinkCheckAns struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Indicates the link margin in dB of the received LinkCheckReq, relative to the demodulation floor. + Margin uint32 `protobuf:"varint,1,opt,name=margin,proto3" json:"margin,omitempty"` + GatewayCount uint32 `protobuf:"varint,2,opt,name=gateway_count,json=gatewayCount,proto3" json:"gateway_count,omitempty"` +} + +func (x *MACCommand_LinkCheckAns) Reset() { + *x = MACCommand_LinkCheckAns{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MACCommand_LinkCheckAns) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MACCommand_LinkCheckAns) ProtoMessage() {} + +func (x *MACCommand_LinkCheckAns) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[44] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MACCommand_LinkCheckAns.ProtoReflect.Descriptor instead. func (*MACCommand_LinkCheckAns) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 2} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 2} } func (x *MACCommand_LinkCheckAns) GetMargin() uint32 { @@ -4493,7 +5536,7 @@ type MACCommand_LinkADRReq struct { func (x *MACCommand_LinkADRReq) Reset() { *x = MACCommand_LinkADRReq{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[36] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4506,7 +5549,7 @@ func (x *MACCommand_LinkADRReq) String() string { func (*MACCommand_LinkADRReq) ProtoMessage() {} func (x *MACCommand_LinkADRReq) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[36] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4519,7 +5562,7 @@ func (x *MACCommand_LinkADRReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_LinkADRReq.ProtoReflect.Descriptor instead. func (*MACCommand_LinkADRReq) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 3} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 3} } func (x *MACCommand_LinkADRReq) GetDataRateIndex() DataRateIndex { @@ -4570,7 +5613,7 @@ type MACCommand_LinkADRAns struct { func (x *MACCommand_LinkADRAns) Reset() { *x = MACCommand_LinkADRAns{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[37] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4583,7 +5626,7 @@ func (x *MACCommand_LinkADRAns) String() string { func (*MACCommand_LinkADRAns) ProtoMessage() {} func (x *MACCommand_LinkADRAns) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[37] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4596,7 +5639,7 @@ func (x *MACCommand_LinkADRAns) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_LinkADRAns.ProtoReflect.Descriptor instead. func (*MACCommand_LinkADRAns) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 4} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 4} } func (x *MACCommand_LinkADRAns) GetChannelMaskAck() bool { @@ -4631,7 +5674,7 @@ type MACCommand_DutyCycleReq struct { func (x *MACCommand_DutyCycleReq) Reset() { *x = MACCommand_DutyCycleReq{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[38] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4644,7 +5687,7 @@ func (x *MACCommand_DutyCycleReq) String() string { func (*MACCommand_DutyCycleReq) ProtoMessage() {} func (x *MACCommand_DutyCycleReq) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[38] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4657,7 +5700,7 @@ func (x *MACCommand_DutyCycleReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_DutyCycleReq.ProtoReflect.Descriptor instead. func (*MACCommand_DutyCycleReq) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 5} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 5} } func (x *MACCommand_DutyCycleReq) GetMaxDutyCycle() AggregatedDutyCycle { @@ -4680,7 +5723,7 @@ type MACCommand_RxParamSetupReq struct { func (x *MACCommand_RxParamSetupReq) Reset() { *x = MACCommand_RxParamSetupReq{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[39] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4693,7 +5736,7 @@ func (x *MACCommand_RxParamSetupReq) String() string { func (*MACCommand_RxParamSetupReq) ProtoMessage() {} func (x *MACCommand_RxParamSetupReq) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[39] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4706,7 +5749,7 @@ func (x *MACCommand_RxParamSetupReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_RxParamSetupReq.ProtoReflect.Descriptor instead. func (*MACCommand_RxParamSetupReq) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 6} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 6} } func (x *MACCommand_RxParamSetupReq) GetRx2DataRateIndex() DataRateIndex { @@ -4743,7 +5786,7 @@ type MACCommand_RxParamSetupAns struct { func (x *MACCommand_RxParamSetupAns) Reset() { *x = MACCommand_RxParamSetupAns{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[40] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4756,7 +5799,7 @@ func (x *MACCommand_RxParamSetupAns) String() string { func (*MACCommand_RxParamSetupAns) ProtoMessage() {} func (x *MACCommand_RxParamSetupAns) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[40] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4769,7 +5812,7 @@ func (x *MACCommand_RxParamSetupAns) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_RxParamSetupAns.ProtoReflect.Descriptor instead. func (*MACCommand_RxParamSetupAns) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 7} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 7} } func (x *MACCommand_RxParamSetupAns) GetRx2DataRateIndexAck() bool { @@ -4810,7 +5853,7 @@ type MACCommand_DevStatusAns struct { func (x *MACCommand_DevStatusAns) Reset() { *x = MACCommand_DevStatusAns{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[41] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4823,7 +5866,7 @@ func (x *MACCommand_DevStatusAns) String() string { func (*MACCommand_DevStatusAns) ProtoMessage() {} func (x *MACCommand_DevStatusAns) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[41] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4836,7 +5879,7 @@ func (x *MACCommand_DevStatusAns) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_DevStatusAns.ProtoReflect.Descriptor instead. func (*MACCommand_DevStatusAns) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 8} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 8} } func (x *MACCommand_DevStatusAns) GetBattery() uint32 { @@ -4867,7 +5910,7 @@ type MACCommand_NewChannelReq struct { func (x *MACCommand_NewChannelReq) Reset() { *x = MACCommand_NewChannelReq{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[42] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4880,7 +5923,7 @@ func (x *MACCommand_NewChannelReq) String() string { func (*MACCommand_NewChannelReq) ProtoMessage() {} func (x *MACCommand_NewChannelReq) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[42] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4893,7 +5936,7 @@ func (x *MACCommand_NewChannelReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_NewChannelReq.ProtoReflect.Descriptor instead. func (*MACCommand_NewChannelReq) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 9} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 9} } func (x *MACCommand_NewChannelReq) GetChannelIndex() uint32 { @@ -4936,7 +5979,7 @@ type MACCommand_NewChannelAns struct { func (x *MACCommand_NewChannelAns) Reset() { *x = MACCommand_NewChannelAns{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[43] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4949,7 +5992,7 @@ func (x *MACCommand_NewChannelAns) String() string { func (*MACCommand_NewChannelAns) ProtoMessage() {} func (x *MACCommand_NewChannelAns) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[43] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4962,7 +6005,7 @@ func (x *MACCommand_NewChannelAns) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_NewChannelAns.ProtoReflect.Descriptor instead. func (*MACCommand_NewChannelAns) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 10} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 10} } func (x *MACCommand_NewChannelAns) GetFrequencyAck() bool { @@ -4991,7 +6034,7 @@ type MACCommand_DLChannelReq struct { func (x *MACCommand_DLChannelReq) Reset() { *x = MACCommand_DLChannelReq{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[44] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5004,7 +6047,7 @@ func (x *MACCommand_DLChannelReq) String() string { func (*MACCommand_DLChannelReq) ProtoMessage() {} func (x *MACCommand_DLChannelReq) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[44] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5017,7 +6060,7 @@ func (x *MACCommand_DLChannelReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_DLChannelReq.ProtoReflect.Descriptor instead. func (*MACCommand_DLChannelReq) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 11} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 11} } func (x *MACCommand_DLChannelReq) GetChannelIndex() uint32 { @@ -5046,7 +6089,7 @@ type MACCommand_DLChannelAns struct { func (x *MACCommand_DLChannelAns) Reset() { *x = MACCommand_DLChannelAns{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[45] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5059,7 +6102,7 @@ func (x *MACCommand_DLChannelAns) String() string { func (*MACCommand_DLChannelAns) ProtoMessage() {} func (x *MACCommand_DLChannelAns) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[45] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5072,7 +6115,7 @@ func (x *MACCommand_DLChannelAns) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_DLChannelAns.ProtoReflect.Descriptor instead. func (*MACCommand_DLChannelAns) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 12} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 12} } func (x *MACCommand_DLChannelAns) GetChannelIndexAck() bool { @@ -5100,7 +6143,7 @@ type MACCommand_RxTimingSetupReq struct { func (x *MACCommand_RxTimingSetupReq) Reset() { *x = MACCommand_RxTimingSetupReq{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[46] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5113,7 +6156,7 @@ func (x *MACCommand_RxTimingSetupReq) String() string { func (*MACCommand_RxTimingSetupReq) ProtoMessage() {} func (x *MACCommand_RxTimingSetupReq) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[46] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5126,7 +6169,7 @@ func (x *MACCommand_RxTimingSetupReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_RxTimingSetupReq.ProtoReflect.Descriptor instead. func (*MACCommand_RxTimingSetupReq) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 13} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 13} } func (x *MACCommand_RxTimingSetupReq) GetDelay() RxDelay { @@ -5151,7 +6194,7 @@ type MACCommand_TxParamSetupReq struct { func (x *MACCommand_TxParamSetupReq) Reset() { *x = MACCommand_TxParamSetupReq{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[47] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5164,7 +6207,7 @@ func (x *MACCommand_TxParamSetupReq) String() string { func (*MACCommand_TxParamSetupReq) ProtoMessage() {} func (x *MACCommand_TxParamSetupReq) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[47] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5177,7 +6220,7 @@ func (x *MACCommand_TxParamSetupReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_TxParamSetupReq.ProtoReflect.Descriptor instead. func (*MACCommand_TxParamSetupReq) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 14} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 14} } func (x *MACCommand_TxParamSetupReq) GetMaxEirpIndex() DeviceEIRP { @@ -5212,7 +6255,7 @@ type MACCommand_RekeyInd struct { func (x *MACCommand_RekeyInd) Reset() { *x = MACCommand_RekeyInd{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[48] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5225,7 +6268,7 @@ func (x *MACCommand_RekeyInd) String() string { func (*MACCommand_RekeyInd) ProtoMessage() {} func (x *MACCommand_RekeyInd) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[48] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5238,7 +6281,7 @@ func (x *MACCommand_RekeyInd) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_RekeyInd.ProtoReflect.Descriptor instead. func (*MACCommand_RekeyInd) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 15} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 15} } func (x *MACCommand_RekeyInd) GetMinorVersion() Minor { @@ -5259,7 +6302,7 @@ type MACCommand_RekeyConf struct { func (x *MACCommand_RekeyConf) Reset() { *x = MACCommand_RekeyConf{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[49] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5272,7 +6315,7 @@ func (x *MACCommand_RekeyConf) String() string { func (*MACCommand_RekeyConf) ProtoMessage() {} func (x *MACCommand_RekeyConf) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[49] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5285,7 +6328,7 @@ func (x *MACCommand_RekeyConf) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_RekeyConf.ProtoReflect.Descriptor instead. func (*MACCommand_RekeyConf) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 16} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 16} } func (x *MACCommand_RekeyConf) GetMinorVersion() Minor { @@ -5309,7 +6352,7 @@ type MACCommand_ADRParamSetupReq struct { func (x *MACCommand_ADRParamSetupReq) Reset() { *x = MACCommand_ADRParamSetupReq{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[50] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5322,7 +6365,7 @@ func (x *MACCommand_ADRParamSetupReq) String() string { func (*MACCommand_ADRParamSetupReq) ProtoMessage() {} func (x *MACCommand_ADRParamSetupReq) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[50] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5335,7 +6378,7 @@ func (x *MACCommand_ADRParamSetupReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_ADRParamSetupReq.ProtoReflect.Descriptor instead. func (*MACCommand_ADRParamSetupReq) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 17} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 17} } func (x *MACCommand_ADRParamSetupReq) GetAdrAckLimitExponent() ADRAckLimitExponent { @@ -5363,7 +6406,7 @@ type MACCommand_DeviceTimeAns struct { func (x *MACCommand_DeviceTimeAns) Reset() { *x = MACCommand_DeviceTimeAns{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[51] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5376,7 +6419,7 @@ func (x *MACCommand_DeviceTimeAns) String() string { func (*MACCommand_DeviceTimeAns) ProtoMessage() {} func (x *MACCommand_DeviceTimeAns) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[51] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5389,7 +6432,7 @@ func (x *MACCommand_DeviceTimeAns) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_DeviceTimeAns.ProtoReflect.Descriptor instead. func (*MACCommand_DeviceTimeAns) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 18} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 18} } func (x *MACCommand_DeviceTimeAns) GetTime() *timestamppb.Timestamp { @@ -5414,7 +6457,7 @@ type MACCommand_ForceRejoinReq struct { func (x *MACCommand_ForceRejoinReq) Reset() { *x = MACCommand_ForceRejoinReq{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[52] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5427,7 +6470,7 @@ func (x *MACCommand_ForceRejoinReq) String() string { func (*MACCommand_ForceRejoinReq) ProtoMessage() {} func (x *MACCommand_ForceRejoinReq) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[52] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5440,7 +6483,7 @@ func (x *MACCommand_ForceRejoinReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_ForceRejoinReq.ProtoReflect.Descriptor instead. func (*MACCommand_ForceRejoinReq) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 19} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 19} } func (x *MACCommand_ForceRejoinReq) GetRejoinType() RejoinRequestType { @@ -5485,7 +6528,7 @@ type MACCommand_RejoinParamSetupReq struct { func (x *MACCommand_RejoinParamSetupReq) Reset() { *x = MACCommand_RejoinParamSetupReq{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[53] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5498,7 +6541,7 @@ func (x *MACCommand_RejoinParamSetupReq) String() string { func (*MACCommand_RejoinParamSetupReq) ProtoMessage() {} func (x *MACCommand_RejoinParamSetupReq) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[53] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5511,7 +6554,7 @@ func (x *MACCommand_RejoinParamSetupReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_RejoinParamSetupReq.ProtoReflect.Descriptor instead. func (*MACCommand_RejoinParamSetupReq) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 20} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 20} } func (x *MACCommand_RejoinParamSetupReq) GetMaxCountExponent() RejoinCountExponent { @@ -5539,7 +6582,7 @@ type MACCommand_RejoinParamSetupAns struct { func (x *MACCommand_RejoinParamSetupAns) Reset() { *x = MACCommand_RejoinParamSetupAns{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[54] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5552,7 +6595,7 @@ func (x *MACCommand_RejoinParamSetupAns) String() string { func (*MACCommand_RejoinParamSetupAns) ProtoMessage() {} func (x *MACCommand_RejoinParamSetupAns) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[54] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5565,7 +6608,7 @@ func (x *MACCommand_RejoinParamSetupAns) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_RejoinParamSetupAns.ProtoReflect.Descriptor instead. func (*MACCommand_RejoinParamSetupAns) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 21} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 21} } func (x *MACCommand_RejoinParamSetupAns) GetMaxTimeExponentAck() bool { @@ -5586,7 +6629,7 @@ type MACCommand_PingSlotInfoReq struct { func (x *MACCommand_PingSlotInfoReq) Reset() { *x = MACCommand_PingSlotInfoReq{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[55] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5599,7 +6642,7 @@ func (x *MACCommand_PingSlotInfoReq) String() string { func (*MACCommand_PingSlotInfoReq) ProtoMessage() {} func (x *MACCommand_PingSlotInfoReq) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[55] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5612,7 +6655,7 @@ func (x *MACCommand_PingSlotInfoReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_PingSlotInfoReq.ProtoReflect.Descriptor instead. func (*MACCommand_PingSlotInfoReq) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 22} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 22} } func (x *MACCommand_PingSlotInfoReq) GetPeriod() PingSlotPeriod { @@ -5634,7 +6677,7 @@ type MACCommand_PingSlotChannelReq struct { func (x *MACCommand_PingSlotChannelReq) Reset() { *x = MACCommand_PingSlotChannelReq{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[56] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5647,7 +6690,7 @@ func (x *MACCommand_PingSlotChannelReq) String() string { func (*MACCommand_PingSlotChannelReq) ProtoMessage() {} func (x *MACCommand_PingSlotChannelReq) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[56] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5660,7 +6703,7 @@ func (x *MACCommand_PingSlotChannelReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_PingSlotChannelReq.ProtoReflect.Descriptor instead. func (*MACCommand_PingSlotChannelReq) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 23} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 23} } func (x *MACCommand_PingSlotChannelReq) GetFrequency() uint64 { @@ -5689,7 +6732,7 @@ type MACCommand_PingSlotChannelAns struct { func (x *MACCommand_PingSlotChannelAns) Reset() { *x = MACCommand_PingSlotChannelAns{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[57] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5702,7 +6745,7 @@ func (x *MACCommand_PingSlotChannelAns) String() string { func (*MACCommand_PingSlotChannelAns) ProtoMessage() {} func (x *MACCommand_PingSlotChannelAns) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[57] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5715,7 +6758,7 @@ func (x *MACCommand_PingSlotChannelAns) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_PingSlotChannelAns.ProtoReflect.Descriptor instead. func (*MACCommand_PingSlotChannelAns) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 24} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 24} } func (x *MACCommand_PingSlotChannelAns) GetFrequencyAck() bool { @@ -5744,7 +6787,7 @@ type MACCommand_BeaconTimingAns struct { func (x *MACCommand_BeaconTimingAns) Reset() { *x = MACCommand_BeaconTimingAns{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[58] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5757,7 +6800,7 @@ func (x *MACCommand_BeaconTimingAns) String() string { func (*MACCommand_BeaconTimingAns) ProtoMessage() {} func (x *MACCommand_BeaconTimingAns) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[58] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5770,7 +6813,7 @@ func (x *MACCommand_BeaconTimingAns) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_BeaconTimingAns.ProtoReflect.Descriptor instead. func (*MACCommand_BeaconTimingAns) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 25} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 25} } func (x *MACCommand_BeaconTimingAns) GetDelay() uint32 { @@ -5798,7 +6841,7 @@ type MACCommand_BeaconFreqReq struct { func (x *MACCommand_BeaconFreqReq) Reset() { *x = MACCommand_BeaconFreqReq{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[59] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5811,7 +6854,7 @@ func (x *MACCommand_BeaconFreqReq) String() string { func (*MACCommand_BeaconFreqReq) ProtoMessage() {} func (x *MACCommand_BeaconFreqReq) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[59] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5824,7 +6867,7 @@ func (x *MACCommand_BeaconFreqReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_BeaconFreqReq.ProtoReflect.Descriptor instead. func (*MACCommand_BeaconFreqReq) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 26} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 26} } func (x *MACCommand_BeaconFreqReq) GetFrequency() uint64 { @@ -5845,7 +6888,7 @@ type MACCommand_BeaconFreqAns struct { func (x *MACCommand_BeaconFreqAns) Reset() { *x = MACCommand_BeaconFreqAns{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[60] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5858,7 +6901,7 @@ func (x *MACCommand_BeaconFreqAns) String() string { func (*MACCommand_BeaconFreqAns) ProtoMessage() {} func (x *MACCommand_BeaconFreqAns) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[60] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5871,7 +6914,7 @@ func (x *MACCommand_BeaconFreqAns) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_BeaconFreqAns.ProtoReflect.Descriptor instead. func (*MACCommand_BeaconFreqAns) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 27} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 27} } func (x *MACCommand_BeaconFreqAns) GetFrequencyAck() bool { @@ -5892,7 +6935,7 @@ type MACCommand_DeviceModeInd struct { func (x *MACCommand_DeviceModeInd) Reset() { *x = MACCommand_DeviceModeInd{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[61] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5905,7 +6948,7 @@ func (x *MACCommand_DeviceModeInd) String() string { func (*MACCommand_DeviceModeInd) ProtoMessage() {} func (x *MACCommand_DeviceModeInd) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[61] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5918,7 +6961,7 @@ func (x *MACCommand_DeviceModeInd) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_DeviceModeInd.ProtoReflect.Descriptor instead. func (*MACCommand_DeviceModeInd) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 28} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 28} } func (x *MACCommand_DeviceModeInd) GetClass() Class { @@ -5939,7 +6982,7 @@ type MACCommand_DeviceModeConf struct { func (x *MACCommand_DeviceModeConf) Reset() { *x = MACCommand_DeviceModeConf{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[62] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5952,7 +6995,7 @@ func (x *MACCommand_DeviceModeConf) String() string { func (*MACCommand_DeviceModeConf) ProtoMessage() {} func (x *MACCommand_DeviceModeConf) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[62] + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5965,7 +7008,7 @@ func (x *MACCommand_DeviceModeConf) ProtoReflect() protoreflect.Message { // Deprecated: Use MACCommand_DeviceModeConf.ProtoReflect.Descriptor instead. func (*MACCommand_DeviceModeConf) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{20, 29} + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 29} } func (x *MACCommand_DeviceModeConf) GetClass() Class { @@ -5975,14 +7018,873 @@ func (x *MACCommand_DeviceModeConf) GetClass() Class { return Class_CLASS_A } -var File_ttn_lorawan_v3_lorawan_proto protoreflect.FileDescriptor +type MACCommand_RelayConfReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -var file_ttn_lorawan_v3_lorawan_proto_rawDesc = []byte{ - 0x0a, 0x1c, 0x74, 0x74, 0x6e, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2f, 0x76, 0x33, - 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, - 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x1a, 0x1c, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, - 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, + Configuration *MACCommand_RelayConfReq_Configuration `protobuf:"bytes,1,opt,name=configuration,proto3" json:"configuration,omitempty"` +} + +func (x *MACCommand_RelayConfReq) Reset() { + *x = MACCommand_RelayConfReq{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[72] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MACCommand_RelayConfReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MACCommand_RelayConfReq) ProtoMessage() {} + +func (x *MACCommand_RelayConfReq) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[72] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MACCommand_RelayConfReq.ProtoReflect.Descriptor instead. +func (*MACCommand_RelayConfReq) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 30} +} + +func (x *MACCommand_RelayConfReq) GetConfiguration() *MACCommand_RelayConfReq_Configuration { + if x != nil { + return x.Configuration + } + return nil +} + +type MACCommand_RelayConfAns struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SecondChannelFrequencyAck bool `protobuf:"varint,1,opt,name=second_channel_frequency_ack,json=secondChannelFrequencyAck,proto3" json:"second_channel_frequency_ack,omitempty"` + SecondChannelAckOffsetAck bool `protobuf:"varint,2,opt,name=second_channel_ack_offset_ack,json=secondChannelAckOffsetAck,proto3" json:"second_channel_ack_offset_ack,omitempty"` + SecondChannelDataRateIndexAck bool `protobuf:"varint,3,opt,name=second_channel_data_rate_index_ack,json=secondChannelDataRateIndexAck,proto3" json:"second_channel_data_rate_index_ack,omitempty"` + SecondChannelIndexAck bool `protobuf:"varint,4,opt,name=second_channel_index_ack,json=secondChannelIndexAck,proto3" json:"second_channel_index_ack,omitempty"` + DefaultChannelIndexAck bool `protobuf:"varint,5,opt,name=default_channel_index_ack,json=defaultChannelIndexAck,proto3" json:"default_channel_index_ack,omitempty"` + CadPeriodicityAck bool `protobuf:"varint,6,opt,name=cad_periodicity_ack,json=cadPeriodicityAck,proto3" json:"cad_periodicity_ack,omitempty"` +} + +func (x *MACCommand_RelayConfAns) Reset() { + *x = MACCommand_RelayConfAns{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[73] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MACCommand_RelayConfAns) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MACCommand_RelayConfAns) ProtoMessage() {} + +func (x *MACCommand_RelayConfAns) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[73] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MACCommand_RelayConfAns.ProtoReflect.Descriptor instead. +func (*MACCommand_RelayConfAns) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 31} +} + +func (x *MACCommand_RelayConfAns) GetSecondChannelFrequencyAck() bool { + if x != nil { + return x.SecondChannelFrequencyAck + } + return false +} + +func (x *MACCommand_RelayConfAns) GetSecondChannelAckOffsetAck() bool { + if x != nil { + return x.SecondChannelAckOffsetAck + } + return false +} + +func (x *MACCommand_RelayConfAns) GetSecondChannelDataRateIndexAck() bool { + if x != nil { + return x.SecondChannelDataRateIndexAck + } + return false +} + +func (x *MACCommand_RelayConfAns) GetSecondChannelIndexAck() bool { + if x != nil { + return x.SecondChannelIndexAck + } + return false +} + +func (x *MACCommand_RelayConfAns) GetDefaultChannelIndexAck() bool { + if x != nil { + return x.DefaultChannelIndexAck + } + return false +} + +func (x *MACCommand_RelayConfAns) GetCadPeriodicityAck() bool { + if x != nil { + return x.CadPeriodicityAck + } + return false +} + +type MACCommand_RelayEndDeviceConfReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Configuration *MACCommand_RelayEndDeviceConfReq_Configuration `protobuf:"bytes,1,opt,name=configuration,proto3" json:"configuration,omitempty"` +} + +func (x *MACCommand_RelayEndDeviceConfReq) Reset() { + *x = MACCommand_RelayEndDeviceConfReq{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[74] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MACCommand_RelayEndDeviceConfReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MACCommand_RelayEndDeviceConfReq) ProtoMessage() {} + +func (x *MACCommand_RelayEndDeviceConfReq) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[74] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MACCommand_RelayEndDeviceConfReq.ProtoReflect.Descriptor instead. +func (*MACCommand_RelayEndDeviceConfReq) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 32} +} + +func (x *MACCommand_RelayEndDeviceConfReq) GetConfiguration() *MACCommand_RelayEndDeviceConfReq_Configuration { + if x != nil { + return x.Configuration + } + return nil +} + +type MACCommand_RelayEndDeviceConfAns struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SecondChannelFrequencyAck bool `protobuf:"varint,1,opt,name=second_channel_frequency_ack,json=secondChannelFrequencyAck,proto3" json:"second_channel_frequency_ack,omitempty"` + SecondChannelDataRateIndexAck bool `protobuf:"varint,3,opt,name=second_channel_data_rate_index_ack,json=secondChannelDataRateIndexAck,proto3" json:"second_channel_data_rate_index_ack,omitempty"` + SecondChannelIndexAck bool `protobuf:"varint,4,opt,name=second_channel_index_ack,json=secondChannelIndexAck,proto3" json:"second_channel_index_ack,omitempty"` + BackoffAck bool `protobuf:"varint,5,opt,name=backoff_ack,json=backoffAck,proto3" json:"backoff_ack,omitempty"` +} + +func (x *MACCommand_RelayEndDeviceConfAns) Reset() { + *x = MACCommand_RelayEndDeviceConfAns{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[75] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MACCommand_RelayEndDeviceConfAns) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MACCommand_RelayEndDeviceConfAns) ProtoMessage() {} + +func (x *MACCommand_RelayEndDeviceConfAns) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[75] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MACCommand_RelayEndDeviceConfAns.ProtoReflect.Descriptor instead. +func (*MACCommand_RelayEndDeviceConfAns) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 33} +} + +func (x *MACCommand_RelayEndDeviceConfAns) GetSecondChannelFrequencyAck() bool { + if x != nil { + return x.SecondChannelFrequencyAck + } + return false +} + +func (x *MACCommand_RelayEndDeviceConfAns) GetSecondChannelDataRateIndexAck() bool { + if x != nil { + return x.SecondChannelDataRateIndexAck + } + return false +} + +func (x *MACCommand_RelayEndDeviceConfAns) GetSecondChannelIndexAck() bool { + if x != nil { + return x.SecondChannelIndexAck + } + return false +} + +func (x *MACCommand_RelayEndDeviceConfAns) GetBackoffAck() bool { + if x != nil { + return x.BackoffAck + } + return false +} + +type MACCommand_RelayUpdateUplinkListReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RuleIndex uint32 `protobuf:"varint,1,opt,name=rule_index,json=ruleIndex,proto3" json:"rule_index,omitempty"` + ForwardLimits *RelayUplinkForwardLimits `protobuf:"bytes,2,opt,name=forward_limits,json=forwardLimits,proto3" json:"forward_limits,omitempty"` + DevAddr []byte `protobuf:"bytes,3,opt,name=dev_addr,json=devAddr,proto3" json:"dev_addr,omitempty"` + WFCnt uint32 `protobuf:"varint,4,opt,name=w_f_cnt,json=wFCnt,proto3" json:"w_f_cnt,omitempty"` + RootWorSKey []byte `protobuf:"bytes,5,opt,name=root_wor_s_key,json=rootWorSKey,proto3" json:"root_wor_s_key,omitempty"` + DeviceId string `protobuf:"bytes,6,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` + SessionKeyId []byte `protobuf:"bytes,7,opt,name=session_key_id,json=sessionKeyId,proto3" json:"session_key_id,omitempty"` +} + +func (x *MACCommand_RelayUpdateUplinkListReq) Reset() { + *x = MACCommand_RelayUpdateUplinkListReq{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[76] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MACCommand_RelayUpdateUplinkListReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MACCommand_RelayUpdateUplinkListReq) ProtoMessage() {} + +func (x *MACCommand_RelayUpdateUplinkListReq) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[76] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MACCommand_RelayUpdateUplinkListReq.ProtoReflect.Descriptor instead. +func (*MACCommand_RelayUpdateUplinkListReq) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 34} +} + +func (x *MACCommand_RelayUpdateUplinkListReq) GetRuleIndex() uint32 { + if x != nil { + return x.RuleIndex + } + return 0 +} + +func (x *MACCommand_RelayUpdateUplinkListReq) GetForwardLimits() *RelayUplinkForwardLimits { + if x != nil { + return x.ForwardLimits + } + return nil +} + +func (x *MACCommand_RelayUpdateUplinkListReq) GetDevAddr() []byte { + if x != nil { + return x.DevAddr + } + return nil +} + +func (x *MACCommand_RelayUpdateUplinkListReq) GetWFCnt() uint32 { + if x != nil { + return x.WFCnt + } + return 0 +} + +func (x *MACCommand_RelayUpdateUplinkListReq) GetRootWorSKey() []byte { + if x != nil { + return x.RootWorSKey + } + return nil +} + +func (x *MACCommand_RelayUpdateUplinkListReq) GetDeviceId() string { + if x != nil { + return x.DeviceId + } + return "" +} + +func (x *MACCommand_RelayUpdateUplinkListReq) GetSessionKeyId() []byte { + if x != nil { + return x.SessionKeyId + } + return nil +} + +type MACCommand_RelayUpdateUplinkListAns struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *MACCommand_RelayUpdateUplinkListAns) Reset() { + *x = MACCommand_RelayUpdateUplinkListAns{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[77] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MACCommand_RelayUpdateUplinkListAns) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MACCommand_RelayUpdateUplinkListAns) ProtoMessage() {} + +func (x *MACCommand_RelayUpdateUplinkListAns) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[77] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MACCommand_RelayUpdateUplinkListAns.ProtoReflect.Descriptor instead. +func (*MACCommand_RelayUpdateUplinkListAns) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 35} +} + +type MACCommand_RelayCtrlUplinkListReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RuleIndex uint32 `protobuf:"varint,1,opt,name=rule_index,json=ruleIndex,proto3" json:"rule_index,omitempty"` + Action RelayCtrlUplinkListAction `protobuf:"varint,2,opt,name=action,proto3,enum=ttn.lorawan.v3.RelayCtrlUplinkListAction" json:"action,omitempty"` +} + +func (x *MACCommand_RelayCtrlUplinkListReq) Reset() { + *x = MACCommand_RelayCtrlUplinkListReq{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[78] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MACCommand_RelayCtrlUplinkListReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MACCommand_RelayCtrlUplinkListReq) ProtoMessage() {} + +func (x *MACCommand_RelayCtrlUplinkListReq) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[78] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MACCommand_RelayCtrlUplinkListReq.ProtoReflect.Descriptor instead. +func (*MACCommand_RelayCtrlUplinkListReq) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 36} +} + +func (x *MACCommand_RelayCtrlUplinkListReq) GetRuleIndex() uint32 { + if x != nil { + return x.RuleIndex + } + return 0 +} + +func (x *MACCommand_RelayCtrlUplinkListReq) GetAction() RelayCtrlUplinkListAction { + if x != nil { + return x.Action + } + return RelayCtrlUplinkListAction_RELAY_CTRL_UPLINK_LIST_ACTION_READ_W_F_CNT +} + +type MACCommand_RelayCtrlUplinkListAns struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RuleIndexAck bool `protobuf:"varint,1,opt,name=rule_index_ack,json=ruleIndexAck,proto3" json:"rule_index_ack,omitempty"` + WFCnt uint32 `protobuf:"varint,2,opt,name=w_f_cnt,json=wFCnt,proto3" json:"w_f_cnt,omitempty"` +} + +func (x *MACCommand_RelayCtrlUplinkListAns) Reset() { + *x = MACCommand_RelayCtrlUplinkListAns{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[79] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MACCommand_RelayCtrlUplinkListAns) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MACCommand_RelayCtrlUplinkListAns) ProtoMessage() {} + +func (x *MACCommand_RelayCtrlUplinkListAns) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[79] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MACCommand_RelayCtrlUplinkListAns.ProtoReflect.Descriptor instead. +func (*MACCommand_RelayCtrlUplinkListAns) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 37} +} + +func (x *MACCommand_RelayCtrlUplinkListAns) GetRuleIndexAck() bool { + if x != nil { + return x.RuleIndexAck + } + return false +} + +func (x *MACCommand_RelayCtrlUplinkListAns) GetWFCnt() uint32 { + if x != nil { + return x.WFCnt + } + return 0 +} + +type MACCommand_RelayConfigureFwdLimitReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ResetLimitCounter RelayResetLimitCounter `protobuf:"varint,1,opt,name=reset_limit_counter,json=resetLimitCounter,proto3,enum=ttn.lorawan.v3.RelayResetLimitCounter" json:"reset_limit_counter,omitempty"` + JoinRequestLimits *RelayForwardLimits `protobuf:"bytes,2,opt,name=join_request_limits,json=joinRequestLimits,proto3" json:"join_request_limits,omitempty"` + NotifyLimits *RelayForwardLimits `protobuf:"bytes,3,opt,name=notify_limits,json=notifyLimits,proto3" json:"notify_limits,omitempty"` + GlobalUplinkLimits *RelayForwardLimits `protobuf:"bytes,4,opt,name=global_uplink_limits,json=globalUplinkLimits,proto3" json:"global_uplink_limits,omitempty"` + OverallLimits *RelayForwardLimits `protobuf:"bytes,5,opt,name=overall_limits,json=overallLimits,proto3" json:"overall_limits,omitempty"` +} + +func (x *MACCommand_RelayConfigureFwdLimitReq) Reset() { + *x = MACCommand_RelayConfigureFwdLimitReq{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[80] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MACCommand_RelayConfigureFwdLimitReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MACCommand_RelayConfigureFwdLimitReq) ProtoMessage() {} + +func (x *MACCommand_RelayConfigureFwdLimitReq) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[80] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MACCommand_RelayConfigureFwdLimitReq.ProtoReflect.Descriptor instead. +func (*MACCommand_RelayConfigureFwdLimitReq) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 38} +} + +func (x *MACCommand_RelayConfigureFwdLimitReq) GetResetLimitCounter() RelayResetLimitCounter { + if x != nil { + return x.ResetLimitCounter + } + return RelayResetLimitCounter_RELAY_RESET_LIMIT_COUNTER_ZERO +} + +func (x *MACCommand_RelayConfigureFwdLimitReq) GetJoinRequestLimits() *RelayForwardLimits { + if x != nil { + return x.JoinRequestLimits + } + return nil +} + +func (x *MACCommand_RelayConfigureFwdLimitReq) GetNotifyLimits() *RelayForwardLimits { + if x != nil { + return x.NotifyLimits + } + return nil +} + +func (x *MACCommand_RelayConfigureFwdLimitReq) GetGlobalUplinkLimits() *RelayForwardLimits { + if x != nil { + return x.GlobalUplinkLimits + } + return nil +} + +func (x *MACCommand_RelayConfigureFwdLimitReq) GetOverallLimits() *RelayForwardLimits { + if x != nil { + return x.OverallLimits + } + return nil +} + +type MACCommand_RelayConfigureFwdLimitAns struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *MACCommand_RelayConfigureFwdLimitAns) Reset() { + *x = MACCommand_RelayConfigureFwdLimitAns{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[81] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MACCommand_RelayConfigureFwdLimitAns) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MACCommand_RelayConfigureFwdLimitAns) ProtoMessage() {} + +func (x *MACCommand_RelayConfigureFwdLimitAns) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[81] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MACCommand_RelayConfigureFwdLimitAns.ProtoReflect.Descriptor instead. +func (*MACCommand_RelayConfigureFwdLimitAns) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 39} +} + +type MACCommand_RelayNotifyNewEndDeviceReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DevAddr []byte `protobuf:"bytes,1,opt,name=dev_addr,json=devAddr,proto3" json:"dev_addr,omitempty"` + Snr int32 `protobuf:"varint,2,opt,name=snr,proto3" json:"snr,omitempty"` + Rssi int32 `protobuf:"varint,3,opt,name=rssi,proto3" json:"rssi,omitempty"` +} + +func (x *MACCommand_RelayNotifyNewEndDeviceReq) Reset() { + *x = MACCommand_RelayNotifyNewEndDeviceReq{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[82] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MACCommand_RelayNotifyNewEndDeviceReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MACCommand_RelayNotifyNewEndDeviceReq) ProtoMessage() {} + +func (x *MACCommand_RelayNotifyNewEndDeviceReq) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[82] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MACCommand_RelayNotifyNewEndDeviceReq.ProtoReflect.Descriptor instead. +func (*MACCommand_RelayNotifyNewEndDeviceReq) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 40} +} + +func (x *MACCommand_RelayNotifyNewEndDeviceReq) GetDevAddr() []byte { + if x != nil { + return x.DevAddr + } + return nil +} + +func (x *MACCommand_RelayNotifyNewEndDeviceReq) GetSnr() int32 { + if x != nil { + return x.Snr + } + return 0 +} + +func (x *MACCommand_RelayNotifyNewEndDeviceReq) GetRssi() int32 { + if x != nil { + return x.Rssi + } + return 0 +} + +type MACCommand_RelayConfReq_Configuration struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SecondChannel *RelaySecondChannel `protobuf:"bytes,1,opt,name=second_channel,json=secondChannel,proto3" json:"second_channel,omitempty"` + DefaultChannelIndex uint32 `protobuf:"varint,2,opt,name=default_channel_index,json=defaultChannelIndex,proto3" json:"default_channel_index,omitempty"` + CadPeriodicity RelayCADPeriodicity `protobuf:"varint,3,opt,name=cad_periodicity,json=cadPeriodicity,proto3,enum=ttn.lorawan.v3.RelayCADPeriodicity" json:"cad_periodicity,omitempty"` +} + +func (x *MACCommand_RelayConfReq_Configuration) Reset() { + *x = MACCommand_RelayConfReq_Configuration{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[83] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MACCommand_RelayConfReq_Configuration) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MACCommand_RelayConfReq_Configuration) ProtoMessage() {} + +func (x *MACCommand_RelayConfReq_Configuration) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[83] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MACCommand_RelayConfReq_Configuration.ProtoReflect.Descriptor instead. +func (*MACCommand_RelayConfReq_Configuration) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 30, 0} +} + +func (x *MACCommand_RelayConfReq_Configuration) GetSecondChannel() *RelaySecondChannel { + if x != nil { + return x.SecondChannel + } + return nil +} + +func (x *MACCommand_RelayConfReq_Configuration) GetDefaultChannelIndex() uint32 { + if x != nil { + return x.DefaultChannelIndex + } + return 0 +} + +func (x *MACCommand_RelayConfReq_Configuration) GetCadPeriodicity() RelayCADPeriodicity { + if x != nil { + return x.CadPeriodicity + } + return RelayCADPeriodicity_RELAY_CAD_PERIODICITY_1_SECOND +} + +type MACCommand_RelayEndDeviceConfReq_Configuration struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Mode: + // *MACCommand_RelayEndDeviceConfReq_Configuration_Always + // *MACCommand_RelayEndDeviceConfReq_Configuration_Dynamic + // *MACCommand_RelayEndDeviceConfReq_Configuration_EndDeviceControlled + Mode isMACCommand_RelayEndDeviceConfReq_Configuration_Mode `protobuf_oneof:"mode"` + Backoff uint32 `protobuf:"varint,4,opt,name=backoff,proto3" json:"backoff,omitempty"` + SecondChannel *RelaySecondChannel `protobuf:"bytes,5,opt,name=second_channel,json=secondChannel,proto3" json:"second_channel,omitempty"` + ServingDeviceId string `protobuf:"bytes,6,opt,name=serving_device_id,json=servingDeviceId,proto3" json:"serving_device_id,omitempty"` +} + +func (x *MACCommand_RelayEndDeviceConfReq_Configuration) Reset() { + *x = MACCommand_RelayEndDeviceConfReq_Configuration{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[84] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MACCommand_RelayEndDeviceConfReq_Configuration) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MACCommand_RelayEndDeviceConfReq_Configuration) ProtoMessage() {} + +func (x *MACCommand_RelayEndDeviceConfReq_Configuration) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_lorawan_proto_msgTypes[84] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MACCommand_RelayEndDeviceConfReq_Configuration.ProtoReflect.Descriptor instead. +func (*MACCommand_RelayEndDeviceConfReq_Configuration) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP(), []int{26, 32, 0} +} + +func (m *MACCommand_RelayEndDeviceConfReq_Configuration) GetMode() isMACCommand_RelayEndDeviceConfReq_Configuration_Mode { + if m != nil { + return m.Mode + } + return nil +} + +func (x *MACCommand_RelayEndDeviceConfReq_Configuration) GetAlways() *RelayEndDeviceAlwaysMode { + if x, ok := x.GetMode().(*MACCommand_RelayEndDeviceConfReq_Configuration_Always); ok { + return x.Always + } + return nil +} + +func (x *MACCommand_RelayEndDeviceConfReq_Configuration) GetDynamic() *RelayEndDeviceDynamicMode { + if x, ok := x.GetMode().(*MACCommand_RelayEndDeviceConfReq_Configuration_Dynamic); ok { + return x.Dynamic + } + return nil +} + +func (x *MACCommand_RelayEndDeviceConfReq_Configuration) GetEndDeviceControlled() *RelayEndDeviceControlledMode { + if x, ok := x.GetMode().(*MACCommand_RelayEndDeviceConfReq_Configuration_EndDeviceControlled); ok { + return x.EndDeviceControlled + } + return nil +} + +func (x *MACCommand_RelayEndDeviceConfReq_Configuration) GetBackoff() uint32 { + if x != nil { + return x.Backoff + } + return 0 +} + +func (x *MACCommand_RelayEndDeviceConfReq_Configuration) GetSecondChannel() *RelaySecondChannel { + if x != nil { + return x.SecondChannel + } + return nil +} + +func (x *MACCommand_RelayEndDeviceConfReq_Configuration) GetServingDeviceId() string { + if x != nil { + return x.ServingDeviceId + } + return "" +} + +type isMACCommand_RelayEndDeviceConfReq_Configuration_Mode interface { + isMACCommand_RelayEndDeviceConfReq_Configuration_Mode() +} + +type MACCommand_RelayEndDeviceConfReq_Configuration_Always struct { + Always *RelayEndDeviceAlwaysMode `protobuf:"bytes,1,opt,name=always,proto3,oneof"` +} + +type MACCommand_RelayEndDeviceConfReq_Configuration_Dynamic struct { + Dynamic *RelayEndDeviceDynamicMode `protobuf:"bytes,2,opt,name=dynamic,proto3,oneof"` +} + +type MACCommand_RelayEndDeviceConfReq_Configuration_EndDeviceControlled struct { + EndDeviceControlled *RelayEndDeviceControlledMode `protobuf:"bytes,3,opt,name=end_device_controlled,json=endDeviceControlled,proto3,oneof"` +} + +func (*MACCommand_RelayEndDeviceConfReq_Configuration_Always) isMACCommand_RelayEndDeviceConfReq_Configuration_Mode() { +} + +func (*MACCommand_RelayEndDeviceConfReq_Configuration_Dynamic) isMACCommand_RelayEndDeviceConfReq_Configuration_Mode() { +} + +func (*MACCommand_RelayEndDeviceConfReq_Configuration_EndDeviceControlled) isMACCommand_RelayEndDeviceConfReq_Configuration_Mode() { +} + +var File_ttn_lorawan_v3_lorawan_proto protoreflect.FileDescriptor + +var file_ttn_lorawan_v3_lorawan_proto_rawDesc = []byte{ + 0x0a, 0x1c, 0x74, 0x74, 0x6e, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2f, 0x76, 0x33, + 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, + 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x1a, 0x1c, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, @@ -6490,879 +8392,1390 @@ var file_ttn_lorawan_v3_lorawan_proto_rawDesc = []byte{ 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x4a, 0x04, - 0x08, 0x0b, 0x10, 0x0c, 0x22, 0xc2, 0x33, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x12, 0x42, 0x0a, 0x03, 0x63, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, - 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x82, 0x01, 0x04, 0x10, 0x01, - 0x20, 0x00, 0x52, 0x03, 0x63, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0b, 0x72, 0x61, 0x77, 0x5f, 0x70, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0a, - 0x72, 0x61, 0x77, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x42, 0x0a, 0x09, 0x72, 0x65, - 0x73, 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, - 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x49, - 0x6e, 0x64, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x64, 0x12, 0x45, - 0x0a, 0x0a, 0x72, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, - 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, - 0x65, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x73, 0x65, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x4f, 0x0a, 0x0e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x08, 0x0b, 0x10, 0x0c, 0x22, 0xe9, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x53, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x4f, 0x0a, 0x0a, 0x61, + 0x63, 0x6b, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x43, 0x68, 0x41, 0x63, + 0x6b, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, + 0x01, 0x52, 0x09, 0x61, 0x63, 0x6b, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x4f, 0x0a, 0x0f, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, + 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0d, + 0x64, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x27, 0x0a, + 0x09, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x42, 0x09, 0xfa, 0x42, 0x06, 0x32, 0x04, 0x28, 0xa0, 0x8d, 0x06, 0x52, 0x09, 0x66, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, + 0x22, 0x9f, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, + 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x4f, 0x0a, + 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, + 0x10, 0x01, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x28, + 0x0a, 0x0b, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x18, 0x3e, 0x52, 0x0a, 0x72, 0x65, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x61, 0x74, 0x65, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, + 0x10, 0x01, 0x22, 0x99, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x6f, 0x72, 0x77, + 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x4f, 0x0a, 0x0b, 0x62, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, + 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, + 0x52, 0x65, 0x6c, 0x61, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x53, 0x69, 0x7a, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x72, 0x65, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x18, 0x7e, 0x52, 0x0a, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x61, 0x74, 0x65, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0x24, + 0x0a, 0x18, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x41, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, + 0x08, 0x01, 0x10, 0x01, 0x22, 0x84, 0x01, 0x0a, 0x19, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x6e, + 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x4d, 0x6f, + 0x64, 0x65, 0x12, 0x5d, 0x0a, 0x12, 0x73, 0x6d, 0x61, 0x72, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, + 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, + 0x52, 0x65, 0x6c, 0x61, 0x79, 0x53, 0x6d, 0x61, 0x72, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, + 0x10, 0x73, 0x6d, 0x61, 0x72, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0x28, 0x0a, 0x1c, 0x52, + 0x65, 0x6c, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x08, 0xf2, 0xaa, 0x19, + 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0xe5, 0x5b, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x42, 0x0a, 0x03, 0x63, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, + 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x82, 0x01, 0x04, 0x10, + 0x01, 0x20, 0x00, 0x52, 0x03, 0x63, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0b, 0x72, 0x61, 0x77, 0x5f, + 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, + 0x0a, 0x72, 0x61, 0x77, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x42, 0x0a, 0x09, 0x72, + 0x65, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, + 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, + 0x49, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x64, 0x12, + 0x45, 0x0a, 0x0a, 0x72, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, + 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x73, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x4f, 0x0a, 0x0e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, + 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x41, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x6c, 0x69, 0x6e, 0x6b, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x41, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x0c, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, + 0x61, 0x64, 0x72, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, - 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x41, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x41, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x0c, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x61, - 0x64, 0x72, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, + 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x41, 0x44, + 0x52, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0a, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x64, 0x72, 0x52, + 0x65, 0x71, 0x12, 0x49, 0x0a, 0x0c, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x61, 0x64, 0x72, 0x5f, 0x61, + 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, + 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x41, 0x44, 0x52, 0x41, 0x6e, 0x73, 0x48, + 0x00, 0x52, 0x0a, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x64, 0x72, 0x41, 0x6e, 0x73, 0x12, 0x4f, 0x0a, + 0x0e, 0x64, 0x75, 0x74, 0x79, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, + 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x2e, 0x44, 0x75, 0x74, 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, + 0x52, 0x0c, 0x64, 0x75, 0x74, 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x59, + 0x0a, 0x12, 0x72, 0x78, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x74, 0x75, 0x70, + 0x5f, 0x72, 0x65, 0x71, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, + 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0f, 0x72, 0x78, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x59, 0x0a, 0x12, 0x72, 0x78, 0x5f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, 0x61, 0x6e, 0x73, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, + 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x2e, 0x52, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, 0x41, 0x6e, + 0x73, 0x48, 0x00, 0x52, 0x0f, 0x72, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, + 0x70, 0x41, 0x6e, 0x73, 0x12, 0x4f, 0x0a, 0x0e, 0x64, 0x65, 0x76, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x5f, 0x61, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, - 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x41, 0x44, 0x52, - 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0a, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x64, 0x72, 0x52, 0x65, - 0x71, 0x12, 0x49, 0x0a, 0x0c, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x61, 0x64, 0x72, 0x5f, 0x61, 0x6e, - 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, - 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x41, 0x44, 0x52, 0x41, 0x6e, 0x73, 0x48, 0x00, - 0x52, 0x0a, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x64, 0x72, 0x41, 0x6e, 0x73, 0x12, 0x4f, 0x0a, 0x0e, - 0x64, 0x75, 0x74, 0x79, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, - 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x2e, 0x44, 0x75, 0x74, 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, - 0x0c, 0x64, 0x75, 0x74, 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x59, 0x0a, - 0x12, 0x72, 0x78, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, - 0x72, 0x65, 0x71, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, + 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x44, 0x65, 0x76, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x41, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x64, 0x65, 0x76, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x41, 0x6e, 0x73, 0x12, 0x52, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, + 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, + 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x4e, 0x65, 0x77, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0d, 0x6e, 0x65, 0x77, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x52, 0x0a, 0x0f, 0x6e, 0x65, 0x77, + 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x61, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x4e, + 0x65, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x41, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x0d, + 0x6e, 0x65, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x41, 0x6e, 0x73, 0x12, 0x4f, 0x0a, + 0x0e, 0x64, 0x6c, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, + 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x2e, 0x44, 0x4c, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x48, 0x00, + 0x52, 0x0c, 0x64, 0x6c, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x4f, + 0x0a, 0x0e, 0x64, 0x6c, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x61, 0x6e, 0x73, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x2e, 0x44, 0x4c, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x41, 0x6e, 0x73, 0x48, + 0x00, 0x52, 0x0c, 0x64, 0x6c, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x41, 0x6e, 0x73, 0x12, + 0x5c, 0x0a, 0x13, 0x72, 0x78, 0x5f, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x65, 0x74, + 0x75, 0x70, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, + 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, + 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x78, 0x54, 0x69, 0x6d, 0x69, 0x6e, + 0x67, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x10, 0x72, 0x78, 0x54, + 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x59, 0x0a, + 0x12, 0x74, 0x78, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, + 0x72, 0x65, 0x71, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, - 0x75, 0x70, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0f, 0x72, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x59, 0x0a, 0x12, 0x72, 0x78, 0x5f, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, 0x61, 0x6e, 0x73, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, - 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x2e, 0x52, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, 0x41, 0x6e, 0x73, - 0x48, 0x00, 0x52, 0x0f, 0x72, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, - 0x41, 0x6e, 0x73, 0x12, 0x4f, 0x0a, 0x0e, 0x64, 0x65, 0x76, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x5f, 0x61, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x74, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x54, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, + 0x75, 0x70, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0f, 0x74, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x42, 0x0a, 0x09, 0x72, 0x65, 0x6b, 0x65, + 0x79, 0x5f, 0x69, 0x6e, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x44, 0x65, 0x76, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x41, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x64, 0x65, 0x76, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x41, 0x6e, 0x73, 0x12, 0x52, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, - 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, - 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x4e, 0x65, 0x77, 0x43, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0d, 0x6e, 0x65, 0x77, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x52, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, - 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x61, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x4e, 0x65, - 0x77, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x41, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x6e, - 0x65, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x41, 0x6e, 0x73, 0x12, 0x4f, 0x0a, 0x0e, - 0x64, 0x6c, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x6b, 0x65, 0x79, 0x49, 0x6e, 0x64, + 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x6b, 0x65, 0x79, 0x49, 0x6e, 0x64, 0x12, 0x45, 0x0a, 0x0a, + 0x72, 0x65, 0x6b, 0x65, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x6b, + 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x6b, 0x65, 0x79, 0x43, + 0x6f, 0x6e, 0x66, 0x12, 0x5c, 0x0a, 0x13, 0x61, 0x64, 0x72, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x5f, 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2b, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x41, 0x44, 0x52, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, + 0x10, 0x61, 0x64, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, + 0x71, 0x12, 0x52, 0x0a, 0x0f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x5f, 0x61, 0x6e, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x41, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x41, 0x6e, 0x73, 0x12, 0x55, 0x0a, 0x10, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x72, + 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x29, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x46, 0x6f, 0x72, 0x63, + 0x65, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x65, 0x0a, 0x16, + 0x72, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x74, + 0x75, 0x70, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, + 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, + 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x13, + 0x72, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, + 0x52, 0x65, 0x71, 0x12, 0x65, 0x0a, 0x16, 0x72, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, 0x61, 0x6e, 0x73, 0x18, 0x18, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, + 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, + 0x41, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x13, 0x72, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, 0x41, 0x6e, 0x73, 0x12, 0x59, 0x0a, 0x12, 0x70, 0x69, + 0x6e, 0x67, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x72, 0x65, 0x71, + 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x71, 0x48, 0x00, 0x52, 0x0f, 0x70, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x71, 0x12, 0x62, 0x0a, 0x15, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x6c, + 0x6f, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x1a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x2e, 0x44, 0x4c, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, - 0x0c, 0x64, 0x6c, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x4f, 0x0a, - 0x0e, 0x64, 0x6c, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x61, 0x6e, 0x73, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, - 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x2e, 0x44, 0x4c, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x41, 0x6e, 0x73, 0x48, 0x00, - 0x52, 0x0c, 0x64, 0x6c, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x41, 0x6e, 0x73, 0x12, 0x5c, - 0x0a, 0x13, 0x72, 0x78, 0x5f, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x65, 0x74, 0x75, - 0x70, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x74, - 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x78, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, - 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x10, 0x72, 0x78, 0x54, 0x69, - 0x6d, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x59, 0x0a, 0x12, - 0x74, 0x78, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, 0x72, - 0x65, 0x71, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, + 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x12, 0x70, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x62, 0x0a, 0x15, 0x70, 0x69, 0x6e, + 0x67, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x61, + 0x6e, 0x73, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x54, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, - 0x70, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0f, 0x74, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, - 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x42, 0x0a, 0x09, 0x72, 0x65, 0x6b, 0x65, 0x79, - 0x5f, 0x69, 0x6e, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, - 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x6b, 0x65, 0x79, 0x49, 0x6e, 0x64, 0x48, - 0x00, 0x52, 0x08, 0x72, 0x65, 0x6b, 0x65, 0x79, 0x49, 0x6e, 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x72, - 0x65, 0x6b, 0x65, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, - 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x6b, 0x65, - 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x6b, 0x65, 0x79, 0x43, 0x6f, - 0x6e, 0x66, 0x12, 0x5c, 0x0a, 0x13, 0x61, 0x64, 0x72, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, - 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2b, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, - 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x41, 0x44, 0x52, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x10, - 0x61, 0x64, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, - 0x12, 0x52, 0x0a, 0x0f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, - 0x61, 0x6e, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, - 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x41, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x41, 0x6e, 0x73, 0x12, 0x55, 0x0a, 0x10, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, - 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, + 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x41, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x12, 0x70, 0x69, 0x6e, 0x67, 0x53, + 0x6c, 0x6f, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x41, 0x6e, 0x73, 0x12, 0x58, 0x0a, + 0x11, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x61, + 0x6e, 0x73, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, + 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x69, 0x6e, + 0x67, 0x41, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x69, + 0x6d, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x73, 0x12, 0x52, 0x0a, 0x0f, 0x62, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0d, 0x62, 0x65, + 0x61, 0x63, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x52, 0x65, 0x71, 0x12, 0x52, 0x0a, 0x0f, 0x62, + 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x5f, 0x61, 0x6e, 0x73, 0x18, 0x1e, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, + 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x41, 0x6e, 0x73, 0x48, 0x00, + 0x52, 0x0d, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x41, 0x6e, 0x73, 0x12, + 0x52, 0x0a, 0x0f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x69, + 0x6e, 0x64, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, + 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x49, + 0x6e, 0x64, 0x48, 0x00, 0x52, 0x0d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, + 0x49, 0x6e, 0x64, 0x12, 0x55, 0x0a, 0x10, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6d, 0x6f, + 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, + 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, + 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x4d, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x48, 0x00, 0x52, 0x0e, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x4f, 0x0a, 0x0e, 0x72, 0x65, + 0x6c, 0x61, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x21, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, + 0x65, 0x6c, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0c, 0x72, + 0x65, 0x6c, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x65, 0x71, 0x12, 0x4f, 0x0a, 0x0e, 0x72, + 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x5f, 0x61, 0x6e, 0x73, 0x18, 0x22, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, + 0x52, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x41, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x0c, + 0x72, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x41, 0x6e, 0x73, 0x12, 0x6c, 0x0a, 0x19, + 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x30, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x6c, 0x61, + 0x79, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x65, + 0x71, 0x48, 0x00, 0x52, 0x15, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x65, 0x71, 0x12, 0x6c, 0x0a, 0x19, 0x72, 0x65, + 0x6c, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x5f, 0x61, 0x6e, 0x73, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, + 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x45, + 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x41, 0x6e, 0x73, 0x48, + 0x00, 0x52, 0x15, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x41, 0x6e, 0x73, 0x12, 0x75, 0x0a, 0x1c, 0x72, 0x65, 0x6c, 0x61, + 0x79, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, + 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, - 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, - 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x65, 0x0a, 0x16, 0x72, - 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x74, 0x75, - 0x70, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x74, + 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x18, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, + 0x75, 0x0a, 0x1c, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, + 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x61, 0x6e, 0x73, 0x18, + 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, + 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x70, 0x6c, + 0x69, 0x6e, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x18, 0x72, 0x65, + 0x6c, 0x61, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x4c, + 0x69, 0x73, 0x74, 0x41, 0x6e, 0x73, 0x12, 0x6f, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, + 0x63, 0x74, 0x72, 0x6c, 0x5f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x5f, 0x72, 0x65, 0x71, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x74, 0x72, 0x6c, + 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, + 0x16, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x74, 0x72, 0x6c, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x6f, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x79, + 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x5f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x6c, 0x69, 0x73, + 0x74, 0x5f, 0x61, 0x6e, 0x73, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x13, 0x72, - 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, - 0x65, 0x71, 0x12, 0x65, 0x0a, 0x16, 0x72, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, 0x61, 0x6e, 0x73, 0x18, 0x18, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, - 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, - 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, 0x41, - 0x6e, 0x73, 0x48, 0x00, 0x52, 0x13, 0x72, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, 0x41, 0x6e, 0x73, 0x12, 0x59, 0x0a, 0x12, 0x70, 0x69, 0x6e, - 0x67, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x72, 0x65, 0x71, 0x18, - 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x74, 0x72, + 0x6c, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6e, 0x73, 0x48, 0x00, + 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x74, 0x72, 0x6c, 0x55, 0x70, 0x6c, 0x69, 0x6e, + 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6e, 0x73, 0x12, 0x78, 0x0a, 0x1d, 0x72, 0x65, 0x6c, 0x61, + 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x77, 0x64, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x34, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x6c, 0x61, + 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x19, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, + 0x65, 0x71, 0x12, 0x78, 0x0a, 0x1d, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x77, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, + 0x61, 0x6e, 0x73, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x74, 0x74, 0x6e, 0x2e, + 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x65, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x41, 0x6e, 0x73, 0x48, + 0x00, 0x52, 0x19, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x65, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x41, 0x6e, 0x73, 0x12, 0x7c, 0x0a, 0x1f, + 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x5f, 0x6e, 0x65, 0x77, + 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x18, + 0x2d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x71, 0x48, 0x00, 0x52, 0x0f, 0x70, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x71, 0x12, 0x62, 0x0a, 0x15, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x6c, 0x6f, - 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x1a, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, - 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, - 0x50, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, - 0x65, 0x71, 0x48, 0x00, 0x52, 0x12, 0x70, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x62, 0x0a, 0x15, 0x70, 0x69, 0x6e, 0x67, - 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x61, 0x6e, - 0x73, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, - 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x41, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x12, 0x70, 0x69, 0x6e, 0x67, 0x53, 0x6c, - 0x6f, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x41, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x11, - 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x6e, - 0x73, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, - 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, - 0x41, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x69, 0x6d, - 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x73, 0x12, 0x52, 0x0a, 0x0f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x5f, 0x66, 0x72, 0x65, 0x71, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, - 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0d, 0x62, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x52, 0x65, 0x71, 0x12, 0x52, 0x0a, 0x0f, 0x62, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x5f, 0x61, 0x6e, 0x73, 0x18, 0x1e, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, - 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, - 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x41, 0x6e, 0x73, 0x48, 0x00, 0x52, - 0x0d, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x41, 0x6e, 0x73, 0x12, 0x52, - 0x0a, 0x0f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, - 0x64, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, + 0x64, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x4e, 0x65, 0x77, + 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1a, + 0x72, 0x65, 0x6c, 0x61, 0x79, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x52, 0x0a, 0x08, 0x52, 0x65, + 0x73, 0x65, 0x74, 0x49, 0x6e, 0x64, 0x12, 0x46, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, + 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, + 0x69, 0x6e, 0x6f, 0x72, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x82, 0x01, 0x04, 0x10, 0x01, 0x18, 0x01, + 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x53, + 0x0a, 0x09, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x46, 0x0a, 0x0d, 0x6d, + 0x69, 0x6e, 0x6f, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x82, 0x01, + 0x04, 0x10, 0x01, 0x18, 0x01, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x1a, 0x5f, 0x0a, 0x0c, 0x4c, 0x69, 0x6e, 0x6b, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x41, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x2a, 0x03, 0x18, 0xfe, 0x01, 0x52, 0x06, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x12, 0x2d, 0x0a, 0x0d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x08, 0xfa, 0x42, + 0x05, 0x2a, 0x03, 0x18, 0xff, 0x01, 0x52, 0x0c, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x9e, 0x02, 0x0a, 0x0a, 0x4c, 0x69, 0x6e, 0x6b, 0x41, 0x44, 0x52, + 0x52, 0x65, 0x71, 0x12, 0x4f, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, + 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x08, 0xfa, 0x42, 0x05, + 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2d, 0x0a, 0x0e, 0x74, 0x78, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x2a, 0x02, 0x18, 0x0f, 0x52, 0x0c, 0x74, 0x78, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x2b, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6d, + 0x61, 0x73, 0x6b, 0x18, 0x03, 0x20, 0x03, 0x28, 0x08, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, + 0x02, 0x10, 0x10, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x61, 0x73, 0x6b, + 0x12, 0x39, 0x0a, 0x14, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6d, 0x61, 0x73, 0x6b, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x18, 0x07, 0x52, 0x12, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x4d, 0x61, 0x73, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x22, 0x0a, 0x08, 0x6e, + 0x62, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x2a, 0x02, 0x18, 0x0f, 0x52, 0x07, 0x6e, 0x62, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x4a, + 0x04, 0x08, 0x04, 0x10, 0x05, 0x1a, 0x92, 0x01, 0x0a, 0x0a, 0x4c, 0x69, 0x6e, 0x6b, 0x41, 0x44, + 0x52, 0x41, 0x6e, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, + 0x6d, 0x61, 0x73, 0x6b, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, + 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x61, 0x73, 0x6b, 0x41, 0x63, 0x6b, 0x12, 0x2d, + 0x0a, 0x13, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x63, 0x6b, 0x12, 0x2b, 0x0a, + 0x12, 0x74, 0x78, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, + 0x61, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x74, 0x78, 0x50, 0x6f, 0x77, + 0x65, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x63, 0x6b, 0x1a, 0x63, 0x0a, 0x0c, 0x44, 0x75, + 0x74, 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x53, 0x0a, 0x0e, 0x6d, 0x61, + 0x78, 0x5f, 0x64, 0x75, 0x74, 0x79, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x44, 0x75, + 0x74, 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, + 0x01, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x44, 0x75, 0x74, 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x1a, + 0xf4, 0x01, 0x0a, 0x0f, 0x52, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, + 0x52, 0x65, 0x71, 0x12, 0x56, 0x0a, 0x13, 0x72, 0x78, 0x32, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, + 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x10, 0x72, 0x78, 0x32, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x59, 0x0a, 0x14, 0x72, + 0x78, 0x31, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x74, 0x74, 0x6e, 0x2e, + 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x61, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, + 0x02, 0x10, 0x01, 0x52, 0x11, 0x72, 0x78, 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, + 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x2e, 0x0a, 0x0d, 0x72, 0x78, 0x32, 0x5f, 0x66, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x09, 0xfa, + 0x42, 0x06, 0x32, 0x04, 0x28, 0xa0, 0x8d, 0x06, 0x52, 0x0c, 0x72, 0x78, 0x32, 0x46, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x1a, 0xab, 0x01, 0x0a, 0x0f, 0x52, 0x78, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, 0x41, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x17, 0x72, 0x78, + 0x32, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x72, 0x78, 0x32, + 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x63, 0x6b, + 0x12, 0x36, 0x0a, 0x18, 0x72, 0x78, 0x31, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, + 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x14, 0x72, 0x78, 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x4f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x41, 0x63, 0x6b, 0x12, 0x2a, 0x0a, 0x11, 0x72, 0x78, 0x32, 0x5f, + 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x78, 0x32, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x79, 0x41, 0x63, 0x6b, 0x1a, 0x5e, 0x0a, 0x0c, 0x44, 0x65, 0x76, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x41, 0x6e, 0x73, 0x12, 0x22, 0x0a, 0x07, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x2a, 0x03, 0x18, 0xff, 0x01, 0x52, + 0x07, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x12, 0xfa, 0x42, 0x0f, 0x1a, 0x0d, 0x18, + 0x1f, 0x28, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x52, 0x06, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x1a, 0x99, 0x02, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x2d, 0x0a, 0x0d, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x08, 0xfa, + 0x42, 0x05, 0x2a, 0x03, 0x18, 0xff, 0x01, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x29, 0x0a, 0x09, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x32, 0x06, 0x18, + 0x00, 0x28, 0xa0, 0x8d, 0x06, 0x52, 0x09, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, + 0x12, 0x56, 0x0a, 0x13, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, + 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, + 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x08, 0xfa, 0x42, + 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x10, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x56, 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, + 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x10, + 0x6d, 0x61, 0x78, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x1a, 0x58, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x41, 0x6e, + 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x61, + 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x79, 0x41, 0x63, 0x6b, 0x12, 0x22, 0x0a, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, + 0x61, 0x74, 0x65, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x41, 0x63, 0x6b, 0x1a, 0x66, 0x0a, 0x0c, 0x44, 0x4c, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x2d, 0x0a, 0x0d, 0x63, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x2a, 0x03, 0x18, 0xff, 0x01, 0x52, 0x0c, 0x63, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x27, 0x0a, 0x09, 0x66, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x09, 0xfa, 0x42, + 0x06, 0x32, 0x04, 0x28, 0xa0, 0x8d, 0x06, 0x52, 0x09, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x79, 0x1a, 0x5f, 0x0a, 0x0c, 0x44, 0x4c, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x41, + 0x6e, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x63, 0x6b, 0x12, 0x23, + 0x0a, 0x0d, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x61, 0x63, 0x6b, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, + 0x41, 0x63, 0x6b, 0x1a, 0x4b, 0x0a, 0x10, 0x52, 0x78, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x53, + 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x37, 0x0a, 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x78, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x42, + 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, + 0x1a, 0xb9, 0x01, 0x0a, 0x0f, 0x54, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, + 0x70, 0x52, 0x65, 0x71, 0x12, 0x4a, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x69, 0x72, 0x70, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, + 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x45, 0x49, 0x52, 0x50, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, + 0x10, 0x01, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x45, 0x69, 0x72, 0x70, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x2a, 0x0a, 0x11, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x64, 0x77, 0x65, 0x6c, 0x6c, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x75, 0x70, 0x6c, + 0x69, 0x6e, 0x6b, 0x44, 0x77, 0x65, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, + 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x64, 0x77, 0x65, 0x6c, 0x6c, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x64, 0x6f, 0x77, 0x6e, 0x6c, + 0x69, 0x6e, 0x6b, 0x44, 0x77, 0x65, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x1a, 0x50, 0x0a, 0x08, + 0x52, 0x65, 0x6b, 0x65, 0x79, 0x49, 0x6e, 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x6f, + 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x15, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, + 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x51, + 0x0a, 0x09, 0x52, 0x65, 0x6b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x44, 0x0a, 0x0d, 0x6d, + 0x69, 0x6e, 0x6f, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, + 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x1a, 0xda, 0x01, 0x0a, 0x10, 0x41, 0x44, 0x52, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, + 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x62, 0x0a, 0x16, 0x61, 0x64, 0x72, 0x5f, 0x61, 0x63, + 0x6b, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x44, 0x52, 0x41, 0x63, 0x6b, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, + 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x13, 0x61, 0x64, 0x72, 0x41, 0x63, 0x6b, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x62, 0x0a, 0x16, 0x61, 0x64, + 0x72, 0x5f, 0x61, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x65, 0x78, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x44, 0x52, 0x41, + 0x63, 0x6b, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x42, + 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x13, 0x61, 0x64, 0x72, 0x41, 0x63, + 0x6b, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x1a, 0x49, + 0x0a, 0x0d, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x6e, 0x73, 0x12, + 0x38, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x08, 0xfa, 0x42, 0x05, 0xb2, 0x01, + 0x02, 0x08, 0x01, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x1a, 0xb2, 0x02, 0x0a, 0x0e, 0x46, 0x6f, + 0x72, 0x63, 0x65, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x4c, 0x0a, 0x0b, + 0x72, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x21, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, + 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, + 0x72, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4f, 0x0a, 0x0f, 0x64, 0x61, + 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x28, 0x0a, 0x0b, 0x6d, + 0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x18, 0x07, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x0f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, + 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, + 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, + 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x45, 0x78, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0e, + 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x1a, 0xcc, + 0x01, 0x0a, 0x13, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, + 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x5b, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x45, + 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, + 0x01, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x78, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x12, 0x58, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, + 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, + 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x6d, 0x61, + 0x78, 0x54, 0x69, 0x6d, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x1a, 0x48, 0x0a, + 0x13, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, + 0x70, 0x41, 0x6e, 0x73, 0x12, 0x31, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x45, 0x78, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x6b, 0x1a, 0x53, 0x0a, 0x0f, 0x50, 0x69, 0x6e, 0x67, 0x53, + 0x6c, 0x6f, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x12, 0x40, 0x0a, 0x06, 0x70, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x69, 0x6e, 0x67, + 0x53, 0x6c, 0x6f, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, + 0x01, 0x02, 0x10, 0x01, 0x52, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x1a, 0x90, 0x01, 0x0a, + 0x12, 0x50, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x52, 0x65, 0x71, 0x12, 0x29, 0x0a, 0x09, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x32, 0x06, 0x18, 0x00, 0x28, + 0xa0, 0x8d, 0x06, 0x52, 0x09, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x4f, + 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, + 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, + 0x52, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x1a, + 0x68, 0x0a, 0x12, 0x50, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x41, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x79, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x66, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x41, 0x63, 0x6b, 0x12, 0x2d, 0x0a, 0x13, 0x64, 0x61, + 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x61, 0x63, + 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x64, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x63, 0x6b, 0x1a, 0x61, 0x0a, 0x0f, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x05, + 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x09, 0xfa, 0x42, 0x06, + 0x2a, 0x04, 0x18, 0xff, 0xff, 0x03, 0x52, 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x2d, 0x0a, + 0x0d, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x2a, 0x03, 0x18, 0xff, 0x01, 0x52, 0x0c, + 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x1a, 0x3a, 0x0a, 0x0d, + 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x52, 0x65, 0x71, 0x12, 0x29, 0x0a, + 0x09, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x32, 0x06, 0x18, 0x00, 0x28, 0xa0, 0x8d, 0x06, 0x52, 0x09, 0x66, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x1a, 0x34, 0x0a, 0x0d, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x41, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0c, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x41, 0x63, 0x6b, 0x1a, 0x46, + 0x0a, 0x0d, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x64, 0x12, + 0x35, 0x0a, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, + 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, + 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x1a, 0x47, 0x0a, 0x0e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x4d, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x35, 0x0a, 0x05, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, + 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x42, 0x08, + 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x1a, + 0xde, 0x02, 0x0a, 0x0c, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x65, 0x71, + 0x12, 0x5b, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x49, 0x6e, - 0x64, 0x48, 0x00, 0x52, 0x0d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x49, - 0x6e, 0x64, 0x12, 0x55, 0x0a, 0x10, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, - 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, - 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, - 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x48, 0x00, 0x52, 0x0e, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x1a, 0x52, 0x0a, 0x08, 0x52, 0x65, 0x73, - 0x65, 0x74, 0x49, 0x6e, 0x64, 0x12, 0x46, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x5f, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, - 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x69, - 0x6e, 0x6f, 0x72, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x82, 0x01, 0x04, 0x10, 0x01, 0x18, 0x01, 0x52, - 0x0c, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x53, 0x0a, - 0x09, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x46, 0x0a, 0x0d, 0x6d, 0x69, - 0x6e, 0x6f, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x82, 0x01, 0x04, - 0x10, 0x01, 0x18, 0x01, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x1a, 0x5f, 0x0a, 0x0c, 0x4c, 0x69, 0x6e, 0x6b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x41, - 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x2a, 0x03, 0x18, 0xfe, 0x01, 0x52, 0x06, 0x6d, 0x61, - 0x72, 0x67, 0x69, 0x6e, 0x12, 0x2d, 0x0a, 0x0d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x08, 0xfa, 0x42, 0x05, - 0x2a, 0x03, 0x18, 0xff, 0x01, 0x52, 0x0c, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x1a, 0x9e, 0x02, 0x0a, 0x0a, 0x4c, 0x69, 0x6e, 0x6b, 0x41, 0x44, 0x52, 0x52, - 0x65, 0x71, 0x12, 0x4f, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, - 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, - 0x01, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x2d, 0x0a, 0x0e, 0x74, 0x78, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x2a, 0x02, 0x18, 0x0f, 0x52, 0x0c, 0x74, 0x78, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x2b, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6d, 0x61, - 0x73, 0x6b, 0x18, 0x03, 0x20, 0x03, 0x28, 0x08, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, - 0x10, 0x10, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x61, 0x73, 0x6b, 0x12, - 0x39, 0x0a, 0x14, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x2a, 0x02, 0x18, 0x07, 0x52, 0x12, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, - 0x61, 0x73, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x22, 0x0a, 0x08, 0x6e, 0x62, - 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x2a, 0x02, 0x18, 0x0f, 0x52, 0x07, 0x6e, 0x62, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x4a, 0x04, - 0x08, 0x04, 0x10, 0x05, 0x1a, 0x92, 0x01, 0x0a, 0x0a, 0x4c, 0x69, 0x6e, 0x6b, 0x41, 0x44, 0x52, - 0x41, 0x6e, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6d, - 0x61, 0x73, 0x6b, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x63, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x61, 0x73, 0x6b, 0x41, 0x63, 0x6b, 0x12, 0x2d, 0x0a, - 0x13, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x64, 0x61, 0x74, 0x61, - 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x63, 0x6b, 0x12, 0x2b, 0x0a, 0x12, - 0x74, 0x78, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x61, - 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x74, 0x78, 0x50, 0x6f, 0x77, 0x65, - 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x63, 0x6b, 0x1a, 0x63, 0x0a, 0x0c, 0x44, 0x75, 0x74, - 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x53, 0x0a, 0x0e, 0x6d, 0x61, 0x78, - 0x5f, 0x64, 0x75, 0x74, 0x79, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x65, 0x71, + 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xf0, 0x01, + 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x49, 0x0a, 0x0e, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, + 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x53, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x0d, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x3c, 0x0a, 0x15, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x2a, 0x03, + 0x18, 0xff, 0x01, 0x52, 0x13, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x56, 0x0a, 0x0f, 0x63, 0x61, 0x64, 0x5f, + 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x44, 0x75, 0x74, - 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, - 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x44, 0x75, 0x74, 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x1a, 0xf4, - 0x01, 0x0a, 0x0f, 0x52, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, - 0x65, 0x71, 0x12, 0x56, 0x0a, 0x13, 0x72, 0x78, 0x32, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, - 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x08, - 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x10, 0x72, 0x78, 0x32, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x59, 0x0a, 0x14, 0x72, 0x78, - 0x31, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, - 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, - 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, - 0x10, 0x01, 0x52, 0x11, 0x72, 0x78, 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x4f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x2e, 0x0a, 0x0d, 0x72, 0x78, 0x32, 0x5f, 0x66, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x09, 0xfa, 0x42, - 0x06, 0x32, 0x04, 0x28, 0xa0, 0x8d, 0x06, 0x52, 0x0c, 0x72, 0x78, 0x32, 0x46, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x79, 0x1a, 0xab, 0x01, 0x0a, 0x0f, 0x52, 0x78, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, 0x41, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x17, 0x72, 0x78, 0x32, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x72, 0x78, 0x32, 0x44, + 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x41, 0x44, 0x50, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, + 0x52, 0x0e, 0x63, 0x61, 0x64, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, + 0x1a, 0x80, 0x03, 0x0a, 0x0c, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x41, 0x6e, + 0x73, 0x12, 0x3f, 0x0a, 0x1c, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x61, 0x63, + 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x41, + 0x63, 0x6b, 0x12, 0x40, 0x0a, 0x1d, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x63, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x61, 0x63, 0x6b, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, + 0x61, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x6b, 0x4f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x41, 0x63, 0x6b, 0x12, 0x49, 0x0a, 0x22, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x63, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x1d, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x63, 0x6b, 0x12, - 0x36, 0x0a, 0x18, 0x72, 0x78, 0x31, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, - 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x14, 0x72, 0x78, 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x4f, 0x66, - 0x66, 0x73, 0x65, 0x74, 0x41, 0x63, 0x6b, 0x12, 0x2a, 0x0a, 0x11, 0x72, 0x78, 0x32, 0x5f, 0x66, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0f, 0x72, 0x78, 0x32, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, - 0x41, 0x63, 0x6b, 0x1a, 0x5e, 0x0a, 0x0c, 0x44, 0x65, 0x76, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x41, 0x6e, 0x73, 0x12, 0x22, 0x0a, 0x07, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x2a, 0x03, 0x18, 0xff, 0x01, 0x52, 0x07, - 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x67, 0x69, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x12, 0xfa, 0x42, 0x0f, 0x1a, 0x0d, 0x18, 0x1f, - 0x28, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x52, 0x06, 0x6d, 0x61, 0x72, - 0x67, 0x69, 0x6e, 0x1a, 0x99, 0x02, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x2d, 0x0a, 0x0d, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x08, 0xfa, 0x42, - 0x05, 0x2a, 0x03, 0x18, 0xff, 0x01, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x29, 0x0a, 0x09, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x32, 0x06, 0x18, 0x00, - 0x28, 0xa0, 0x8d, 0x06, 0x52, 0x09, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, - 0x56, 0x0a, 0x13, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, - 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, - 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x08, 0xfa, 0x42, 0x05, - 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x10, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, - 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x56, 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, - 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x10, 0x6d, - 0x61, 0x78, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x1a, - 0x58, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x41, 0x6e, 0x73, - 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x61, 0x63, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x79, 0x41, 0x63, 0x6b, 0x12, 0x22, 0x0a, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, - 0x74, 0x65, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x41, 0x63, 0x6b, 0x1a, 0x66, 0x0a, 0x0c, 0x44, 0x4c, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x2d, 0x0a, 0x0d, 0x63, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x42, 0x08, 0xfa, 0x42, 0x05, 0x2a, 0x03, 0x18, 0xff, 0x01, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x27, 0x0a, 0x09, 0x66, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x09, 0xfa, 0x42, 0x06, - 0x32, 0x04, 0x28, 0xa0, 0x8d, 0x06, 0x52, 0x09, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x79, 0x1a, 0x5f, 0x0a, 0x0c, 0x44, 0x4c, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x41, 0x6e, - 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x63, 0x6b, 0x12, 0x23, 0x0a, - 0x0d, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x41, - 0x63, 0x6b, 0x1a, 0x4b, 0x0a, 0x10, 0x52, 0x78, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x53, 0x65, - 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x37, 0x0a, 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, - 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x78, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x08, - 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x1a, - 0xb9, 0x01, 0x0a, 0x0f, 0x54, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, - 0x52, 0x65, 0x71, 0x12, 0x4a, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x69, 0x72, 0x70, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, 0x74, - 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x45, 0x49, 0x52, 0x50, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, - 0x01, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x45, 0x69, 0x72, 0x70, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x2a, 0x0a, 0x11, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x64, 0x77, 0x65, 0x6c, 0x6c, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x75, 0x70, 0x6c, 0x69, - 0x6e, 0x6b, 0x44, 0x77, 0x65, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x64, - 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x64, 0x77, 0x65, 0x6c, 0x6c, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, - 0x6e, 0x6b, 0x44, 0x77, 0x65, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x1a, 0x50, 0x0a, 0x08, 0x52, - 0x65, 0x6b, 0x65, 0x79, 0x49, 0x6e, 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x6f, 0x72, - 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, + 0x37, 0x0a, 0x18, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x15, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x63, 0x6b, 0x12, 0x39, 0x0a, 0x19, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x41, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x61, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x11, 0x63, 0x61, 0x64, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, + 0x41, 0x63, 0x6b, 0x1a, 0xce, 0x04, 0x0a, 0x15, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x6e, 0x64, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x65, 0x71, 0x12, 0x64, 0x0a, + 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, + 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x52, 0x65, 0x71, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x1a, 0xce, 0x03, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x06, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, + 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x48, + 0x00, 0x52, 0x06, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x12, 0x45, 0x0a, 0x07, 0x64, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, + 0x79, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, + 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x07, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, + 0x12, 0x62, 0x0a, 0x15, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2c, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, + 0x13, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x18, 0x3f, 0x52, 0x07, + 0x62, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x12, 0x49, 0x0a, 0x0e, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x52, 0x0d, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x12, 0x53, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xfa, + 0x42, 0x24, 0x72, 0x22, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, + 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, + 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x42, 0x0b, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, + 0x03, 0xf8, 0x42, 0x01, 0x1a, 0xa2, 0x02, 0x0a, 0x15, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x6e, + 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x41, 0x6e, 0x73, 0x12, 0x3f, + 0x0a, 0x1c, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x41, 0x63, 0x6b, 0x12, + 0x49, 0x0a, 0x22, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1d, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, + 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x63, 0x6b, 0x12, 0x37, 0x0a, 0x18, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x41, 0x63, 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x5f, 0x61, + 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x6f, 0x66, + 0x66, 0x41, 0x63, 0x6b, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x1d, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x61, 0x63, 0x6b, 0x5f, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x63, 0x6b, 0x1a, 0x9b, 0x08, 0x0a, 0x18, 0x52, 0x65, + 0x6c, 0x61, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0a, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, + 0x02, 0x18, 0x0f, 0x52, 0x09, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4f, + 0x0a, 0x0e, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x55, 0x70, 0x6c, + 0x69, 0x6e, 0x6b, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x52, 0x0d, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, + 0xed, 0x02, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x42, 0xd1, 0x02, 0x92, 0x41, 0x19, 0x4a, 0x0a, 0x22, 0x32, 0x36, 0x30, 0x30, 0x41, + 0x42, 0x43, 0x44, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0xfa, 0x42, 0x06, 0x7a, 0x04, 0x68, 0x04, 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, + 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x12, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x34, 0x42, 0x79, 0x74, 0x65, + 0x73, 0xf2, 0xaa, 0x19, 0xa0, 0x01, 0x1a, 0x4e, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, + 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6d, + 0x64, 0x2f, 0x74, 0x74, 0x6e, 0x2d, 0x6c, 0x77, 0x2d, 0x63, 0x6c, 0x69, 0x2f, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2e, 0x4e, 0x65, 0x77, 0x34, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x46, 0x6c, 0x61, 0x67, 0x22, 0x4e, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, + 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6d, + 0x64, 0x2f, 0x74, 0x74, 0x6e, 0x2d, 0x6c, 0x77, 0x2d, 0x63, 0x6c, 0x69, 0x2f, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x61, 0x63, + 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x07, 0x64, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x12, + 0x16, 0x0a, 0x07, 0x77, 0x5f, 0x66, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x77, 0x46, 0x43, 0x6e, 0x74, 0x12, 0x91, 0x03, 0x0a, 0x0e, 0x72, 0x6f, 0x6f, 0x74, + 0x5f, 0x77, 0x6f, 0x72, 0x5f, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, + 0x42, 0xeb, 0x02, 0x92, 0x41, 0x31, 0x4a, 0x22, 0x22, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, + 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, 0x42, 0x06, 0x7a, 0x04, 0x68, 0x10, 0x70, 0x01, + 0xea, 0xaa, 0x19, 0x83, 0x01, 0x0a, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, + 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, + 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, + 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x48, 0x45, + 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x40, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, + 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, + 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, + 0x6c, 0x31, 0x36, 0x42, 0x79, 0x74, 0x65, 0x73, 0xf2, 0xaa, 0x19, 0xa1, 0x01, 0x1a, 0x4f, 0x67, + 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, + 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6d, 0x64, 0x2f, 0x74, 0x74, 0x6e, 0x2d, 0x6c, 0x77, 0x2d, + 0x63, 0x6c, 0x69, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2e, + 0x4e, 0x65, 0x77, 0x31, 0x36, 0x42, 0x79, 0x74, 0x65, 0x73, 0x46, 0x6c, 0x61, 0x67, 0x22, 0x4e, + 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6d, 0x64, 0x2f, 0x74, 0x74, 0x6e, 0x2d, 0x6c, 0x77, + 0x2d, 0x63, 0x6c, 0x69, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x66, 0x6c, 0x61, 0x67, 0x73, + 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x61, 0x63, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x0b, + 0x72, 0x6f, 0x6f, 0x74, 0x57, 0x6f, 0x72, 0x53, 0x4b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x09, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, + 0xfa, 0x42, 0x24, 0x72, 0x22, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, + 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, + 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x1a, 0x1a, 0x0a, 0x18, 0x52, 0x65, 0x6c, 0x61, 0x79, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x4c, 0x69, 0x73, 0x74, + 0x41, 0x6e, 0x73, 0x1a, 0x83, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x74, 0x72, + 0x6c, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x26, + 0x0a, 0x0a, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x18, 0x0f, 0x52, 0x09, 0x72, 0x75, 0x6c, + 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x41, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x74, 0x72, + 0x6c, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x56, 0x0a, 0x16, 0x52, 0x65, 0x6c, + 0x61, 0x79, 0x43, 0x74, 0x72, 0x6c, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x4c, 0x69, 0x73, 0x74, + 0x41, 0x6e, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x75, 0x6c, + 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x63, 0x6b, 0x12, 0x16, 0x0a, 0x07, 0x77, 0x5f, 0x66, + 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x77, 0x46, 0x43, 0x6e, + 0x74, 0x1a, 0xb1, 0x03, 0x0a, 0x19, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x65, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x12, + 0x56, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x74, + 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, + 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x52, 0x11, 0x72, 0x65, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x13, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, + 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x6f, 0x72, 0x77, 0x61, + 0x72, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x11, 0x6a, 0x6f, 0x69, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x6e, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x0c, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x73, 0x12, 0x54, 0x0a, 0x14, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x75, + 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x12, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x55, 0x70, + 0x6c, 0x69, 0x6e, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x49, 0x0a, 0x0e, 0x6f, 0x76, + 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x0d, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x73, 0x1a, 0x1b, 0x0a, 0x19, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x41, + 0x6e, 0x73, 0x1a, 0xe3, 0x03, 0x0a, 0x1a, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x4e, 0x6f, 0x74, 0x69, + 0x66, 0x79, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x12, 0xed, 0x02, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x42, 0xd1, 0x02, 0x92, 0x41, 0x19, 0x4a, 0x0a, 0x22, 0x32, 0x36, 0x30, + 0x30, 0x41, 0x42, 0x43, 0x44, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0xfa, 0x42, 0x06, 0x7a, 0x04, 0x68, 0x04, 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, + 0x01, 0x0a, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x12, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, + 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x34, 0x42, 0x79, + 0x74, 0x65, 0x73, 0xf2, 0xaa, 0x19, 0xa0, 0x01, 0x1a, 0x4e, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, + 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, + 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, + 0x63, 0x6d, 0x64, 0x2f, 0x74, 0x74, 0x6e, 0x2d, 0x6c, 0x77, 0x2d, 0x63, 0x6c, 0x69, 0x2f, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2e, 0x4e, 0x65, 0x77, 0x34, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x46, 0x6c, 0x61, 0x67, 0x22, 0x4e, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, + 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, + 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, + 0x63, 0x6d, 0x64, 0x2f, 0x74, 0x74, 0x6e, 0x2d, 0x6c, 0x77, 0x2d, 0x63, 0x6c, 0x69, 0x2f, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, + 0x61, 0x63, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x07, 0x64, 0x65, 0x76, 0x41, 0x64, 0x64, + 0x72, 0x12, 0x24, 0x0a, 0x03, 0x73, 0x6e, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x12, + 0xfa, 0x42, 0x0f, 0x1a, 0x0d, 0x18, 0x0b, 0x28, 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x01, 0x52, 0x03, 0x73, 0x6e, 0x72, 0x12, 0x2f, 0x0a, 0x04, 0x72, 0x73, 0x73, 0x69, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x1b, 0xfa, 0x42, 0x18, 0x1a, 0x16, 0x18, 0xf1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x28, 0xf2, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x01, 0x52, 0x04, 0x72, 0x73, 0x73, 0x69, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x4a, 0x04, 0x08, 0x25, 0x10, 0x26, 0x4a, 0x04, 0x08, 0x26, 0x10, 0x27, 0x52, + 0x15, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6c, 0x69, + 0x73, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x52, 0x15, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x61, 0x6e, 0x73, 0x22, 0x45, 0x0a, + 0x0b, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x36, 0x0a, 0x08, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, - 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, - 0x0c, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x51, 0x0a, - 0x09, 0x52, 0x65, 0x6b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x44, 0x0a, 0x0d, 0x6d, 0x69, - 0x6e, 0x6f, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, - 0x10, 0x01, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x1a, 0xda, 0x01, 0x0a, 0x10, 0x41, 0x44, 0x52, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, - 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x62, 0x0a, 0x16, 0x61, 0x64, 0x72, 0x5f, 0x61, 0x63, 0x6b, - 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, - 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x44, 0x52, 0x41, 0x63, 0x6b, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, - 0x01, 0x02, 0x10, 0x01, 0x52, 0x13, 0x61, 0x64, 0x72, 0x41, 0x63, 0x6b, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x62, 0x0a, 0x16, 0x61, 0x64, 0x72, - 0x5f, 0x61, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, - 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x44, 0x52, 0x41, 0x63, - 0x6b, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x42, 0x08, - 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x13, 0x61, 0x64, 0x72, 0x41, 0x63, 0x6b, - 0x44, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x1a, 0x49, 0x0a, - 0x0d, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x6e, 0x73, 0x12, 0x38, - 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x08, 0xfa, 0x42, 0x05, 0xb2, 0x01, 0x02, - 0x08, 0x01, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x1a, 0xb2, 0x02, 0x0a, 0x0e, 0x46, 0x6f, 0x72, - 0x63, 0x65, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x4c, 0x0a, 0x0b, 0x72, - 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x21, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, - 0x33, 0x2e, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x72, - 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4f, 0x0a, 0x0f, 0x64, 0x61, 0x74, - 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, - 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x64, 0x61, 0x74, - 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x28, 0x0a, 0x0b, 0x6d, 0x61, - 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x18, 0x07, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x0f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, - 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, - 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x70, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x1a, 0xcc, 0x01, - 0x0a, 0x13, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, - 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x5b, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x78, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, - 0x52, 0x10, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x12, 0x58, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, - 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, - 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x6d, 0x61, 0x78, - 0x54, 0x69, 0x6d, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x1a, 0x48, 0x0a, 0x13, - 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, - 0x41, 0x6e, 0x73, 0x12, 0x31, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, - 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x41, 0x63, 0x6b, 0x1a, 0x53, 0x0a, 0x0f, 0x50, 0x69, 0x6e, 0x67, 0x53, 0x6c, - 0x6f, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x12, 0x40, 0x0a, 0x06, 0x70, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x74, 0x74, 0x6e, 0x2e, - 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x53, - 0x6c, 0x6f, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, - 0x02, 0x10, 0x01, 0x52, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x1a, 0x90, 0x01, 0x0a, 0x12, - 0x50, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, - 0x65, 0x71, 0x12, 0x29, 0x0a, 0x09, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x32, 0x06, 0x18, 0x00, 0x28, 0xa0, - 0x8d, 0x06, 0x52, 0x09, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x4f, 0x0a, - 0x0f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x73, 0x22, 0x43, 0x0a, 0x0e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x32, 0x04, 0x28, 0xa0, 0x8d, 0x06, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x10, 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0xf2, + 0xaa, 0x19, 0x06, 0x08, 0x01, 0x10, 0x01, 0x18, 0x01, 0x22, 0x4d, 0x0a, 0x16, 0x5a, 0x65, 0x72, + 0x6f, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x32, 0x06, 0x18, 0x00, 0x28, 0xa0, 0x8d, 0x06, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x10, 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0xf2, 0xaa, + 0x19, 0x06, 0x08, 0x01, 0x10, 0x01, 0x18, 0x01, 0x22, 0x67, 0x0a, 0x13, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x61, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x3e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, + 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x08, + 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x10, 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0xf2, 0xaa, 0x19, 0x06, 0x08, 0x01, 0x10, 0x01, 0x18, + 0x01, 0x22, 0x65, 0x0a, 0x12, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, - 0x0d, 0x64, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x1a, 0x68, - 0x0a, 0x12, 0x50, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x41, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x79, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x66, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x41, 0x63, 0x6b, 0x12, 0x2d, 0x0a, 0x13, 0x64, 0x61, 0x74, - 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x61, 0x63, 0x6b, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x64, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x63, 0x6b, 0x1a, 0x61, 0x0a, 0x0f, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x05, 0x64, - 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x2a, - 0x04, 0x18, 0xff, 0xff, 0x03, 0x52, 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x2d, 0x0a, 0x0d, - 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x2a, 0x03, 0x18, 0xff, 0x01, 0x52, 0x0c, 0x63, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x1a, 0x3a, 0x0a, 0x0d, 0x42, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x52, 0x65, 0x71, 0x12, 0x29, 0x0a, 0x09, - 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, - 0x0b, 0xfa, 0x42, 0x08, 0x32, 0x06, 0x18, 0x00, 0x28, 0xa0, 0x8d, 0x06, 0x52, 0x09, 0x66, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x1a, 0x34, 0x0a, 0x0d, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x46, 0x72, 0x65, 0x71, 0x41, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0c, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x41, 0x63, 0x6b, 0x1a, 0x46, 0x0a, - 0x0d, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x64, 0x12, 0x35, - 0x0a, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, - 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x1a, 0x47, 0x0a, 0x0e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, - 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x35, 0x0a, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, - 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x42, 0x08, 0xfa, - 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x42, 0x09, - 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x45, 0x0a, 0x0b, 0x4d, 0x41, 0x43, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x74, 0x6e, - 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x41, 0x43, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, - 0x22, 0x43, 0x0a, 0x0e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x32, 0x04, 0x28, 0xa0, 0x8d, 0x06, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x10, 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0xf2, 0xaa, 0x19, 0x06, 0x08, - 0x01, 0x10, 0x01, 0x18, 0x01, 0x22, 0x4d, 0x0a, 0x16, 0x5a, 0x65, 0x72, 0x6f, 0x61, 0x62, 0x6c, - 0x65, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x21, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x0b, - 0xfa, 0x42, 0x08, 0x32, 0x06, 0x18, 0x00, 0x28, 0xa0, 0x8d, 0x06, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x10, 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0xf2, 0xaa, 0x19, 0x06, 0x08, 0x01, - 0x10, 0x01, 0x18, 0x01, 0x22, 0x67, 0x0a, 0x13, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, - 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3e, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x74, 0x74, 0x6e, - 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x52, 0x61, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, - 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x10, 0xea, 0xaa, 0x19, - 0x02, 0x18, 0x01, 0xf2, 0xaa, 0x19, 0x06, 0x08, 0x01, 0x10, 0x01, 0x18, 0x01, 0x22, 0x65, 0x0a, - 0x12, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x3d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, - 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x10, 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0xf2, 0xaa, 0x19, 0x06, 0x08, 0x01, - 0x10, 0x01, 0x18, 0x01, 0x22, 0x67, 0x0a, 0x13, 0x50, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, - 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3e, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x74, 0x74, 0x6e, - 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x69, 0x6e, 0x67, - 0x53, 0x6c, 0x6f, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, - 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x10, 0xea, 0xaa, 0x19, - 0x02, 0x18, 0x01, 0xf2, 0xaa, 0x19, 0x06, 0x08, 0x01, 0x10, 0x01, 0x18, 0x01, 0x22, 0x71, 0x0a, - 0x18, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x44, 0x75, 0x74, 0x79, 0x43, - 0x79, 0x63, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x43, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, - 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, - 0x61, 0x74, 0x65, 0x64, 0x44, 0x75, 0x74, 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x42, 0x08, 0xfa, - 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x10, - 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0xf2, 0xaa, 0x19, 0x06, 0x08, 0x01, 0x10, 0x01, 0x18, 0x01, - 0x22, 0x59, 0x0a, 0x0c, 0x52, 0x78, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x37, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x17, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, - 0x2e, 0x52, 0x78, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, - 0x10, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x10, 0xea, 0xaa, 0x19, 0x02, 0x18, - 0x01, 0xf2, 0xaa, 0x19, 0x06, 0x08, 0x01, 0x10, 0x01, 0x18, 0x01, 0x22, 0x71, 0x0a, 0x18, 0x41, - 0x44, 0x52, 0x41, 0x63, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x43, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, - 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x44, 0x52, 0x41, 0x63, 0x6b, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, - 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x10, 0xea, 0xaa, - 0x19, 0x02, 0x18, 0x01, 0xf2, 0xaa, 0x19, 0x06, 0x08, 0x01, 0x10, 0x01, 0x18, 0x01, 0x22, 0x71, - 0x0a, 0x18, 0x41, 0x44, 0x52, 0x41, 0x63, 0x6b, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x78, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x43, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, 0x2e, - 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x44, 0x52, 0x41, 0x63, - 0x6b, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x42, 0x08, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x10, 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0xf2, 0xaa, + 0x19, 0x06, 0x08, 0x01, 0x10, 0x01, 0x18, 0x01, 0x22, 0x67, 0x0a, 0x13, 0x50, 0x69, 0x6e, 0x67, + 0x53, 0x6c, 0x6f, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x3e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, + 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, + 0x50, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x10, 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0xf2, 0xaa, 0x19, 0x06, 0x08, 0x01, 0x10, 0x01, 0x18, - 0x01, 0x22, 0x5f, 0x0a, 0x0f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, 0x49, 0x52, 0x50, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, - 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, 0x49, 0x52, 0x50, 0x42, + 0x01, 0x22, 0x71, 0x0a, 0x18, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x44, + 0x75, 0x74, 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x43, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x74, + 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x44, 0x75, 0x74, 0x79, 0x43, 0x79, 0x63, 0x6c, + 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x10, 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0xf2, 0xaa, 0x19, 0x06, 0x08, 0x01, + 0x10, 0x01, 0x18, 0x01, 0x22, 0x59, 0x0a, 0x0c, 0x52, 0x78, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x78, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x08, 0xfa, 0x42, + 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x10, 0xea, + 0xaa, 0x19, 0x02, 0x18, 0x01, 0xf2, 0xaa, 0x19, 0x06, 0x08, 0x01, 0x10, 0x01, 0x18, 0x01, 0x22, + 0x71, 0x0a, 0x18, 0x41, 0x44, 0x52, 0x41, 0x63, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x78, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x43, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x44, 0x52, 0x41, + 0x63, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x10, 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0xf2, 0xaa, 0x19, 0x06, 0x08, 0x01, 0x10, 0x01, - 0x18, 0x01, 0x2a, 0xa7, 0x01, 0x0a, 0x05, 0x4d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, - 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x00, 0x12, 0x0f, - 0x0a, 0x0b, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x50, 0x54, 0x10, 0x01, 0x12, - 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x5f, 0x55, - 0x50, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x4e, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, - 0x45, 0x44, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x4f, 0x4e, - 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x5f, 0x55, 0x50, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x43, - 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x05, 0x12, - 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, - 0x54, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x52, 0x4f, 0x50, 0x52, 0x49, 0x45, 0x54, 0x41, - 0x52, 0x59, 0x10, 0x07, 0x1a, 0x06, 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0x2a, 0x28, 0x0a, 0x05, - 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x0e, 0x0a, 0x0a, 0x4c, 0x4f, 0x52, 0x41, 0x57, 0x41, 0x4e, - 0x5f, 0x52, 0x31, 0x10, 0x00, 0x1a, 0x0f, 0xea, 0xaa, 0x19, 0x0b, 0x18, 0x01, 0x2a, 0x07, 0x4c, - 0x4f, 0x52, 0x41, 0x57, 0x41, 0x4e, 0x2a, 0xb9, 0x02, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0b, 0x4d, 0x41, 0x43, 0x5f, 0x55, 0x4e, 0x4b, - 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x1a, 0x0d, 0xea, 0xaa, 0x19, 0x09, 0x12, 0x07, 0x75, 0x6e, - 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x12, 0x1e, 0x0a, 0x08, 0x4d, 0x41, 0x43, 0x5f, 0x56, 0x31, 0x5f, - 0x30, 0x10, 0x01, 0x1a, 0x10, 0xea, 0xaa, 0x19, 0x0c, 0x12, 0x03, 0x31, 0x2e, 0x30, 0x12, 0x05, - 0x31, 0x2e, 0x30, 0x2e, 0x30, 0x12, 0x1b, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x5f, 0x56, 0x31, 0x5f, - 0x30, 0x5f, 0x31, 0x10, 0x02, 0x1a, 0x0b, 0xea, 0xaa, 0x19, 0x07, 0x12, 0x05, 0x31, 0x2e, 0x30, - 0x2e, 0x31, 0x12, 0x1b, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x32, - 0x10, 0x03, 0x1a, 0x0b, 0xea, 0xaa, 0x19, 0x07, 0x12, 0x05, 0x31, 0x2e, 0x30, 0x2e, 0x32, 0x12, - 0x1e, 0x0a, 0x08, 0x4d, 0x41, 0x43, 0x5f, 0x56, 0x31, 0x5f, 0x31, 0x10, 0x04, 0x1a, 0x10, 0xea, - 0xaa, 0x19, 0x0c, 0x12, 0x03, 0x31, 0x2e, 0x31, 0x12, 0x05, 0x31, 0x2e, 0x31, 0x2e, 0x30, 0x12, - 0x1b, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x33, 0x10, 0x05, 0x1a, - 0x0b, 0xea, 0xaa, 0x19, 0x07, 0x12, 0x05, 0x31, 0x2e, 0x30, 0x2e, 0x33, 0x12, 0x1b, 0x0a, 0x0a, - 0x4d, 0x41, 0x43, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x34, 0x10, 0x06, 0x1a, 0x0b, 0xea, 0xaa, - 0x19, 0x07, 0x12, 0x05, 0x31, 0x2e, 0x30, 0x2e, 0x34, 0x1a, 0x57, 0xea, 0xaa, 0x19, 0x07, 0x18, - 0x01, 0x2a, 0x03, 0x4d, 0x41, 0x43, 0xf2, 0xaa, 0x19, 0x48, 0x0a, 0x46, 0x67, 0x6f, 0x2e, 0x74, - 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, - 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x74, 0x6e, 0x70, 0x62, 0x2e, 0x4d, 0x41, 0x43, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x2a, 0xcb, 0x05, 0x0a, 0x0a, 0x50, 0x48, 0x59, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x1e, 0x0a, 0x0b, 0x50, 0x48, 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, - 0x10, 0x00, 0x1a, 0x0d, 0xea, 0xaa, 0x19, 0x09, 0x12, 0x07, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, - 0x6e, 0x12, 0x24, 0x0a, 0x08, 0x50, 0x48, 0x59, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x10, 0x01, 0x1a, - 0x16, 0xea, 0xaa, 0x19, 0x12, 0x12, 0x03, 0x31, 0x2e, 0x30, 0x12, 0x05, 0x31, 0x2e, 0x30, 0x2e, - 0x30, 0x12, 0x04, 0x56, 0x31, 0x5f, 0x30, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x53, 0x30, 0x30, 0x31, - 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x50, 0x48, 0x59, 0x5f, 0x56, - 0x31, 0x5f, 0x30, 0x5f, 0x31, 0x10, 0x02, 0x1a, 0x13, 0xea, 0xaa, 0x19, 0x0f, 0x12, 0x05, 0x31, - 0x2e, 0x30, 0x2e, 0x31, 0x12, 0x06, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x31, 0x12, 0x10, 0x0a, 0x0c, - 0x54, 0x53, 0x30, 0x30, 0x31, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x31, 0x10, 0x02, 0x12, 0x40, - 0x0a, 0x10, 0x50, 0x48, 0x59, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x32, 0x5f, 0x52, 0x45, 0x56, - 0x5f, 0x41, 0x10, 0x03, 0x1a, 0x2a, 0xea, 0xaa, 0x19, 0x26, 0x12, 0x05, 0x31, 0x2e, 0x30, 0x2e, - 0x32, 0x12, 0x07, 0x31, 0x2e, 0x30, 0x2e, 0x32, 0x2d, 0x61, 0x12, 0x06, 0x56, 0x31, 0x5f, 0x30, - 0x5f, 0x32, 0x12, 0x0c, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x32, 0x5f, 0x52, 0x45, 0x56, 0x5f, 0x41, - 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x50, 0x30, 0x30, 0x31, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x32, - 0x10, 0x03, 0x12, 0x31, 0x0a, 0x10, 0x50, 0x48, 0x59, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x32, - 0x5f, 0x52, 0x45, 0x56, 0x5f, 0x42, 0x10, 0x04, 0x1a, 0x1b, 0xea, 0xaa, 0x19, 0x17, 0x12, 0x07, - 0x31, 0x2e, 0x30, 0x2e, 0x32, 0x2d, 0x62, 0x12, 0x0c, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x32, 0x5f, - 0x52, 0x45, 0x56, 0x5f, 0x42, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x50, 0x30, 0x30, 0x31, 0x5f, 0x56, - 0x31, 0x5f, 0x30, 0x5f, 0x32, 0x5f, 0x52, 0x45, 0x56, 0x5f, 0x42, 0x10, 0x04, 0x12, 0x34, 0x0a, - 0x0e, 0x50, 0x48, 0x59, 0x5f, 0x56, 0x31, 0x5f, 0x31, 0x5f, 0x52, 0x45, 0x56, 0x5f, 0x41, 0x10, - 0x05, 0x1a, 0x20, 0xea, 0xaa, 0x19, 0x1c, 0x12, 0x05, 0x31, 0x2e, 0x31, 0x2d, 0x61, 0x12, 0x07, - 0x31, 0x2e, 0x31, 0x2e, 0x30, 0x2d, 0x61, 0x12, 0x0a, 0x56, 0x31, 0x5f, 0x31, 0x5f, 0x52, 0x45, - 0x56, 0x5f, 0x41, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x50, 0x30, 0x30, 0x31, 0x5f, 0x56, 0x31, 0x5f, - 0x31, 0x5f, 0x52, 0x45, 0x56, 0x5f, 0x41, 0x10, 0x05, 0x12, 0x34, 0x0a, 0x0e, 0x50, 0x48, 0x59, - 0x5f, 0x56, 0x31, 0x5f, 0x31, 0x5f, 0x52, 0x45, 0x56, 0x5f, 0x42, 0x10, 0x06, 0x1a, 0x20, 0xea, - 0xaa, 0x19, 0x1c, 0x12, 0x05, 0x31, 0x2e, 0x31, 0x2d, 0x62, 0x12, 0x07, 0x31, 0x2e, 0x31, 0x2e, - 0x30, 0x2d, 0x62, 0x12, 0x0a, 0x56, 0x31, 0x5f, 0x31, 0x5f, 0x52, 0x45, 0x56, 0x5f, 0x42, 0x12, - 0x14, 0x0a, 0x10, 0x52, 0x50, 0x30, 0x30, 0x31, 0x5f, 0x56, 0x31, 0x5f, 0x31, 0x5f, 0x52, 0x45, - 0x56, 0x5f, 0x42, 0x10, 0x06, 0x12, 0x31, 0x0a, 0x10, 0x50, 0x48, 0x59, 0x5f, 0x56, 0x31, 0x5f, - 0x30, 0x5f, 0x33, 0x5f, 0x52, 0x45, 0x56, 0x5f, 0x41, 0x10, 0x07, 0x1a, 0x1b, 0xea, 0xaa, 0x19, - 0x17, 0x12, 0x07, 0x31, 0x2e, 0x30, 0x2e, 0x33, 0x2d, 0x61, 0x12, 0x0c, 0x56, 0x31, 0x5f, 0x30, - 0x5f, 0x33, 0x5f, 0x52, 0x45, 0x56, 0x5f, 0x41, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x50, 0x30, 0x30, - 0x31, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x33, 0x5f, 0x52, 0x45, 0x56, 0x5f, 0x41, 0x10, 0x07, - 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x50, 0x30, 0x30, 0x32, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x30, - 0x10, 0x08, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x50, 0x30, 0x30, 0x32, 0x5f, 0x56, 0x31, 0x5f, 0x30, - 0x5f, 0x31, 0x10, 0x09, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x50, 0x30, 0x30, 0x32, 0x5f, 0x56, 0x31, - 0x5f, 0x30, 0x5f, 0x32, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x50, 0x30, 0x30, 0x32, 0x5f, - 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x33, 0x10, 0x0b, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x50, 0x30, 0x30, - 0x32, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x34, 0x10, 0x0c, 0x1a, 0x54, 0xea, 0xaa, 0x19, 0x02, - 0x18, 0x01, 0xf2, 0xaa, 0x19, 0x48, 0x0a, 0x46, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, + 0x18, 0x01, 0x22, 0x71, 0x0a, 0x18, 0x41, 0x44, 0x52, 0x41, 0x63, 0x6b, 0x44, 0x65, 0x6c, 0x61, + 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x43, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, + 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, + 0x44, 0x52, 0x41, 0x63, 0x6b, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x10, 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0xf2, 0xaa, 0x19, 0x06, 0x08, + 0x01, 0x10, 0x01, 0x18, 0x01, 0x22, 0x5f, 0x0a, 0x0f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, + 0x49, 0x52, 0x50, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, + 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, + 0x49, 0x52, 0x50, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x10, 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0xf2, 0xaa, 0x19, 0x06, + 0x08, 0x01, 0x10, 0x01, 0x18, 0x01, 0x22, 0xcf, 0x02, 0x0a, 0x15, 0x52, 0x65, 0x6c, 0x61, 0x79, + 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x52, 0x65, 0x71, + 0x12, 0x3f, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x42, 0x08, 0xfa, + 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, + 0x65, 0x12, 0x24, 0x0a, 0x03, 0x73, 0x6e, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x12, + 0xfa, 0x42, 0x0f, 0x1a, 0x0d, 0x18, 0x0b, 0x28, 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x01, 0x52, 0x03, 0x73, 0x6e, 0x72, 0x12, 0x2f, 0x0a, 0x04, 0x72, 0x73, 0x73, 0x69, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x1b, 0xfa, 0x42, 0x18, 0x1a, 0x16, 0x18, 0xf1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x28, 0xf2, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x01, 0x52, 0x04, 0x72, 0x73, 0x73, 0x69, 0x12, 0x4a, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x5f, + 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, + 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, + 0x65, 0x6c, 0x61, 0x79, 0x57, 0x4f, 0x52, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x42, 0x08, + 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x27, 0x0a, 0x09, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x32, 0x04, 0x28, 0xa0, + 0x8d, 0x06, 0x52, 0x09, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x1f, 0x0a, + 0x0b, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0a, 0x72, 0x61, 0x77, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x08, + 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0x44, 0x0a, 0x17, 0x52, 0x65, 0x6c, 0x61, + 0x79, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, + 0x52, 0x65, 0x71, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x72, 0x61, 0x77, 0x50, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0x98, + 0x01, 0x0a, 0x10, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x40, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, + 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x73, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x0a, 0x66, + 0x75, 0x6c, 0x6c, 0x5f, 0x66, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x46, 0x43, 0x6e, 0x74, 0x2a, 0xa7, 0x01, 0x0a, 0x05, 0x4d, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x55, + 0x45, 0x53, 0x54, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x41, 0x43, + 0x43, 0x45, 0x50, 0x54, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x43, 0x4f, 0x4e, 0x46, + 0x49, 0x52, 0x4d, 0x45, 0x44, 0x5f, 0x55, 0x50, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x4e, + 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x03, + 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x5f, 0x55, 0x50, + 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x5f, + 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, + 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x52, + 0x4f, 0x50, 0x52, 0x49, 0x45, 0x54, 0x41, 0x52, 0x59, 0x10, 0x07, 0x1a, 0x06, 0xea, 0xaa, 0x19, + 0x02, 0x18, 0x01, 0x2a, 0x28, 0x0a, 0x05, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x0e, 0x0a, 0x0a, + 0x4c, 0x4f, 0x52, 0x41, 0x57, 0x41, 0x4e, 0x5f, 0x52, 0x31, 0x10, 0x00, 0x1a, 0x0f, 0xea, 0xaa, + 0x19, 0x0b, 0x18, 0x01, 0x2a, 0x07, 0x4c, 0x4f, 0x52, 0x41, 0x57, 0x41, 0x4e, 0x2a, 0xb9, 0x02, + 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0b, + 0x4d, 0x41, 0x43, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x1a, 0x0d, 0xea, + 0xaa, 0x19, 0x09, 0x12, 0x07, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x12, 0x1e, 0x0a, 0x08, + 0x4d, 0x41, 0x43, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x10, 0x01, 0x1a, 0x10, 0xea, 0xaa, 0x19, 0x0c, + 0x12, 0x03, 0x31, 0x2e, 0x30, 0x12, 0x05, 0x31, 0x2e, 0x30, 0x2e, 0x30, 0x12, 0x1b, 0x0a, 0x0a, + 0x4d, 0x41, 0x43, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x31, 0x10, 0x02, 0x1a, 0x0b, 0xea, 0xaa, + 0x19, 0x07, 0x12, 0x05, 0x31, 0x2e, 0x30, 0x2e, 0x31, 0x12, 0x1b, 0x0a, 0x0a, 0x4d, 0x41, 0x43, + 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x32, 0x10, 0x03, 0x1a, 0x0b, 0xea, 0xaa, 0x19, 0x07, 0x12, + 0x05, 0x31, 0x2e, 0x30, 0x2e, 0x32, 0x12, 0x1e, 0x0a, 0x08, 0x4d, 0x41, 0x43, 0x5f, 0x56, 0x31, + 0x5f, 0x31, 0x10, 0x04, 0x1a, 0x10, 0xea, 0xaa, 0x19, 0x0c, 0x12, 0x03, 0x31, 0x2e, 0x31, 0x12, + 0x05, 0x31, 0x2e, 0x31, 0x2e, 0x30, 0x12, 0x1b, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x5f, 0x56, 0x31, + 0x5f, 0x30, 0x5f, 0x33, 0x10, 0x05, 0x1a, 0x0b, 0xea, 0xaa, 0x19, 0x07, 0x12, 0x05, 0x31, 0x2e, + 0x30, 0x2e, 0x33, 0x12, 0x1b, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, + 0x34, 0x10, 0x06, 0x1a, 0x0b, 0xea, 0xaa, 0x19, 0x07, 0x12, 0x05, 0x31, 0x2e, 0x30, 0x2e, 0x34, + 0x1a, 0x57, 0xea, 0xaa, 0x19, 0x07, 0x18, 0x01, 0x2a, 0x03, 0x4d, 0x41, 0x43, 0xf2, 0xaa, 0x19, + 0x48, 0x0a, 0x46, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x74, 0x6e, + 0x70, 0x62, 0x2e, 0x4d, 0x41, 0x43, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0xcb, 0x05, 0x0a, 0x0a, 0x50, 0x48, + 0x59, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0b, 0x50, 0x48, 0x59, 0x5f, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x1a, 0x0d, 0xea, 0xaa, 0x19, 0x09, 0x12, + 0x07, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x12, 0x24, 0x0a, 0x08, 0x50, 0x48, 0x59, 0x5f, + 0x56, 0x31, 0x5f, 0x30, 0x10, 0x01, 0x1a, 0x16, 0xea, 0xaa, 0x19, 0x12, 0x12, 0x03, 0x31, 0x2e, + 0x30, 0x12, 0x05, 0x31, 0x2e, 0x30, 0x2e, 0x30, 0x12, 0x04, 0x56, 0x31, 0x5f, 0x30, 0x12, 0x0e, + 0x0a, 0x0a, 0x54, 0x53, 0x30, 0x30, 0x31, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x10, 0x01, 0x12, 0x23, + 0x0a, 0x0a, 0x50, 0x48, 0x59, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x31, 0x10, 0x02, 0x1a, 0x13, + 0xea, 0xaa, 0x19, 0x0f, 0x12, 0x05, 0x31, 0x2e, 0x30, 0x2e, 0x31, 0x12, 0x06, 0x56, 0x31, 0x5f, + 0x30, 0x5f, 0x31, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x53, 0x30, 0x30, 0x31, 0x5f, 0x56, 0x31, 0x5f, + 0x30, 0x5f, 0x31, 0x10, 0x02, 0x12, 0x40, 0x0a, 0x10, 0x50, 0x48, 0x59, 0x5f, 0x56, 0x31, 0x5f, + 0x30, 0x5f, 0x32, 0x5f, 0x52, 0x45, 0x56, 0x5f, 0x41, 0x10, 0x03, 0x1a, 0x2a, 0xea, 0xaa, 0x19, + 0x26, 0x12, 0x05, 0x31, 0x2e, 0x30, 0x2e, 0x32, 0x12, 0x07, 0x31, 0x2e, 0x30, 0x2e, 0x32, 0x2d, + 0x61, 0x12, 0x06, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x32, 0x12, 0x0c, 0x56, 0x31, 0x5f, 0x30, 0x5f, + 0x32, 0x5f, 0x52, 0x45, 0x56, 0x5f, 0x41, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x50, 0x30, 0x30, 0x31, + 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x32, 0x10, 0x03, 0x12, 0x31, 0x0a, 0x10, 0x50, 0x48, 0x59, + 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x32, 0x5f, 0x52, 0x45, 0x56, 0x5f, 0x42, 0x10, 0x04, 0x1a, + 0x1b, 0xea, 0xaa, 0x19, 0x17, 0x12, 0x07, 0x31, 0x2e, 0x30, 0x2e, 0x32, 0x2d, 0x62, 0x12, 0x0c, + 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x32, 0x5f, 0x52, 0x45, 0x56, 0x5f, 0x42, 0x12, 0x16, 0x0a, 0x12, + 0x52, 0x50, 0x30, 0x30, 0x31, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x32, 0x5f, 0x52, 0x45, 0x56, + 0x5f, 0x42, 0x10, 0x04, 0x12, 0x34, 0x0a, 0x0e, 0x50, 0x48, 0x59, 0x5f, 0x56, 0x31, 0x5f, 0x31, + 0x5f, 0x52, 0x45, 0x56, 0x5f, 0x41, 0x10, 0x05, 0x1a, 0x20, 0xea, 0xaa, 0x19, 0x1c, 0x12, 0x05, + 0x31, 0x2e, 0x31, 0x2d, 0x61, 0x12, 0x07, 0x31, 0x2e, 0x31, 0x2e, 0x30, 0x2d, 0x61, 0x12, 0x0a, + 0x56, 0x31, 0x5f, 0x31, 0x5f, 0x52, 0x45, 0x56, 0x5f, 0x41, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x50, + 0x30, 0x30, 0x31, 0x5f, 0x56, 0x31, 0x5f, 0x31, 0x5f, 0x52, 0x45, 0x56, 0x5f, 0x41, 0x10, 0x05, + 0x12, 0x34, 0x0a, 0x0e, 0x50, 0x48, 0x59, 0x5f, 0x56, 0x31, 0x5f, 0x31, 0x5f, 0x52, 0x45, 0x56, + 0x5f, 0x42, 0x10, 0x06, 0x1a, 0x20, 0xea, 0xaa, 0x19, 0x1c, 0x12, 0x05, 0x31, 0x2e, 0x31, 0x2d, + 0x62, 0x12, 0x07, 0x31, 0x2e, 0x31, 0x2e, 0x30, 0x2d, 0x62, 0x12, 0x0a, 0x56, 0x31, 0x5f, 0x31, + 0x5f, 0x52, 0x45, 0x56, 0x5f, 0x42, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x50, 0x30, 0x30, 0x31, 0x5f, + 0x56, 0x31, 0x5f, 0x31, 0x5f, 0x52, 0x45, 0x56, 0x5f, 0x42, 0x10, 0x06, 0x12, 0x31, 0x0a, 0x10, + 0x50, 0x48, 0x59, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x33, 0x5f, 0x52, 0x45, 0x56, 0x5f, 0x41, + 0x10, 0x07, 0x1a, 0x1b, 0xea, 0xaa, 0x19, 0x17, 0x12, 0x07, 0x31, 0x2e, 0x30, 0x2e, 0x33, 0x2d, + 0x61, 0x12, 0x0c, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x33, 0x5f, 0x52, 0x45, 0x56, 0x5f, 0x41, 0x12, + 0x16, 0x0a, 0x12, 0x52, 0x50, 0x30, 0x30, 0x31, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x33, 0x5f, + 0x52, 0x45, 0x56, 0x5f, 0x41, 0x10, 0x07, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x50, 0x30, 0x30, 0x32, + 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x30, 0x10, 0x08, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x50, 0x30, + 0x30, 0x32, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x31, 0x10, 0x09, 0x12, 0x10, 0x0a, 0x0c, 0x52, + 0x50, 0x30, 0x30, 0x32, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x32, 0x10, 0x0a, 0x12, 0x10, 0x0a, + 0x0c, 0x52, 0x50, 0x30, 0x30, 0x32, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x33, 0x10, 0x0b, 0x12, + 0x10, 0x0a, 0x0c, 0x52, 0x50, 0x30, 0x30, 0x32, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x5f, 0x34, 0x10, + 0x0c, 0x1a, 0x54, 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0xf2, 0xaa, 0x19, 0x48, 0x0a, 0x46, 0x67, + 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, + 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x74, 0x6e, 0x70, 0x62, 0x2e, 0x50, + 0x48, 0x59, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x10, 0x01, 0x2a, 0x87, 0x03, 0x0a, 0x0d, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x41, 0x54, + 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x30, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x41, + 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x31, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x44, + 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x32, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x33, 0x10, 0x03, 0x12, 0x0f, 0x0a, + 0x0b, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x34, 0x10, 0x04, 0x12, 0x0f, + 0x0a, 0x0b, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x35, 0x10, 0x05, 0x12, + 0x0f, 0x0a, 0x0b, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x36, 0x10, 0x06, + 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x37, 0x10, + 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x38, + 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, + 0x39, 0x10, 0x09, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, + 0x5f, 0x31, 0x30, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, + 0x54, 0x45, 0x5f, 0x31, 0x31, 0x10, 0x0b, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x41, 0x54, 0x41, 0x5f, + 0x52, 0x41, 0x54, 0x45, 0x5f, 0x31, 0x32, 0x10, 0x0c, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x41, 0x54, + 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x31, 0x33, 0x10, 0x0d, 0x12, 0x10, 0x0a, 0x0c, 0x44, + 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x31, 0x34, 0x10, 0x0e, 0x12, 0x10, 0x0a, + 0x0c, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x31, 0x35, 0x10, 0x0f, 0x1a, + 0x60, 0xea, 0xaa, 0x19, 0x0d, 0x10, 0x01, 0x2a, 0x09, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, + 0x54, 0x45, 0xf2, 0xaa, 0x19, 0x4b, 0x0a, 0x49, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, - 0x67, 0x2f, 0x74, 0x74, 0x6e, 0x70, 0x62, 0x2e, 0x50, 0x48, 0x59, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x10, 0x01, - 0x2a, 0x87, 0x03, 0x0a, 0x0d, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, - 0x30, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, - 0x5f, 0x31, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, - 0x45, 0x5f, 0x32, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, - 0x54, 0x45, 0x5f, 0x33, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, - 0x41, 0x54, 0x45, 0x5f, 0x34, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x41, 0x54, 0x41, 0x5f, - 0x52, 0x41, 0x54, 0x45, 0x5f, 0x35, 0x10, 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x41, 0x54, 0x41, - 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x36, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x41, 0x54, - 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x37, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x41, - 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x38, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x44, - 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x39, 0x10, 0x09, 0x12, 0x10, 0x0a, 0x0c, - 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x31, 0x30, 0x10, 0x0a, 0x12, 0x10, - 0x0a, 0x0c, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x31, 0x31, 0x10, 0x0b, - 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x31, 0x32, - 0x10, 0x0c, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, - 0x31, 0x33, 0x10, 0x0d, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, - 0x45, 0x5f, 0x31, 0x34, 0x10, 0x0e, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, - 0x41, 0x54, 0x45, 0x5f, 0x31, 0x35, 0x10, 0x0f, 0x1a, 0x60, 0xea, 0xaa, 0x19, 0x0d, 0x10, 0x01, - 0x2a, 0x09, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0xf2, 0xaa, 0x19, 0x4b, 0x0a, - 0x49, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, - 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x74, 0x6e, 0x70, 0x62, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0xba, 0x02, 0x0a, 0x0e, 0x44, - 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, - 0x12, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, - 0x54, 0x5f, 0x30, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, - 0x54, 0x45, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x5f, 0x31, 0x10, 0x01, 0x12, 0x16, 0x0a, - 0x12, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, - 0x54, 0x5f, 0x32, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, - 0x54, 0x45, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x5f, 0x33, 0x10, 0x03, 0x12, 0x16, 0x0a, - 0x12, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, - 0x54, 0x5f, 0x34, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, - 0x54, 0x45, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x5f, 0x35, 0x10, 0x05, 0x12, 0x16, 0x0a, - 0x12, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, - 0x54, 0x5f, 0x36, 0x10, 0x06, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, - 0x54, 0x45, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x5f, 0x37, 0x10, 0x07, 0x1a, 0x68, 0xea, - 0xaa, 0x19, 0x14, 0x10, 0x01, 0x2a, 0x10, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, - 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0xf2, 0xaa, 0x19, 0x4c, 0x0a, 0x4a, 0x67, 0x6f, 0x2e, - 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, - 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x74, 0x6e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x61, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x5d, 0x0a, 0x0f, 0x4a, 0x6f, 0x69, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, - 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x58, 0x54, 0x10, 0x00, 0x12, 0x12, - 0x0a, 0x0e, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, - 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x4b, 0x45, 0x59, - 0x53, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x04, 0x4a, 0x4f, 0x49, 0x4e, 0x10, 0xff, 0x01, 0x1a, 0x06, - 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0x2a, 0x3f, 0x0a, 0x11, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x43, - 0x4f, 0x4e, 0x54, 0x45, 0x58, 0x54, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45, 0x53, 0x53, - 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4b, 0x45, 0x59, 0x53, 0x10, 0x02, 0x1a, - 0x06, 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0x2a, 0x38, 0x0a, 0x0a, 0x43, 0x46, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x52, 0x45, 0x51, 0x55, 0x45, 0x4e, - 0x43, 0x49, 0x45, 0x53, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, - 0x4c, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x53, 0x10, 0x01, 0x1a, 0x06, 0xea, 0xaa, 0x19, 0x02, 0x18, - 0x01, 0x2a, 0x3d, 0x0a, 0x05, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4c, - 0x41, 0x53, 0x53, 0x5f, 0x41, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4c, 0x41, 0x53, 0x53, - 0x5f, 0x42, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x43, 0x10, - 0x02, 0x1a, 0x0d, 0xea, 0xaa, 0x19, 0x09, 0x18, 0x01, 0x2a, 0x05, 0x43, 0x4c, 0x41, 0x53, 0x53, - 0x2a, 0x78, 0x0a, 0x12, 0x54, 0x78, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x72, - 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x4f, 0x57, 0x45, 0x53, 0x54, - 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x42, - 0x45, 0x4c, 0x4f, 0x57, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0a, 0x0a, - 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x42, 0x4f, - 0x56, 0x45, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x48, - 0x49, 0x47, 0x48, 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x48, 0x49, 0x47, 0x48, 0x45, 0x53, 0x54, - 0x10, 0x06, 0x1a, 0x06, 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0x2a, 0xe4, 0x03, 0x0a, 0x14, 0x4d, - 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x49, 0x44, 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x30, - 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x49, 0x44, 0x5f, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, - 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x49, 0x44, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x43, 0x48, - 0x45, 0x43, 0x4b, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x49, 0x44, 0x5f, 0x4c, 0x49, 0x4e, - 0x4b, 0x5f, 0x41, 0x44, 0x52, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x49, 0x44, 0x5f, 0x44, - 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x43, - 0x49, 0x44, 0x5f, 0x52, 0x58, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x5f, 0x53, 0x45, 0x54, 0x55, - 0x50, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x49, 0x44, 0x5f, 0x44, 0x45, 0x56, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x55, 0x53, 0x10, 0x06, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x49, 0x44, 0x5f, 0x4e, - 0x45, 0x57, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, - 0x43, 0x49, 0x44, 0x5f, 0x52, 0x58, 0x5f, 0x54, 0x49, 0x4d, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x45, - 0x54, 0x55, 0x50, 0x10, 0x08, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x49, 0x44, 0x5f, 0x54, 0x58, 0x5f, - 0x50, 0x41, 0x52, 0x41, 0x4d, 0x5f, 0x53, 0x45, 0x54, 0x55, 0x50, 0x10, 0x09, 0x12, 0x12, 0x0a, - 0x0e, 0x43, 0x49, 0x44, 0x5f, 0x44, 0x4c, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x10, - 0x0a, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x49, 0x44, 0x5f, 0x52, 0x45, 0x4b, 0x45, 0x59, 0x10, 0x0b, - 0x12, 0x17, 0x0a, 0x13, 0x43, 0x49, 0x44, 0x5f, 0x41, 0x44, 0x52, 0x5f, 0x50, 0x41, 0x52, 0x41, - 0x4d, 0x5f, 0x53, 0x45, 0x54, 0x55, 0x50, 0x10, 0x0c, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x49, 0x44, - 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x0d, 0x12, 0x14, - 0x0a, 0x10, 0x43, 0x49, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x4a, 0x4f, - 0x49, 0x4e, 0x10, 0x0e, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x49, 0x44, 0x5f, 0x52, 0x45, 0x4a, 0x4f, - 0x49, 0x4e, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x5f, 0x53, 0x45, 0x54, 0x55, 0x50, 0x10, 0x0f, - 0x12, 0x16, 0x0a, 0x12, 0x43, 0x49, 0x44, 0x5f, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x4c, 0x4f, - 0x54, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x10, 0x12, 0x19, 0x0a, 0x15, 0x43, 0x49, 0x44, 0x5f, - 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x4c, 0x4f, 0x54, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, - 0x4c, 0x10, 0x11, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x49, 0x44, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, - 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x49, 0x4e, 0x47, 0x10, 0x12, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x49, - 0x44, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x46, 0x52, 0x45, 0x51, 0x10, 0x13, 0x12, - 0x13, 0x0a, 0x0f, 0x43, 0x49, 0x44, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4d, 0x4f, - 0x44, 0x45, 0x10, 0x20, 0x1a, 0x0b, 0xea, 0xaa, 0x19, 0x07, 0x18, 0x01, 0x2a, 0x03, 0x43, 0x49, - 0x44, 0x2a, 0xe6, 0x02, 0x0a, 0x13, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, - 0x44, 0x75, 0x74, 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x55, 0x54, - 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x31, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x44, - 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x32, 0x10, 0x01, 0x12, 0x10, 0x0a, - 0x0c, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x34, 0x10, 0x02, 0x12, - 0x10, 0x0a, 0x0c, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x38, 0x10, - 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, - 0x31, 0x36, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, - 0x4c, 0x45, 0x5f, 0x33, 0x32, 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x55, 0x54, 0x59, 0x5f, - 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x36, 0x34, 0x10, 0x06, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x55, - 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x31, 0x32, 0x38, 0x10, 0x07, 0x12, 0x12, - 0x0a, 0x0e, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x32, 0x35, 0x36, - 0x10, 0x08, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, - 0x5f, 0x35, 0x31, 0x32, 0x10, 0x09, 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, - 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x31, 0x30, 0x32, 0x34, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x44, - 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x32, 0x30, 0x34, 0x38, 0x10, 0x0b, - 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x34, - 0x30, 0x39, 0x36, 0x10, 0x0c, 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, - 0x43, 0x4c, 0x45, 0x5f, 0x38, 0x31, 0x39, 0x32, 0x10, 0x0d, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x55, - 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x31, 0x36, 0x33, 0x38, 0x34, 0x10, 0x0e, - 0x12, 0x14, 0x0a, 0x10, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x33, - 0x32, 0x37, 0x36, 0x38, 0x10, 0x0f, 0x1a, 0x12, 0xea, 0xaa, 0x19, 0x0e, 0x18, 0x01, 0x2a, 0x0a, - 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x2a, 0xc1, 0x01, 0x0a, 0x0e, 0x50, - 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x11, 0x0a, - 0x0d, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x31, 0x53, 0x10, 0x00, - 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x32, - 0x53, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x56, 0x45, 0x52, - 0x59, 0x5f, 0x34, 0x53, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x45, - 0x56, 0x45, 0x52, 0x59, 0x5f, 0x38, 0x53, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x49, 0x4e, - 0x47, 0x5f, 0x45, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x31, 0x36, 0x53, 0x10, 0x04, 0x12, 0x12, 0x0a, - 0x0e, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x33, 0x32, 0x53, 0x10, - 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x56, 0x45, 0x52, 0x59, 0x5f, - 0x36, 0x34, 0x53, 0x10, 0x06, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x56, - 0x45, 0x52, 0x59, 0x5f, 0x31, 0x32, 0x38, 0x53, 0x10, 0x07, 0x1a, 0x12, 0xea, 0xaa, 0x19, 0x0e, - 0x18, 0x01, 0x2a, 0x0a, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x56, 0x45, 0x52, 0x59, 0x2a, 0x9b, - 0x03, 0x0a, 0x13, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x78, + 0x67, 0x2f, 0x74, 0x74, 0x6e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x2a, 0xba, 0x02, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x4f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, + 0x45, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x5f, 0x30, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, + 0x5f, 0x31, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, + 0x45, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x5f, 0x32, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, + 0x5f, 0x33, 0x10, 0x03, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, + 0x45, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x5f, 0x34, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, + 0x5f, 0x35, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, + 0x45, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x5f, 0x36, 0x10, 0x06, 0x12, 0x16, 0x0a, 0x12, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, + 0x5f, 0x37, 0x10, 0x07, 0x1a, 0x68, 0xea, 0xaa, 0x19, 0x14, 0x10, 0x01, 0x2a, 0x10, 0x44, 0x41, + 0x54, 0x41, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0xf2, 0xaa, + 0x19, 0x4c, 0x0a, 0x4a, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, + 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x74, + 0x6e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x5d, + 0x0a, 0x0f, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x54, + 0x45, 0x58, 0x54, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, + 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4a, + 0x4f, 0x49, 0x4e, 0x5f, 0x4b, 0x45, 0x59, 0x53, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x04, 0x4a, 0x4f, + 0x49, 0x4e, 0x10, 0xff, 0x01, 0x1a, 0x06, 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0x2a, 0x3f, 0x0a, + 0x11, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x58, 0x54, 0x10, 0x00, 0x12, + 0x0b, 0x0a, 0x07, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, + 0x4b, 0x45, 0x59, 0x53, 0x10, 0x02, 0x1a, 0x06, 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0x2a, 0x38, + 0x0a, 0x0a, 0x43, 0x46, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, + 0x46, 0x52, 0x45, 0x51, 0x55, 0x45, 0x4e, 0x43, 0x49, 0x45, 0x53, 0x10, 0x00, 0x12, 0x11, 0x0a, + 0x0d, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x53, 0x10, 0x01, + 0x1a, 0x06, 0xea, 0xaa, 0x19, 0x02, 0x18, 0x01, 0x2a, 0x3d, 0x0a, 0x05, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x41, 0x10, 0x00, 0x12, 0x0b, + 0x0a, 0x07, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x42, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x43, + 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x43, 0x10, 0x02, 0x1a, 0x0d, 0xea, 0xaa, 0x19, 0x09, 0x18, 0x01, + 0x2a, 0x05, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x2a, 0x78, 0x0a, 0x12, 0x54, 0x78, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x0a, 0x0a, + 0x06, 0x4c, 0x4f, 0x57, 0x45, 0x53, 0x54, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, + 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x42, 0x45, 0x4c, 0x4f, 0x57, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, + 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x03, + 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x42, 0x4f, 0x56, 0x45, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, + 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, + 0x48, 0x49, 0x47, 0x48, 0x45, 0x53, 0x54, 0x10, 0x06, 0x1a, 0x06, 0xea, 0xaa, 0x19, 0x02, 0x18, + 0x01, 0x2a, 0xbc, 0x05, 0x0a, 0x14, 0x4d, 0x41, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x49, + 0x44, 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x30, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x49, 0x44, + 0x5f, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x49, 0x44, 0x5f, + 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, + 0x43, 0x49, 0x44, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x41, 0x44, 0x52, 0x10, 0x03, 0x12, 0x12, + 0x0a, 0x0e, 0x43, 0x49, 0x44, 0x5f, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, + 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x49, 0x44, 0x5f, 0x52, 0x58, 0x5f, 0x50, 0x41, 0x52, + 0x41, 0x4d, 0x5f, 0x53, 0x45, 0x54, 0x55, 0x50, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x49, + 0x44, 0x5f, 0x44, 0x45, 0x56, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x10, 0x06, 0x12, 0x13, + 0x0a, 0x0f, 0x43, 0x49, 0x44, 0x5f, 0x4e, 0x45, 0x57, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, + 0x4c, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x49, 0x44, 0x5f, 0x52, 0x58, 0x5f, 0x54, 0x49, + 0x4d, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x45, 0x54, 0x55, 0x50, 0x10, 0x08, 0x12, 0x16, 0x0a, 0x12, + 0x43, 0x49, 0x44, 0x5f, 0x54, 0x58, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x5f, 0x53, 0x45, 0x54, + 0x55, 0x50, 0x10, 0x09, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x49, 0x44, 0x5f, 0x44, 0x4c, 0x5f, 0x43, + 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x10, 0x0a, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x49, 0x44, 0x5f, + 0x52, 0x45, 0x4b, 0x45, 0x59, 0x10, 0x0b, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x49, 0x44, 0x5f, 0x41, + 0x44, 0x52, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x5f, 0x53, 0x45, 0x54, 0x55, 0x50, 0x10, 0x0c, + 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x49, 0x44, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, + 0x49, 0x4d, 0x45, 0x10, 0x0d, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x49, 0x44, 0x5f, 0x46, 0x4f, 0x52, + 0x43, 0x45, 0x5f, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x10, 0x0e, 0x12, 0x1a, 0x0a, 0x16, 0x43, + 0x49, 0x44, 0x5f, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x5f, + 0x53, 0x45, 0x54, 0x55, 0x50, 0x10, 0x0f, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x49, 0x44, 0x5f, 0x50, + 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x4c, 0x4f, 0x54, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x10, 0x12, + 0x19, 0x0a, 0x15, 0x43, 0x49, 0x44, 0x5f, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x4c, 0x4f, 0x54, + 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x10, 0x11, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x49, + 0x44, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x49, 0x4e, 0x47, 0x10, + 0x12, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x49, 0x44, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, + 0x46, 0x52, 0x45, 0x51, 0x10, 0x13, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x49, 0x44, 0x5f, 0x44, 0x45, + 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x10, 0x20, 0x12, 0x12, 0x0a, 0x0e, 0x43, + 0x49, 0x44, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x10, 0x40, 0x12, + 0x1d, 0x0a, 0x19, 0x43, 0x49, 0x44, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x45, 0x4e, 0x44, + 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x10, 0x41, 0x12, 0x19, + 0x0a, 0x15, 0x43, 0x49, 0x44, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x46, 0x49, 0x4c, 0x54, + 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x42, 0x12, 0x20, 0x0a, 0x1c, 0x43, 0x49, 0x44, + 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x50, + 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x43, 0x12, 0x1e, 0x0a, 0x1a, 0x43, + 0x49, 0x44, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x43, 0x54, 0x52, 0x4c, 0x5f, 0x55, 0x50, + 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x44, 0x12, 0x21, 0x0a, 0x1d, 0x43, + 0x49, 0x44, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, + 0x52, 0x45, 0x5f, 0x46, 0x57, 0x44, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x10, 0x45, 0x12, 0x23, + 0x0a, 0x1f, 0x43, 0x49, 0x44, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x4e, 0x4f, 0x54, 0x49, + 0x46, 0x59, 0x5f, 0x4e, 0x45, 0x57, 0x5f, 0x45, 0x4e, 0x44, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, + 0x45, 0x10, 0x46, 0x1a, 0x0b, 0xea, 0xaa, 0x19, 0x07, 0x18, 0x01, 0x2a, 0x03, 0x43, 0x49, 0x44, + 0x2a, 0xb2, 0x02, 0x0a, 0x13, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x41, 0x44, 0x50, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x4c, 0x41, + 0x59, 0x5f, 0x43, 0x41, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x49, 0x43, 0x49, 0x54, + 0x59, 0x5f, 0x31, 0x5f, 0x53, 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x10, 0x00, 0x12, 0x2a, 0x0a, 0x26, + 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x43, 0x41, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, + 0x49, 0x43, 0x49, 0x54, 0x59, 0x5f, 0x35, 0x30, 0x30, 0x5f, 0x4d, 0x49, 0x4c, 0x4c, 0x49, 0x53, + 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x53, 0x10, 0x01, 0x12, 0x2a, 0x0a, 0x26, 0x52, 0x45, 0x4c, 0x41, + 0x59, 0x5f, 0x43, 0x41, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x49, 0x43, 0x49, 0x54, + 0x59, 0x5f, 0x32, 0x35, 0x30, 0x5f, 0x4d, 0x49, 0x4c, 0x4c, 0x49, 0x53, 0x45, 0x43, 0x4f, 0x4e, + 0x44, 0x53, 0x10, 0x02, 0x12, 0x2a, 0x0a, 0x26, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x43, 0x41, + 0x44, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x49, 0x43, 0x49, 0x54, 0x59, 0x5f, 0x31, 0x30, + 0x30, 0x5f, 0x4d, 0x49, 0x4c, 0x4c, 0x49, 0x53, 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x53, 0x10, 0x03, + 0x12, 0x29, 0x0a, 0x25, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x43, 0x41, 0x44, 0x5f, 0x50, 0x45, + 0x52, 0x49, 0x4f, 0x44, 0x49, 0x43, 0x49, 0x54, 0x59, 0x5f, 0x35, 0x30, 0x5f, 0x4d, 0x49, 0x4c, + 0x4c, 0x49, 0x53, 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x53, 0x10, 0x04, 0x12, 0x29, 0x0a, 0x25, 0x52, + 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x43, 0x41, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x49, + 0x43, 0x49, 0x54, 0x59, 0x5f, 0x32, 0x30, 0x5f, 0x4d, 0x49, 0x4c, 0x4c, 0x49, 0x53, 0x45, 0x43, + 0x4f, 0x4e, 0x44, 0x53, 0x10, 0x05, 0x1a, 0x1d, 0xea, 0xaa, 0x19, 0x19, 0x18, 0x01, 0x2a, 0x15, + 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x43, 0x41, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, + 0x49, 0x43, 0x49, 0x54, 0x59, 0x2a, 0x94, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x53, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x43, 0x68, 0x41, 0x63, 0x6b, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x53, 0x45, 0x43, 0x4f, 0x4e, 0x44, + 0x5f, 0x43, 0x48, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x5f, 0x30, + 0x10, 0x00, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x53, 0x45, 0x43, 0x4f, + 0x4e, 0x44, 0x5f, 0x43, 0x48, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, + 0x5f, 0x32, 0x30, 0x30, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, + 0x53, 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x5f, 0x43, 0x48, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4f, 0x46, + 0x46, 0x53, 0x45, 0x54, 0x5f, 0x34, 0x30, 0x30, 0x10, 0x02, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, + 0x4c, 0x41, 0x59, 0x5f, 0x53, 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x5f, 0x43, 0x48, 0x5f, 0x41, 0x43, + 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x5f, 0x38, 0x30, 0x30, 0x10, 0x03, 0x12, 0x23, + 0x0a, 0x1f, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x53, 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x5f, 0x43, + 0x48, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x5f, 0x31, 0x36, 0x30, + 0x30, 0x10, 0x04, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x53, 0x45, 0x43, + 0x4f, 0x4e, 0x44, 0x5f, 0x43, 0x48, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, + 0x54, 0x5f, 0x33, 0x32, 0x30, 0x30, 0x10, 0x05, 0x1a, 0x22, 0xea, 0xaa, 0x19, 0x1e, 0x18, 0x01, + 0x2a, 0x1a, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x53, 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x5f, 0x43, + 0x48, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x2a, 0xb4, 0x01, 0x0a, + 0x14, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x4c, + 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x49, 0x5a, 0x45, + 0x5f, 0x31, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x4c, 0x49, + 0x4d, 0x49, 0x54, 0x5f, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x5f, + 0x32, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x4c, 0x49, 0x4d, + 0x49, 0x54, 0x5f, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x5f, 0x34, + 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x4c, 0x49, 0x4d, 0x49, + 0x54, 0x5f, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x5f, 0x31, 0x32, + 0x10, 0x03, 0x1a, 0x1f, 0xea, 0xaa, 0x19, 0x1b, 0x18, 0x01, 0x2a, 0x17, 0x52, 0x45, 0x4c, 0x41, + 0x59, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, + 0x49, 0x5a, 0x45, 0x2a, 0xbc, 0x01, 0x0a, 0x15, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x53, 0x6d, 0x61, + 0x72, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x1e, 0x0a, + 0x1a, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x53, 0x4d, 0x41, 0x52, 0x54, 0x5f, 0x45, 0x4e, 0x41, + 0x42, 0x4c, 0x45, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x38, 0x10, 0x00, 0x12, 0x1f, 0x0a, + 0x1b, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x53, 0x4d, 0x41, 0x52, 0x54, 0x5f, 0x45, 0x4e, 0x41, + 0x42, 0x4c, 0x45, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x31, 0x36, 0x10, 0x01, 0x12, 0x1f, + 0x0a, 0x1b, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x53, 0x4d, 0x41, 0x52, 0x54, 0x5f, 0x45, 0x4e, + 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x33, 0x32, 0x10, 0x02, 0x12, + 0x1f, 0x0a, 0x1b, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x53, 0x4d, 0x41, 0x52, 0x54, 0x5f, 0x45, + 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x36, 0x34, 0x10, 0x03, + 0x1a, 0x20, 0xea, 0xaa, 0x19, 0x1c, 0x18, 0x01, 0x2a, 0x18, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, + 0x53, 0x4d, 0x41, 0x52, 0x54, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4c, 0x45, 0x56, + 0x45, 0x4c, 0x2a, 0x6c, 0x0a, 0x0f, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x57, 0x4f, 0x52, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x57, + 0x4f, 0x52, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, + 0x4c, 0x54, 0x10, 0x00, 0x12, 0x1f, 0x0a, 0x1b, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x57, 0x4f, + 0x52, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x43, 0x4f, 0x4e, 0x44, + 0x41, 0x52, 0x59, 0x10, 0x01, 0x1a, 0x19, 0xea, 0xaa, 0x19, 0x15, 0x18, 0x01, 0x2a, 0x11, 0x52, + 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x57, 0x4f, 0x52, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, + 0x2a, 0xdb, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x65, 0x74, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x1e, 0x52, + 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x52, 0x45, 0x53, 0x45, 0x54, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, + 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x00, 0x12, + 0x29, 0x0a, 0x25, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x52, 0x45, 0x53, 0x45, 0x54, 0x5f, 0x4c, + 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x4c, + 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x52, 0x45, + 0x4c, 0x41, 0x59, 0x5f, 0x52, 0x45, 0x53, 0x45, 0x54, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, + 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x56, 0x41, 0x4c, 0x55, + 0x45, 0x10, 0x02, 0x12, 0x26, 0x0a, 0x22, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x52, 0x45, 0x53, + 0x45, 0x54, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, + 0x5f, 0x4e, 0x4f, 0x5f, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x03, 0x1a, 0x21, 0xea, 0xaa, 0x19, + 0x1d, 0x18, 0x01, 0x2a, 0x19, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x52, 0x45, 0x53, 0x45, 0x54, + 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x2a, 0xaf, + 0x01, 0x0a, 0x19, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x74, 0x72, 0x6c, 0x55, 0x70, 0x6c, 0x69, + 0x6e, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x2a, + 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x43, 0x54, 0x52, 0x4c, 0x5f, 0x55, 0x50, 0x4c, 0x49, 0x4e, + 0x4b, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, + 0x41, 0x44, 0x5f, 0x57, 0x5f, 0x46, 0x5f, 0x43, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x3b, 0x0a, 0x37, + 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x43, 0x54, 0x52, 0x4c, 0x5f, 0x55, 0x50, 0x4c, 0x49, 0x4e, + 0x4b, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, + 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x52, 0x55, 0x53, 0x54, 0x45, 0x44, 0x5f, 0x45, 0x4e, 0x44, + 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x10, 0x01, 0x1a, 0x25, 0xea, 0xaa, 0x19, 0x21, 0x18, + 0x01, 0x2a, 0x1d, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x43, 0x54, 0x52, 0x4c, 0x5f, 0x55, 0x50, + 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, + 0x2a, 0xe6, 0x02, 0x0a, 0x13, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x44, + 0x75, 0x74, 0x79, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x55, 0x54, 0x59, + 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x31, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x55, + 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x32, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, + 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x34, 0x10, 0x02, 0x12, 0x10, + 0x0a, 0x0c, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x38, 0x10, 0x03, + 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x31, + 0x36, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, + 0x45, 0x5f, 0x33, 0x32, 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, + 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x36, 0x34, 0x10, 0x06, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x55, 0x54, + 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x31, 0x32, 0x38, 0x10, 0x07, 0x12, 0x12, 0x0a, + 0x0e, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x32, 0x35, 0x36, 0x10, + 0x08, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, + 0x35, 0x31, 0x32, 0x10, 0x09, 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, + 0x43, 0x4c, 0x45, 0x5f, 0x31, 0x30, 0x32, 0x34, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x55, + 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x32, 0x30, 0x34, 0x38, 0x10, 0x0b, 0x12, + 0x13, 0x0a, 0x0f, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x34, 0x30, + 0x39, 0x36, 0x10, 0x0c, 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, + 0x4c, 0x45, 0x5f, 0x38, 0x31, 0x39, 0x32, 0x10, 0x0d, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x55, 0x54, + 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x31, 0x36, 0x33, 0x38, 0x34, 0x10, 0x0e, 0x12, + 0x14, 0x0a, 0x10, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x33, 0x32, + 0x37, 0x36, 0x38, 0x10, 0x0f, 0x1a, 0x12, 0xea, 0xaa, 0x19, 0x0e, 0x18, 0x01, 0x2a, 0x0a, 0x44, + 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x2a, 0xc1, 0x01, 0x0a, 0x0e, 0x50, 0x69, + 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x11, 0x0a, 0x0d, + 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x31, 0x53, 0x10, 0x00, 0x12, + 0x11, 0x0a, 0x0d, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x32, 0x53, + 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x56, 0x45, 0x52, 0x59, + 0x5f, 0x34, 0x53, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x56, + 0x45, 0x52, 0x59, 0x5f, 0x38, 0x53, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x49, 0x4e, 0x47, + 0x5f, 0x45, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x31, 0x36, 0x53, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, + 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x33, 0x32, 0x53, 0x10, 0x05, + 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x36, + 0x34, 0x53, 0x10, 0x06, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x56, 0x45, + 0x52, 0x59, 0x5f, 0x31, 0x32, 0x38, 0x53, 0x10, 0x07, 0x1a, 0x12, 0xea, 0xaa, 0x19, 0x0e, 0x18, + 0x01, 0x2a, 0x0a, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x56, 0x45, 0x52, 0x59, 0x2a, 0x9b, 0x03, + 0x0a, 0x13, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x78, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, + 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x31, 0x36, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, + 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x33, 0x32, 0x10, 0x01, 0x12, + 0x13, 0x0a, 0x0f, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, + 0x36, 0x34, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, + 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x31, 0x32, 0x38, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x45, + 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x04, + 0x12, 0x14, 0x0a, 0x10, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, + 0x5f, 0x35, 0x31, 0x32, 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, + 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x31, 0x30, 0x32, 0x34, 0x10, 0x06, 0x12, 0x15, 0x0a, + 0x11, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x32, 0x30, + 0x34, 0x38, 0x10, 0x07, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, + 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x34, 0x30, 0x39, 0x36, 0x10, 0x08, 0x12, 0x15, 0x0a, 0x11, 0x52, + 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x38, 0x31, 0x39, 0x32, + 0x10, 0x09, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, + 0x4e, 0x54, 0x5f, 0x31, 0x36, 0x33, 0x38, 0x34, 0x10, 0x0a, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, + 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x33, 0x32, 0x37, 0x36, 0x38, + 0x10, 0x0b, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, + 0x4e, 0x54, 0x5f, 0x36, 0x35, 0x35, 0x33, 0x36, 0x10, 0x0c, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x45, + 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x31, 0x33, 0x31, 0x30, 0x37, + 0x32, 0x10, 0x0d, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, + 0x55, 0x4e, 0x54, 0x5f, 0x32, 0x36, 0x32, 0x31, 0x34, 0x34, 0x10, 0x0e, 0x12, 0x17, 0x0a, 0x13, + 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x35, 0x32, 0x34, + 0x32, 0x38, 0x38, 0x10, 0x0f, 0x1a, 0x14, 0xea, 0xaa, 0x19, 0x10, 0x18, 0x01, 0x2a, 0x0c, 0x52, + 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x2a, 0xdf, 0x02, 0x0a, 0x12, + 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, + 0x45, 0x5f, 0x30, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, + 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x31, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x4a, 0x4f, + 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x32, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x52, + 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x33, 0x10, 0x03, 0x12, 0x11, + 0x0a, 0x0d, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x34, 0x10, + 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, + 0x5f, 0x35, 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, + 0x49, 0x4d, 0x45, 0x5f, 0x36, 0x10, 0x06, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x4a, 0x4f, 0x49, + 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x37, 0x10, 0x07, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, + 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x38, 0x10, 0x08, 0x12, 0x11, 0x0a, + 0x0d, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x39, 0x10, 0x09, + 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, + 0x31, 0x30, 0x10, 0x0a, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, + 0x49, 0x4d, 0x45, 0x5f, 0x31, 0x31, 0x10, 0x0b, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x4a, 0x4f, + 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x31, 0x32, 0x10, 0x0c, 0x12, 0x12, 0x0a, 0x0e, + 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x31, 0x33, 0x10, 0x0d, + 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, + 0x31, 0x34, 0x10, 0x0e, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, + 0x49, 0x4d, 0x45, 0x5f, 0x31, 0x35, 0x10, 0x0f, 0x1a, 0x13, 0xea, 0xaa, 0x19, 0x0f, 0x18, 0x01, + 0x2a, 0x0b, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x2a, 0xd5, 0x01, + 0x0a, 0x14, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, - 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x31, 0x36, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x52, - 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x33, 0x32, 0x10, 0x01, - 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, - 0x5f, 0x36, 0x34, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, - 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x31, 0x32, 0x38, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x52, - 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x32, 0x35, 0x36, 0x10, - 0x04, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, - 0x54, 0x5f, 0x35, 0x31, 0x32, 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x4a, 0x4f, 0x49, - 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x31, 0x30, 0x32, 0x34, 0x10, 0x06, 0x12, 0x15, - 0x0a, 0x11, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x32, - 0x30, 0x34, 0x38, 0x10, 0x07, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, - 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x34, 0x30, 0x39, 0x36, 0x10, 0x08, 0x12, 0x15, 0x0a, 0x11, - 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x38, 0x31, 0x39, - 0x32, 0x10, 0x09, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, - 0x55, 0x4e, 0x54, 0x5f, 0x31, 0x36, 0x33, 0x38, 0x34, 0x10, 0x0a, 0x12, 0x16, 0x0a, 0x12, 0x52, - 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x33, 0x32, 0x37, 0x36, - 0x38, 0x10, 0x0b, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, - 0x55, 0x4e, 0x54, 0x5f, 0x36, 0x35, 0x35, 0x33, 0x36, 0x10, 0x0c, 0x12, 0x17, 0x0a, 0x13, 0x52, - 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x31, 0x33, 0x31, 0x30, - 0x37, 0x32, 0x10, 0x0d, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, - 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x32, 0x36, 0x32, 0x31, 0x34, 0x34, 0x10, 0x0e, 0x12, 0x17, 0x0a, - 0x13, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x35, 0x32, - 0x34, 0x32, 0x38, 0x38, 0x10, 0x0f, 0x1a, 0x14, 0xea, 0xaa, 0x19, 0x10, 0x18, 0x01, 0x2a, 0x0c, - 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x2a, 0xdf, 0x02, 0x0a, - 0x12, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, - 0x4d, 0x45, 0x5f, 0x30, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, - 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x31, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x4a, - 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x32, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, - 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x33, 0x10, 0x03, 0x12, - 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x34, - 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, - 0x45, 0x5f, 0x35, 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, - 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x36, 0x10, 0x06, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x4a, 0x4f, - 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x37, 0x10, 0x07, 0x12, 0x11, 0x0a, 0x0d, 0x52, - 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x38, 0x10, 0x08, 0x12, 0x11, - 0x0a, 0x0d, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x39, 0x10, - 0x09, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, - 0x5f, 0x31, 0x30, 0x10, 0x0a, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, - 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x31, 0x31, 0x10, 0x0b, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x4a, - 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x31, 0x32, 0x10, 0x0c, 0x12, 0x12, 0x0a, - 0x0e, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x31, 0x33, 0x10, - 0x0d, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, - 0x5f, 0x31, 0x34, 0x10, 0x0e, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, - 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x31, 0x35, 0x10, 0x0f, 0x1a, 0x13, 0xea, 0xaa, 0x19, 0x0f, 0x18, - 0x01, 0x2a, 0x0b, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x2a, 0xd5, - 0x01, 0x0a, 0x14, 0x52, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x45, - 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, 0x4a, 0x4f, 0x49, - 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x30, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, - 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x31, 0x10, - 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x49, - 0x4f, 0x44, 0x5f, 0x32, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, - 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x33, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x52, - 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x34, 0x10, 0x04, + 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x30, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x52, + 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x31, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, - 0x44, 0x5f, 0x35, 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, - 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x36, 0x10, 0x06, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, - 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x37, 0x10, 0x07, 0x1a, - 0x15, 0xea, 0xaa, 0x19, 0x11, 0x18, 0x01, 0x2a, 0x0d, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, - 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x2a, 0xe0, 0x02, 0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x45, 0x49, 0x52, 0x50, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, - 0x45, 0x49, 0x52, 0x50, 0x5f, 0x38, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, - 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, 0x31, 0x30, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, - 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, 0x31, 0x32, 0x10, 0x02, - 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, - 0x31, 0x33, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, - 0x49, 0x52, 0x50, 0x5f, 0x31, 0x34, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, - 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, 0x31, 0x36, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, - 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, 0x31, 0x38, 0x10, 0x06, - 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, - 0x32, 0x30, 0x10, 0x07, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, - 0x49, 0x52, 0x50, 0x5f, 0x32, 0x31, 0x10, 0x08, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, - 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, 0x32, 0x34, 0x10, 0x09, 0x12, 0x12, 0x0a, 0x0e, - 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, 0x32, 0x36, 0x10, 0x0a, - 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, - 0x32, 0x37, 0x10, 0x0b, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, - 0x49, 0x52, 0x50, 0x5f, 0x32, 0x39, 0x10, 0x0c, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, - 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, 0x33, 0x30, 0x10, 0x0d, 0x12, 0x12, 0x0a, 0x0e, - 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, 0x33, 0x33, 0x10, 0x0e, - 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, - 0x33, 0x36, 0x10, 0x0f, 0x1a, 0x13, 0xea, 0xaa, 0x19, 0x0f, 0x18, 0x01, 0x2a, 0x0b, 0x44, 0x45, - 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x2a, 0x99, 0x03, 0x0a, 0x13, 0x41, 0x44, - 0x52, 0x41, 0x63, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4c, 0x49, 0x4d, - 0x49, 0x54, 0x5f, 0x31, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, - 0x4b, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x32, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x41, - 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x34, 0x10, 0x02, + 0x44, 0x5f, 0x32, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, + 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x33, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, + 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x34, 0x10, 0x04, 0x12, + 0x13, 0x0a, 0x0f, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, + 0x5f, 0x35, 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x50, + 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x36, 0x10, 0x06, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, 0x4a, + 0x4f, 0x49, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x37, 0x10, 0x07, 0x1a, 0x15, + 0xea, 0xaa, 0x19, 0x11, 0x18, 0x01, 0x2a, 0x0d, 0x52, 0x45, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x50, + 0x45, 0x52, 0x49, 0x4f, 0x44, 0x2a, 0xe0, 0x02, 0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x45, 0x49, 0x52, 0x50, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, + 0x49, 0x52, 0x50, 0x5f, 0x38, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, 0x43, + 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, 0x31, 0x30, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x44, + 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, 0x31, 0x32, 0x10, 0x02, 0x12, + 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, 0x31, + 0x33, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x49, + 0x52, 0x50, 0x5f, 0x31, 0x34, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, 0x43, + 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, 0x31, 0x36, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x44, + 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, 0x31, 0x38, 0x10, 0x06, 0x12, + 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, 0x32, + 0x30, 0x10, 0x07, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x49, + 0x52, 0x50, 0x5f, 0x32, 0x31, 0x10, 0x08, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, 0x43, + 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, 0x32, 0x34, 0x10, 0x09, 0x12, 0x12, 0x0a, 0x0e, 0x44, + 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, 0x32, 0x36, 0x10, 0x0a, 0x12, + 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, 0x32, + 0x37, 0x10, 0x0b, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x49, + 0x52, 0x50, 0x5f, 0x32, 0x39, 0x10, 0x0c, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, 0x43, + 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, 0x33, 0x30, 0x10, 0x0d, 0x12, 0x12, 0x0a, 0x0e, 0x44, + 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, 0x33, 0x33, 0x10, 0x0e, 0x12, + 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x5f, 0x33, + 0x36, 0x10, 0x0f, 0x1a, 0x13, 0xea, 0xaa, 0x19, 0x0f, 0x18, 0x01, 0x2a, 0x0b, 0x44, 0x45, 0x56, + 0x49, 0x43, 0x45, 0x5f, 0x45, 0x49, 0x52, 0x50, 0x2a, 0x99, 0x03, 0x0a, 0x13, 0x41, 0x44, 0x52, + 0x41, 0x63, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4c, 0x49, 0x4d, 0x49, - 0x54, 0x5f, 0x38, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, - 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x31, 0x36, 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x41, - 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x33, 0x32, 0x10, - 0x05, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4c, 0x49, 0x4d, - 0x49, 0x54, 0x5f, 0x36, 0x34, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x44, 0x52, 0x5f, 0x41, - 0x43, 0x4b, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x31, 0x32, 0x38, 0x10, 0x07, 0x12, 0x15, - 0x0a, 0x11, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, - 0x32, 0x35, 0x36, 0x10, 0x08, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, - 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x35, 0x31, 0x32, 0x10, 0x09, 0x12, 0x16, 0x0a, 0x12, - 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x31, 0x30, - 0x32, 0x34, 0x10, 0x0a, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, - 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x32, 0x30, 0x34, 0x38, 0x10, 0x0b, 0x12, 0x16, 0x0a, 0x12, - 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x34, 0x30, - 0x39, 0x36, 0x10, 0x0c, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, - 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x38, 0x31, 0x39, 0x32, 0x10, 0x0d, 0x12, 0x17, 0x0a, 0x13, - 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x31, 0x36, - 0x33, 0x38, 0x34, 0x10, 0x0e, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, - 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x33, 0x32, 0x37, 0x36, 0x38, 0x10, 0x0f, 0x1a, 0x15, - 0xea, 0xaa, 0x19, 0x11, 0x18, 0x01, 0x2a, 0x0d, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, - 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x2a, 0x99, 0x03, 0x0a, 0x13, 0x41, 0x44, 0x52, 0x41, 0x63, 0x6b, - 0x44, 0x65, 0x6c, 0x61, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x13, 0x0a, - 0x0f, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x31, - 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, - 0x4c, 0x41, 0x59, 0x5f, 0x32, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x52, 0x5f, 0x41, - 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x34, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, - 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x38, 0x10, - 0x03, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, - 0x41, 0x59, 0x5f, 0x31, 0x36, 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x44, 0x52, 0x5f, 0x41, - 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x33, 0x32, 0x10, 0x05, 0x12, 0x14, 0x0a, - 0x10, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x36, - 0x34, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, - 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x31, 0x32, 0x38, 0x10, 0x07, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x44, - 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x32, 0x35, 0x36, 0x10, - 0x08, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, - 0x41, 0x59, 0x5f, 0x35, 0x31, 0x32, 0x10, 0x09, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x44, 0x52, 0x5f, - 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x31, 0x30, 0x32, 0x34, 0x10, 0x0a, - 0x12, 0x16, 0x0a, 0x12, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, - 0x59, 0x5f, 0x32, 0x30, 0x34, 0x38, 0x10, 0x0b, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x44, 0x52, 0x5f, - 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x34, 0x30, 0x39, 0x36, 0x10, 0x0c, - 0x12, 0x16, 0x0a, 0x12, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, - 0x59, 0x5f, 0x38, 0x31, 0x39, 0x32, 0x10, 0x0d, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x44, 0x52, 0x5f, - 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x31, 0x36, 0x33, 0x38, 0x34, 0x10, - 0x0e, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, - 0x41, 0x59, 0x5f, 0x33, 0x32, 0x37, 0x36, 0x38, 0x10, 0x0f, 0x1a, 0x15, 0xea, 0xaa, 0x19, 0x11, - 0x18, 0x01, 0x2a, 0x0d, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, - 0x59, 0x2a, 0xea, 0x02, 0x0a, 0x07, 0x52, 0x78, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x0e, 0x0a, - 0x0a, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x30, 0x10, 0x00, 0x12, 0x0e, 0x0a, - 0x0a, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x31, 0x10, 0x01, 0x12, 0x0e, 0x0a, - 0x0a, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x32, 0x10, 0x02, 0x12, 0x0e, 0x0a, - 0x0a, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x33, 0x10, 0x03, 0x12, 0x0e, 0x0a, - 0x0a, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x34, 0x10, 0x04, 0x12, 0x0e, 0x0a, - 0x0a, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x35, 0x10, 0x05, 0x12, 0x0e, 0x0a, - 0x0a, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x36, 0x10, 0x06, 0x12, 0x0e, 0x0a, - 0x0a, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x37, 0x10, 0x07, 0x12, 0x0e, 0x0a, - 0x0a, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x38, 0x10, 0x08, 0x12, 0x0e, 0x0a, - 0x0a, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x39, 0x10, 0x09, 0x12, 0x0f, 0x0a, - 0x0b, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x31, 0x30, 0x10, 0x0a, 0x12, 0x0f, - 0x0a, 0x0b, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x31, 0x31, 0x10, 0x0b, 0x12, - 0x0f, 0x0a, 0x0b, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x31, 0x32, 0x10, 0x0c, - 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x31, 0x33, 0x10, - 0x0d, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x31, 0x34, - 0x10, 0x0e, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x31, - 0x35, 0x10, 0x0f, 0x1a, 0x59, 0xea, 0xaa, 0x19, 0x0c, 0x10, 0x01, 0x2a, 0x08, 0x52, 0x58, 0x5f, - 0x44, 0x45, 0x4c, 0x41, 0x59, 0xf2, 0xaa, 0x19, 0x45, 0x0a, 0x43, 0x67, 0x6f, 0x2e, 0x74, 0x68, - 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, - 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, - 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x74, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x78, 0x44, 0x65, 0x6c, - 0x61, 0x79, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0xa8, - 0x02, 0x0a, 0x05, 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x49, 0x4e, 0x4f, - 0x52, 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x30, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x4d, 0x49, 0x4e, - 0x4f, 0x52, 0x5f, 0x31, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x49, 0x4e, 0x4f, 0x52, 0x5f, - 0x52, 0x46, 0x55, 0x5f, 0x32, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x49, 0x4e, 0x4f, 0x52, - 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x33, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x49, 0x4e, 0x4f, - 0x52, 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x34, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x49, 0x4e, - 0x4f, 0x52, 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x35, 0x10, 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x49, - 0x4e, 0x4f, 0x52, 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x36, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, - 0x49, 0x4e, 0x4f, 0x52, 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x37, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, - 0x4d, 0x49, 0x4e, 0x4f, 0x52, 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x38, 0x10, 0x08, 0x12, 0x0f, 0x0a, - 0x0b, 0x4d, 0x49, 0x4e, 0x4f, 0x52, 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x39, 0x10, 0x09, 0x12, 0x10, - 0x0a, 0x0c, 0x4d, 0x49, 0x4e, 0x4f, 0x52, 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x31, 0x30, 0x10, 0x0a, - 0x12, 0x10, 0x0a, 0x0c, 0x4d, 0x49, 0x4e, 0x4f, 0x52, 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x31, 0x31, - 0x10, 0x0b, 0x12, 0x10, 0x0a, 0x0c, 0x4d, 0x49, 0x4e, 0x4f, 0x52, 0x5f, 0x52, 0x46, 0x55, 0x5f, - 0x31, 0x32, 0x10, 0x0c, 0x12, 0x10, 0x0a, 0x0c, 0x4d, 0x49, 0x4e, 0x4f, 0x52, 0x5f, 0x52, 0x46, - 0x55, 0x5f, 0x31, 0x33, 0x10, 0x0d, 0x12, 0x10, 0x0a, 0x0c, 0x4d, 0x49, 0x4e, 0x4f, 0x52, 0x5f, - 0x52, 0x46, 0x55, 0x5f, 0x31, 0x34, 0x10, 0x0e, 0x12, 0x10, 0x0a, 0x0c, 0x4d, 0x49, 0x4e, 0x4f, - 0x52, 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x31, 0x35, 0x10, 0x0f, 0x1a, 0x0d, 0xea, 0xaa, 0x19, 0x09, - 0x18, 0x01, 0x2a, 0x05, 0x4d, 0x49, 0x4e, 0x4f, 0x52, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x6f, 0x2e, - 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, - 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x74, 0x6e, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x54, 0x5f, 0x31, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, + 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x32, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, + 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x34, 0x10, 0x02, 0x12, + 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, + 0x5f, 0x38, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, + 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x31, 0x36, 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x44, + 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x33, 0x32, 0x10, 0x05, + 0x12, 0x14, 0x0a, 0x10, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4c, 0x49, 0x4d, 0x49, + 0x54, 0x5f, 0x36, 0x34, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, + 0x4b, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x31, 0x32, 0x38, 0x10, 0x07, 0x12, 0x15, 0x0a, + 0x11, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x32, + 0x35, 0x36, 0x10, 0x08, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, + 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x35, 0x31, 0x32, 0x10, 0x09, 0x12, 0x16, 0x0a, 0x12, 0x41, + 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x31, 0x30, 0x32, + 0x34, 0x10, 0x0a, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4c, + 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x32, 0x30, 0x34, 0x38, 0x10, 0x0b, 0x12, 0x16, 0x0a, 0x12, 0x41, + 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x34, 0x30, 0x39, + 0x36, 0x10, 0x0c, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4c, + 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x38, 0x31, 0x39, 0x32, 0x10, 0x0d, 0x12, 0x17, 0x0a, 0x13, 0x41, + 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x31, 0x36, 0x33, + 0x38, 0x34, 0x10, 0x0e, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, + 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x33, 0x32, 0x37, 0x36, 0x38, 0x10, 0x0f, 0x1a, 0x15, 0xea, + 0xaa, 0x19, 0x11, 0x18, 0x01, 0x2a, 0x0d, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x4c, + 0x49, 0x4d, 0x49, 0x54, 0x2a, 0x99, 0x03, 0x0a, 0x13, 0x41, 0x44, 0x52, 0x41, 0x63, 0x6b, 0x44, + 0x65, 0x6c, 0x61, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x13, 0x0a, 0x0f, + 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x31, 0x10, + 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, + 0x41, 0x59, 0x5f, 0x32, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, + 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x34, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x41, + 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x38, 0x10, 0x03, + 0x12, 0x14, 0x0a, 0x10, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, + 0x59, 0x5f, 0x31, 0x36, 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, + 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x33, 0x32, 0x10, 0x05, 0x12, 0x14, 0x0a, 0x10, + 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x36, 0x34, + 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, + 0x4c, 0x41, 0x59, 0x5f, 0x31, 0x32, 0x38, 0x10, 0x07, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x44, 0x52, + 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x08, + 0x12, 0x15, 0x0a, 0x11, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, + 0x59, 0x5f, 0x35, 0x31, 0x32, 0x10, 0x09, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x44, 0x52, 0x5f, 0x41, + 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x31, 0x30, 0x32, 0x34, 0x10, 0x0a, 0x12, + 0x16, 0x0a, 0x12, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, + 0x5f, 0x32, 0x30, 0x34, 0x38, 0x10, 0x0b, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x44, 0x52, 0x5f, 0x41, + 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x34, 0x30, 0x39, 0x36, 0x10, 0x0c, 0x12, + 0x16, 0x0a, 0x12, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, + 0x5f, 0x38, 0x31, 0x39, 0x32, 0x10, 0x0d, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x44, 0x52, 0x5f, 0x41, + 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x31, 0x36, 0x33, 0x38, 0x34, 0x10, 0x0e, + 0x12, 0x17, 0x0a, 0x13, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, + 0x59, 0x5f, 0x33, 0x32, 0x37, 0x36, 0x38, 0x10, 0x0f, 0x1a, 0x15, 0xea, 0xaa, 0x19, 0x11, 0x18, + 0x01, 0x2a, 0x0d, 0x41, 0x44, 0x52, 0x5f, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, + 0x2a, 0xea, 0x02, 0x0a, 0x07, 0x52, 0x78, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x0e, 0x0a, 0x0a, + 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x30, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, + 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x31, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, + 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x32, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, + 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x33, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, + 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x34, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, + 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x35, 0x10, 0x05, 0x12, 0x0e, 0x0a, 0x0a, + 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x36, 0x10, 0x06, 0x12, 0x0e, 0x0a, 0x0a, + 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x37, 0x10, 0x07, 0x12, 0x0e, 0x0a, 0x0a, + 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x38, 0x10, 0x08, 0x12, 0x0e, 0x0a, 0x0a, + 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x39, 0x10, 0x09, 0x12, 0x0f, 0x0a, 0x0b, + 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x31, 0x30, 0x10, 0x0a, 0x12, 0x0f, 0x0a, + 0x0b, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x31, 0x31, 0x10, 0x0b, 0x12, 0x0f, + 0x0a, 0x0b, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x31, 0x32, 0x10, 0x0c, 0x12, + 0x0f, 0x0a, 0x0b, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x31, 0x33, 0x10, 0x0d, + 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x31, 0x34, 0x10, + 0x0e, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x31, 0x35, + 0x10, 0x0f, 0x1a, 0x59, 0xea, 0xaa, 0x19, 0x0c, 0x10, 0x01, 0x2a, 0x08, 0x52, 0x58, 0x5f, 0x44, + 0x45, 0x4c, 0x41, 0x59, 0xf2, 0xaa, 0x19, 0x45, 0x0a, 0x43, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, + 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, + 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, + 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x74, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x78, 0x44, 0x65, 0x6c, 0x61, + 0x79, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0xa8, 0x02, + 0x0a, 0x05, 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x49, 0x4e, 0x4f, 0x52, + 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x30, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x4d, 0x49, 0x4e, 0x4f, + 0x52, 0x5f, 0x31, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x49, 0x4e, 0x4f, 0x52, 0x5f, 0x52, + 0x46, 0x55, 0x5f, 0x32, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x49, 0x4e, 0x4f, 0x52, 0x5f, + 0x52, 0x46, 0x55, 0x5f, 0x33, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x49, 0x4e, 0x4f, 0x52, + 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x34, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x49, 0x4e, 0x4f, + 0x52, 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x35, 0x10, 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x49, 0x4e, + 0x4f, 0x52, 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x36, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x49, + 0x4e, 0x4f, 0x52, 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x37, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, + 0x49, 0x4e, 0x4f, 0x52, 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x38, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, + 0x4d, 0x49, 0x4e, 0x4f, 0x52, 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x39, 0x10, 0x09, 0x12, 0x10, 0x0a, + 0x0c, 0x4d, 0x49, 0x4e, 0x4f, 0x52, 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x31, 0x30, 0x10, 0x0a, 0x12, + 0x10, 0x0a, 0x0c, 0x4d, 0x49, 0x4e, 0x4f, 0x52, 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x31, 0x31, 0x10, + 0x0b, 0x12, 0x10, 0x0a, 0x0c, 0x4d, 0x49, 0x4e, 0x4f, 0x52, 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x31, + 0x32, 0x10, 0x0c, 0x12, 0x10, 0x0a, 0x0c, 0x4d, 0x49, 0x4e, 0x4f, 0x52, 0x5f, 0x52, 0x46, 0x55, + 0x5f, 0x31, 0x33, 0x10, 0x0d, 0x12, 0x10, 0x0a, 0x0c, 0x4d, 0x49, 0x4e, 0x4f, 0x52, 0x5f, 0x52, + 0x46, 0x55, 0x5f, 0x31, 0x34, 0x10, 0x0e, 0x12, 0x10, 0x0a, 0x0c, 0x4d, 0x49, 0x4e, 0x4f, 0x52, + 0x5f, 0x52, 0x46, 0x55, 0x5f, 0x31, 0x35, 0x10, 0x0f, 0x1a, 0x0d, 0xea, 0xaa, 0x19, 0x09, 0x18, + 0x01, 0x2a, 0x05, 0x4d, 0x49, 0x4e, 0x4f, 0x52, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x6f, 0x2e, 0x74, + 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, + 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x74, 0x6e, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -7377,205 +9790,269 @@ func file_ttn_lorawan_v3_lorawan_proto_rawDescGZIP() []byte { return file_ttn_lorawan_v3_lorawan_proto_rawDescData } -var file_ttn_lorawan_v3_lorawan_proto_enumTypes = make([]protoimpl.EnumInfo, 22) -var file_ttn_lorawan_v3_lorawan_proto_msgTypes = make([]protoimpl.MessageInfo, 63) +var file_ttn_lorawan_v3_lorawan_proto_enumTypes = make([]protoimpl.EnumInfo, 29) +var file_ttn_lorawan_v3_lorawan_proto_msgTypes = make([]protoimpl.MessageInfo, 85) var file_ttn_lorawan_v3_lorawan_proto_goTypes = []interface{}{ - (MType)(0), // 0: ttn.lorawan.v3.MType - (Major)(0), // 1: ttn.lorawan.v3.Major - (MACVersion)(0), // 2: ttn.lorawan.v3.MACVersion - (PHYVersion)(0), // 3: ttn.lorawan.v3.PHYVersion - (DataRateIndex)(0), // 4: ttn.lorawan.v3.DataRateIndex - (DataRateOffset)(0), // 5: ttn.lorawan.v3.DataRateOffset - (JoinRequestType)(0), // 6: ttn.lorawan.v3.JoinRequestType - (RejoinRequestType)(0), // 7: ttn.lorawan.v3.RejoinRequestType - (CFListType)(0), // 8: ttn.lorawan.v3.CFListType - (Class)(0), // 9: ttn.lorawan.v3.Class - (TxSchedulePriority)(0), // 10: ttn.lorawan.v3.TxSchedulePriority - (MACCommandIdentifier)(0), // 11: ttn.lorawan.v3.MACCommandIdentifier - (AggregatedDutyCycle)(0), // 12: ttn.lorawan.v3.AggregatedDutyCycle - (PingSlotPeriod)(0), // 13: ttn.lorawan.v3.PingSlotPeriod - (RejoinCountExponent)(0), // 14: ttn.lorawan.v3.RejoinCountExponent - (RejoinTimeExponent)(0), // 15: ttn.lorawan.v3.RejoinTimeExponent - (RejoinPeriodExponent)(0), // 16: ttn.lorawan.v3.RejoinPeriodExponent - (DeviceEIRP)(0), // 17: ttn.lorawan.v3.DeviceEIRP - (ADRAckLimitExponent)(0), // 18: ttn.lorawan.v3.ADRAckLimitExponent - (ADRAckDelayExponent)(0), // 19: ttn.lorawan.v3.ADRAckDelayExponent - (RxDelay)(0), // 20: ttn.lorawan.v3.RxDelay - (Minor)(0), // 21: ttn.lorawan.v3.Minor - (*Message)(nil), // 22: ttn.lorawan.v3.Message - (*MHDR)(nil), // 23: ttn.lorawan.v3.MHDR - (*MACPayload)(nil), // 24: ttn.lorawan.v3.MACPayload - (*FHDR)(nil), // 25: ttn.lorawan.v3.FHDR - (*FCtrl)(nil), // 26: ttn.lorawan.v3.FCtrl - (*JoinRequestPayload)(nil), // 27: ttn.lorawan.v3.JoinRequestPayload - (*RejoinRequestPayload)(nil), // 28: ttn.lorawan.v3.RejoinRequestPayload - (*JoinAcceptPayload)(nil), // 29: ttn.lorawan.v3.JoinAcceptPayload - (*DLSettings)(nil), // 30: ttn.lorawan.v3.DLSettings - (*CFList)(nil), // 31: ttn.lorawan.v3.CFList - (*LoRaDataRate)(nil), // 32: ttn.lorawan.v3.LoRaDataRate - (*FSKDataRate)(nil), // 33: ttn.lorawan.v3.FSKDataRate - (*LRFHSSDataRate)(nil), // 34: ttn.lorawan.v3.LRFHSSDataRate - (*DataRate)(nil), // 35: ttn.lorawan.v3.DataRate - (*TxSettings)(nil), // 36: ttn.lorawan.v3.TxSettings - (*GatewayAntennaIdentifiers)(nil), // 37: ttn.lorawan.v3.GatewayAntennaIdentifiers - (*ClassBCGatewayIdentifiers)(nil), // 38: ttn.lorawan.v3.ClassBCGatewayIdentifiers - (*UplinkToken)(nil), // 39: ttn.lorawan.v3.UplinkToken - (*DownlinkPath)(nil), // 40: ttn.lorawan.v3.DownlinkPath - (*TxRequest)(nil), // 41: ttn.lorawan.v3.TxRequest - (*MACCommand)(nil), // 42: ttn.lorawan.v3.MACCommand - (*MACCommands)(nil), // 43: ttn.lorawan.v3.MACCommands - (*FrequencyValue)(nil), // 44: ttn.lorawan.v3.FrequencyValue - (*ZeroableFrequencyValue)(nil), // 45: ttn.lorawan.v3.ZeroableFrequencyValue - (*DataRateOffsetValue)(nil), // 46: ttn.lorawan.v3.DataRateOffsetValue - (*DataRateIndexValue)(nil), // 47: ttn.lorawan.v3.DataRateIndexValue - (*PingSlotPeriodValue)(nil), // 48: ttn.lorawan.v3.PingSlotPeriodValue - (*AggregatedDutyCycleValue)(nil), // 49: ttn.lorawan.v3.AggregatedDutyCycleValue - (*RxDelayValue)(nil), // 50: ttn.lorawan.v3.RxDelayValue - (*ADRAckLimitExponentValue)(nil), // 51: ttn.lorawan.v3.ADRAckLimitExponentValue - (*ADRAckDelayExponentValue)(nil), // 52: ttn.lorawan.v3.ADRAckDelayExponentValue - (*DeviceEIRPValue)(nil), // 53: ttn.lorawan.v3.DeviceEIRPValue - (*TxSettings_Downlink)(nil), // 54: ttn.lorawan.v3.TxSettings.Downlink - (*MACCommand_ResetInd)(nil), // 55: ttn.lorawan.v3.MACCommand.ResetInd - (*MACCommand_ResetConf)(nil), // 56: ttn.lorawan.v3.MACCommand.ResetConf - (*MACCommand_LinkCheckAns)(nil), // 57: ttn.lorawan.v3.MACCommand.LinkCheckAns - (*MACCommand_LinkADRReq)(nil), // 58: ttn.lorawan.v3.MACCommand.LinkADRReq - (*MACCommand_LinkADRAns)(nil), // 59: ttn.lorawan.v3.MACCommand.LinkADRAns - (*MACCommand_DutyCycleReq)(nil), // 60: ttn.lorawan.v3.MACCommand.DutyCycleReq - (*MACCommand_RxParamSetupReq)(nil), // 61: ttn.lorawan.v3.MACCommand.RxParamSetupReq - (*MACCommand_RxParamSetupAns)(nil), // 62: ttn.lorawan.v3.MACCommand.RxParamSetupAns - (*MACCommand_DevStatusAns)(nil), // 63: ttn.lorawan.v3.MACCommand.DevStatusAns - (*MACCommand_NewChannelReq)(nil), // 64: ttn.lorawan.v3.MACCommand.NewChannelReq - (*MACCommand_NewChannelAns)(nil), // 65: ttn.lorawan.v3.MACCommand.NewChannelAns - (*MACCommand_DLChannelReq)(nil), // 66: ttn.lorawan.v3.MACCommand.DLChannelReq - (*MACCommand_DLChannelAns)(nil), // 67: ttn.lorawan.v3.MACCommand.DLChannelAns - (*MACCommand_RxTimingSetupReq)(nil), // 68: ttn.lorawan.v3.MACCommand.RxTimingSetupReq - (*MACCommand_TxParamSetupReq)(nil), // 69: ttn.lorawan.v3.MACCommand.TxParamSetupReq - (*MACCommand_RekeyInd)(nil), // 70: ttn.lorawan.v3.MACCommand.RekeyInd - (*MACCommand_RekeyConf)(nil), // 71: ttn.lorawan.v3.MACCommand.RekeyConf - (*MACCommand_ADRParamSetupReq)(nil), // 72: ttn.lorawan.v3.MACCommand.ADRParamSetupReq - (*MACCommand_DeviceTimeAns)(nil), // 73: ttn.lorawan.v3.MACCommand.DeviceTimeAns - (*MACCommand_ForceRejoinReq)(nil), // 74: ttn.lorawan.v3.MACCommand.ForceRejoinReq - (*MACCommand_RejoinParamSetupReq)(nil), // 75: ttn.lorawan.v3.MACCommand.RejoinParamSetupReq - (*MACCommand_RejoinParamSetupAns)(nil), // 76: ttn.lorawan.v3.MACCommand.RejoinParamSetupAns - (*MACCommand_PingSlotInfoReq)(nil), // 77: ttn.lorawan.v3.MACCommand.PingSlotInfoReq - (*MACCommand_PingSlotChannelReq)(nil), // 78: ttn.lorawan.v3.MACCommand.PingSlotChannelReq - (*MACCommand_PingSlotChannelAns)(nil), // 79: ttn.lorawan.v3.MACCommand.PingSlotChannelAns - (*MACCommand_BeaconTimingAns)(nil), // 80: ttn.lorawan.v3.MACCommand.BeaconTimingAns - (*MACCommand_BeaconFreqReq)(nil), // 81: ttn.lorawan.v3.MACCommand.BeaconFreqReq - (*MACCommand_BeaconFreqAns)(nil), // 82: ttn.lorawan.v3.MACCommand.BeaconFreqAns - (*MACCommand_DeviceModeInd)(nil), // 83: ttn.lorawan.v3.MACCommand.DeviceModeInd - (*MACCommand_DeviceModeConf)(nil), // 84: ttn.lorawan.v3.MACCommand.DeviceModeConf - (*structpb.Struct)(nil), // 85: google.protobuf.Struct - (*timestamppb.Timestamp)(nil), // 86: google.protobuf.Timestamp - (*GatewayIdentifiers)(nil), // 87: ttn.lorawan.v3.GatewayIdentifiers + (MType)(0), // 0: ttn.lorawan.v3.MType + (Major)(0), // 1: ttn.lorawan.v3.Major + (MACVersion)(0), // 2: ttn.lorawan.v3.MACVersion + (PHYVersion)(0), // 3: ttn.lorawan.v3.PHYVersion + (DataRateIndex)(0), // 4: ttn.lorawan.v3.DataRateIndex + (DataRateOffset)(0), // 5: ttn.lorawan.v3.DataRateOffset + (JoinRequestType)(0), // 6: ttn.lorawan.v3.JoinRequestType + (RejoinRequestType)(0), // 7: ttn.lorawan.v3.RejoinRequestType + (CFListType)(0), // 8: ttn.lorawan.v3.CFListType + (Class)(0), // 9: ttn.lorawan.v3.Class + (TxSchedulePriority)(0), // 10: ttn.lorawan.v3.TxSchedulePriority + (MACCommandIdentifier)(0), // 11: ttn.lorawan.v3.MACCommandIdentifier + (RelayCADPeriodicity)(0), // 12: ttn.lorawan.v3.RelayCADPeriodicity + (RelaySecondChAckOffset)(0), // 13: ttn.lorawan.v3.RelaySecondChAckOffset + (RelayLimitBucketSize)(0), // 14: ttn.lorawan.v3.RelayLimitBucketSize + (RelaySmartEnableLevel)(0), // 15: ttn.lorawan.v3.RelaySmartEnableLevel + (RelayWORChannel)(0), // 16: ttn.lorawan.v3.RelayWORChannel + (RelayResetLimitCounter)(0), // 17: ttn.lorawan.v3.RelayResetLimitCounter + (RelayCtrlUplinkListAction)(0), // 18: ttn.lorawan.v3.RelayCtrlUplinkListAction + (AggregatedDutyCycle)(0), // 19: ttn.lorawan.v3.AggregatedDutyCycle + (PingSlotPeriod)(0), // 20: ttn.lorawan.v3.PingSlotPeriod + (RejoinCountExponent)(0), // 21: ttn.lorawan.v3.RejoinCountExponent + (RejoinTimeExponent)(0), // 22: ttn.lorawan.v3.RejoinTimeExponent + (RejoinPeriodExponent)(0), // 23: ttn.lorawan.v3.RejoinPeriodExponent + (DeviceEIRP)(0), // 24: ttn.lorawan.v3.DeviceEIRP + (ADRAckLimitExponent)(0), // 25: ttn.lorawan.v3.ADRAckLimitExponent + (ADRAckDelayExponent)(0), // 26: ttn.lorawan.v3.ADRAckDelayExponent + (RxDelay)(0), // 27: ttn.lorawan.v3.RxDelay + (Minor)(0), // 28: ttn.lorawan.v3.Minor + (*Message)(nil), // 29: ttn.lorawan.v3.Message + (*MHDR)(nil), // 30: ttn.lorawan.v3.MHDR + (*MACPayload)(nil), // 31: ttn.lorawan.v3.MACPayload + (*FHDR)(nil), // 32: ttn.lorawan.v3.FHDR + (*FCtrl)(nil), // 33: ttn.lorawan.v3.FCtrl + (*JoinRequestPayload)(nil), // 34: ttn.lorawan.v3.JoinRequestPayload + (*RejoinRequestPayload)(nil), // 35: ttn.lorawan.v3.RejoinRequestPayload + (*JoinAcceptPayload)(nil), // 36: ttn.lorawan.v3.JoinAcceptPayload + (*DLSettings)(nil), // 37: ttn.lorawan.v3.DLSettings + (*CFList)(nil), // 38: ttn.lorawan.v3.CFList + (*LoRaDataRate)(nil), // 39: ttn.lorawan.v3.LoRaDataRate + (*FSKDataRate)(nil), // 40: ttn.lorawan.v3.FSKDataRate + (*LRFHSSDataRate)(nil), // 41: ttn.lorawan.v3.LRFHSSDataRate + (*DataRate)(nil), // 42: ttn.lorawan.v3.DataRate + (*TxSettings)(nil), // 43: ttn.lorawan.v3.TxSettings + (*GatewayAntennaIdentifiers)(nil), // 44: ttn.lorawan.v3.GatewayAntennaIdentifiers + (*ClassBCGatewayIdentifiers)(nil), // 45: ttn.lorawan.v3.ClassBCGatewayIdentifiers + (*UplinkToken)(nil), // 46: ttn.lorawan.v3.UplinkToken + (*DownlinkPath)(nil), // 47: ttn.lorawan.v3.DownlinkPath + (*TxRequest)(nil), // 48: ttn.lorawan.v3.TxRequest + (*RelaySecondChannel)(nil), // 49: ttn.lorawan.v3.RelaySecondChannel + (*RelayUplinkForwardLimits)(nil), // 50: ttn.lorawan.v3.RelayUplinkForwardLimits + (*RelayForwardLimits)(nil), // 51: ttn.lorawan.v3.RelayForwardLimits + (*RelayEndDeviceAlwaysMode)(nil), // 52: ttn.lorawan.v3.RelayEndDeviceAlwaysMode + (*RelayEndDeviceDynamicMode)(nil), // 53: ttn.lorawan.v3.RelayEndDeviceDynamicMode + (*RelayEndDeviceControlledMode)(nil), // 54: ttn.lorawan.v3.RelayEndDeviceControlledMode + (*MACCommand)(nil), // 55: ttn.lorawan.v3.MACCommand + (*MACCommands)(nil), // 56: ttn.lorawan.v3.MACCommands + (*FrequencyValue)(nil), // 57: ttn.lorawan.v3.FrequencyValue + (*ZeroableFrequencyValue)(nil), // 58: ttn.lorawan.v3.ZeroableFrequencyValue + (*DataRateOffsetValue)(nil), // 59: ttn.lorawan.v3.DataRateOffsetValue + (*DataRateIndexValue)(nil), // 60: ttn.lorawan.v3.DataRateIndexValue + (*PingSlotPeriodValue)(nil), // 61: ttn.lorawan.v3.PingSlotPeriodValue + (*AggregatedDutyCycleValue)(nil), // 62: ttn.lorawan.v3.AggregatedDutyCycleValue + (*RxDelayValue)(nil), // 63: ttn.lorawan.v3.RxDelayValue + (*ADRAckLimitExponentValue)(nil), // 64: ttn.lorawan.v3.ADRAckLimitExponentValue + (*ADRAckDelayExponentValue)(nil), // 65: ttn.lorawan.v3.ADRAckDelayExponentValue + (*DeviceEIRPValue)(nil), // 66: ttn.lorawan.v3.DeviceEIRPValue + (*RelayForwardUplinkReq)(nil), // 67: ttn.lorawan.v3.RelayForwardUplinkReq + (*RelayForwardDownlinkReq)(nil), // 68: ttn.lorawan.v3.RelayForwardDownlinkReq + (*RelayUplinkToken)(nil), // 69: ttn.lorawan.v3.RelayUplinkToken + (*TxSettings_Downlink)(nil), // 70: ttn.lorawan.v3.TxSettings.Downlink + (*MACCommand_ResetInd)(nil), // 71: ttn.lorawan.v3.MACCommand.ResetInd + (*MACCommand_ResetConf)(nil), // 72: ttn.lorawan.v3.MACCommand.ResetConf + (*MACCommand_LinkCheckAns)(nil), // 73: ttn.lorawan.v3.MACCommand.LinkCheckAns + (*MACCommand_LinkADRReq)(nil), // 74: ttn.lorawan.v3.MACCommand.LinkADRReq + (*MACCommand_LinkADRAns)(nil), // 75: ttn.lorawan.v3.MACCommand.LinkADRAns + (*MACCommand_DutyCycleReq)(nil), // 76: ttn.lorawan.v3.MACCommand.DutyCycleReq + (*MACCommand_RxParamSetupReq)(nil), // 77: ttn.lorawan.v3.MACCommand.RxParamSetupReq + (*MACCommand_RxParamSetupAns)(nil), // 78: ttn.lorawan.v3.MACCommand.RxParamSetupAns + (*MACCommand_DevStatusAns)(nil), // 79: ttn.lorawan.v3.MACCommand.DevStatusAns + (*MACCommand_NewChannelReq)(nil), // 80: ttn.lorawan.v3.MACCommand.NewChannelReq + (*MACCommand_NewChannelAns)(nil), // 81: ttn.lorawan.v3.MACCommand.NewChannelAns + (*MACCommand_DLChannelReq)(nil), // 82: ttn.lorawan.v3.MACCommand.DLChannelReq + (*MACCommand_DLChannelAns)(nil), // 83: ttn.lorawan.v3.MACCommand.DLChannelAns + (*MACCommand_RxTimingSetupReq)(nil), // 84: ttn.lorawan.v3.MACCommand.RxTimingSetupReq + (*MACCommand_TxParamSetupReq)(nil), // 85: ttn.lorawan.v3.MACCommand.TxParamSetupReq + (*MACCommand_RekeyInd)(nil), // 86: ttn.lorawan.v3.MACCommand.RekeyInd + (*MACCommand_RekeyConf)(nil), // 87: ttn.lorawan.v3.MACCommand.RekeyConf + (*MACCommand_ADRParamSetupReq)(nil), // 88: ttn.lorawan.v3.MACCommand.ADRParamSetupReq + (*MACCommand_DeviceTimeAns)(nil), // 89: ttn.lorawan.v3.MACCommand.DeviceTimeAns + (*MACCommand_ForceRejoinReq)(nil), // 90: ttn.lorawan.v3.MACCommand.ForceRejoinReq + (*MACCommand_RejoinParamSetupReq)(nil), // 91: ttn.lorawan.v3.MACCommand.RejoinParamSetupReq + (*MACCommand_RejoinParamSetupAns)(nil), // 92: ttn.lorawan.v3.MACCommand.RejoinParamSetupAns + (*MACCommand_PingSlotInfoReq)(nil), // 93: ttn.lorawan.v3.MACCommand.PingSlotInfoReq + (*MACCommand_PingSlotChannelReq)(nil), // 94: ttn.lorawan.v3.MACCommand.PingSlotChannelReq + (*MACCommand_PingSlotChannelAns)(nil), // 95: ttn.lorawan.v3.MACCommand.PingSlotChannelAns + (*MACCommand_BeaconTimingAns)(nil), // 96: ttn.lorawan.v3.MACCommand.BeaconTimingAns + (*MACCommand_BeaconFreqReq)(nil), // 97: ttn.lorawan.v3.MACCommand.BeaconFreqReq + (*MACCommand_BeaconFreqAns)(nil), // 98: ttn.lorawan.v3.MACCommand.BeaconFreqAns + (*MACCommand_DeviceModeInd)(nil), // 99: ttn.lorawan.v3.MACCommand.DeviceModeInd + (*MACCommand_DeviceModeConf)(nil), // 100: ttn.lorawan.v3.MACCommand.DeviceModeConf + (*MACCommand_RelayConfReq)(nil), // 101: ttn.lorawan.v3.MACCommand.RelayConfReq + (*MACCommand_RelayConfAns)(nil), // 102: ttn.lorawan.v3.MACCommand.RelayConfAns + (*MACCommand_RelayEndDeviceConfReq)(nil), // 103: ttn.lorawan.v3.MACCommand.RelayEndDeviceConfReq + (*MACCommand_RelayEndDeviceConfAns)(nil), // 104: ttn.lorawan.v3.MACCommand.RelayEndDeviceConfAns + (*MACCommand_RelayUpdateUplinkListReq)(nil), // 105: ttn.lorawan.v3.MACCommand.RelayUpdateUplinkListReq + (*MACCommand_RelayUpdateUplinkListAns)(nil), // 106: ttn.lorawan.v3.MACCommand.RelayUpdateUplinkListAns + (*MACCommand_RelayCtrlUplinkListReq)(nil), // 107: ttn.lorawan.v3.MACCommand.RelayCtrlUplinkListReq + (*MACCommand_RelayCtrlUplinkListAns)(nil), // 108: ttn.lorawan.v3.MACCommand.RelayCtrlUplinkListAns + (*MACCommand_RelayConfigureFwdLimitReq)(nil), // 109: ttn.lorawan.v3.MACCommand.RelayConfigureFwdLimitReq + (*MACCommand_RelayConfigureFwdLimitAns)(nil), // 110: ttn.lorawan.v3.MACCommand.RelayConfigureFwdLimitAns + (*MACCommand_RelayNotifyNewEndDeviceReq)(nil), // 111: ttn.lorawan.v3.MACCommand.RelayNotifyNewEndDeviceReq + (*MACCommand_RelayConfReq_Configuration)(nil), // 112: ttn.lorawan.v3.MACCommand.RelayConfReq.Configuration + (*MACCommand_RelayEndDeviceConfReq_Configuration)(nil), // 113: ttn.lorawan.v3.MACCommand.RelayEndDeviceConfReq.Configuration + (*structpb.Struct)(nil), // 114: google.protobuf.Struct + (*timestamppb.Timestamp)(nil), // 115: google.protobuf.Timestamp + (*GatewayIdentifiers)(nil), // 116: ttn.lorawan.v3.GatewayIdentifiers + (*EndDeviceIdentifiers)(nil), // 117: ttn.lorawan.v3.EndDeviceIdentifiers } var file_ttn_lorawan_v3_lorawan_proto_depIdxs = []int32{ - 23, // 0: ttn.lorawan.v3.Message.m_hdr:type_name -> ttn.lorawan.v3.MHDR - 24, // 1: ttn.lorawan.v3.Message.mac_payload:type_name -> ttn.lorawan.v3.MACPayload - 27, // 2: ttn.lorawan.v3.Message.join_request_payload:type_name -> ttn.lorawan.v3.JoinRequestPayload - 29, // 3: ttn.lorawan.v3.Message.join_accept_payload:type_name -> ttn.lorawan.v3.JoinAcceptPayload - 28, // 4: ttn.lorawan.v3.Message.rejoin_request_payload:type_name -> ttn.lorawan.v3.RejoinRequestPayload + 30, // 0: ttn.lorawan.v3.Message.m_hdr:type_name -> ttn.lorawan.v3.MHDR + 31, // 1: ttn.lorawan.v3.Message.mac_payload:type_name -> ttn.lorawan.v3.MACPayload + 34, // 2: ttn.lorawan.v3.Message.join_request_payload:type_name -> ttn.lorawan.v3.JoinRequestPayload + 36, // 3: ttn.lorawan.v3.Message.join_accept_payload:type_name -> ttn.lorawan.v3.JoinAcceptPayload + 35, // 4: ttn.lorawan.v3.Message.rejoin_request_payload:type_name -> ttn.lorawan.v3.RejoinRequestPayload 0, // 5: ttn.lorawan.v3.MHDR.m_type:type_name -> ttn.lorawan.v3.MType 1, // 6: ttn.lorawan.v3.MHDR.major:type_name -> ttn.lorawan.v3.Major - 25, // 7: ttn.lorawan.v3.MACPayload.f_hdr:type_name -> ttn.lorawan.v3.FHDR - 85, // 8: ttn.lorawan.v3.MACPayload.decoded_payload:type_name -> google.protobuf.Struct - 26, // 9: ttn.lorawan.v3.FHDR.f_ctrl:type_name -> ttn.lorawan.v3.FCtrl + 32, // 7: ttn.lorawan.v3.MACPayload.f_hdr:type_name -> ttn.lorawan.v3.FHDR + 114, // 8: ttn.lorawan.v3.MACPayload.decoded_payload:type_name -> google.protobuf.Struct + 33, // 9: ttn.lorawan.v3.FHDR.f_ctrl:type_name -> ttn.lorawan.v3.FCtrl 7, // 10: ttn.lorawan.v3.RejoinRequestPayload.rejoin_type:type_name -> ttn.lorawan.v3.RejoinRequestType - 30, // 11: ttn.lorawan.v3.JoinAcceptPayload.dl_settings:type_name -> ttn.lorawan.v3.DLSettings - 20, // 12: ttn.lorawan.v3.JoinAcceptPayload.rx_delay:type_name -> ttn.lorawan.v3.RxDelay - 31, // 13: ttn.lorawan.v3.JoinAcceptPayload.cf_list:type_name -> ttn.lorawan.v3.CFList + 37, // 11: ttn.lorawan.v3.JoinAcceptPayload.dl_settings:type_name -> ttn.lorawan.v3.DLSettings + 27, // 12: ttn.lorawan.v3.JoinAcceptPayload.rx_delay:type_name -> ttn.lorawan.v3.RxDelay + 38, // 13: ttn.lorawan.v3.JoinAcceptPayload.cf_list:type_name -> ttn.lorawan.v3.CFList 5, // 14: ttn.lorawan.v3.DLSettings.rx1_dr_offset:type_name -> ttn.lorawan.v3.DataRateOffset 4, // 15: ttn.lorawan.v3.DLSettings.rx2_dr:type_name -> ttn.lorawan.v3.DataRateIndex 8, // 16: ttn.lorawan.v3.CFList.type:type_name -> ttn.lorawan.v3.CFListType - 32, // 17: ttn.lorawan.v3.DataRate.lora:type_name -> ttn.lorawan.v3.LoRaDataRate - 33, // 18: ttn.lorawan.v3.DataRate.fsk:type_name -> ttn.lorawan.v3.FSKDataRate - 34, // 19: ttn.lorawan.v3.DataRate.lrfhss:type_name -> ttn.lorawan.v3.LRFHSSDataRate - 35, // 20: ttn.lorawan.v3.TxSettings.data_rate:type_name -> ttn.lorawan.v3.DataRate - 86, // 21: ttn.lorawan.v3.TxSettings.time:type_name -> google.protobuf.Timestamp - 54, // 22: ttn.lorawan.v3.TxSettings.downlink:type_name -> ttn.lorawan.v3.TxSettings.Downlink - 87, // 23: ttn.lorawan.v3.GatewayAntennaIdentifiers.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers - 87, // 24: ttn.lorawan.v3.ClassBCGatewayIdentifiers.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers - 37, // 25: ttn.lorawan.v3.UplinkToken.ids:type_name -> ttn.lorawan.v3.GatewayAntennaIdentifiers - 86, // 26: ttn.lorawan.v3.UplinkToken.server_time:type_name -> google.protobuf.Timestamp - 86, // 27: ttn.lorawan.v3.UplinkToken.gateway_time:type_name -> google.protobuf.Timestamp - 37, // 28: ttn.lorawan.v3.DownlinkPath.fixed:type_name -> ttn.lorawan.v3.GatewayAntennaIdentifiers + 39, // 17: ttn.lorawan.v3.DataRate.lora:type_name -> ttn.lorawan.v3.LoRaDataRate + 40, // 18: ttn.lorawan.v3.DataRate.fsk:type_name -> ttn.lorawan.v3.FSKDataRate + 41, // 19: ttn.lorawan.v3.DataRate.lrfhss:type_name -> ttn.lorawan.v3.LRFHSSDataRate + 42, // 20: ttn.lorawan.v3.TxSettings.data_rate:type_name -> ttn.lorawan.v3.DataRate + 115, // 21: ttn.lorawan.v3.TxSettings.time:type_name -> google.protobuf.Timestamp + 70, // 22: ttn.lorawan.v3.TxSettings.downlink:type_name -> ttn.lorawan.v3.TxSettings.Downlink + 116, // 23: ttn.lorawan.v3.GatewayAntennaIdentifiers.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers + 116, // 24: ttn.lorawan.v3.ClassBCGatewayIdentifiers.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers + 44, // 25: ttn.lorawan.v3.UplinkToken.ids:type_name -> ttn.lorawan.v3.GatewayAntennaIdentifiers + 115, // 26: ttn.lorawan.v3.UplinkToken.server_time:type_name -> google.protobuf.Timestamp + 115, // 27: ttn.lorawan.v3.UplinkToken.gateway_time:type_name -> google.protobuf.Timestamp + 44, // 28: ttn.lorawan.v3.DownlinkPath.fixed:type_name -> ttn.lorawan.v3.GatewayAntennaIdentifiers 9, // 29: ttn.lorawan.v3.TxRequest.class:type_name -> ttn.lorawan.v3.Class - 40, // 30: ttn.lorawan.v3.TxRequest.downlink_paths:type_name -> ttn.lorawan.v3.DownlinkPath - 20, // 31: ttn.lorawan.v3.TxRequest.rx1_delay:type_name -> ttn.lorawan.v3.RxDelay - 35, // 32: ttn.lorawan.v3.TxRequest.rx1_data_rate:type_name -> ttn.lorawan.v3.DataRate - 35, // 33: ttn.lorawan.v3.TxRequest.rx2_data_rate:type_name -> ttn.lorawan.v3.DataRate + 47, // 30: ttn.lorawan.v3.TxRequest.downlink_paths:type_name -> ttn.lorawan.v3.DownlinkPath + 27, // 31: ttn.lorawan.v3.TxRequest.rx1_delay:type_name -> ttn.lorawan.v3.RxDelay + 42, // 32: ttn.lorawan.v3.TxRequest.rx1_data_rate:type_name -> ttn.lorawan.v3.DataRate + 42, // 33: ttn.lorawan.v3.TxRequest.rx2_data_rate:type_name -> ttn.lorawan.v3.DataRate 10, // 34: ttn.lorawan.v3.TxRequest.priority:type_name -> ttn.lorawan.v3.TxSchedulePriority - 86, // 35: ttn.lorawan.v3.TxRequest.absolute_time:type_name -> google.protobuf.Timestamp - 85, // 36: ttn.lorawan.v3.TxRequest.advanced:type_name -> google.protobuf.Struct - 11, // 37: ttn.lorawan.v3.MACCommand.cid:type_name -> ttn.lorawan.v3.MACCommandIdentifier - 55, // 38: ttn.lorawan.v3.MACCommand.reset_ind:type_name -> ttn.lorawan.v3.MACCommand.ResetInd - 56, // 39: ttn.lorawan.v3.MACCommand.reset_conf:type_name -> ttn.lorawan.v3.MACCommand.ResetConf - 57, // 40: ttn.lorawan.v3.MACCommand.link_check_ans:type_name -> ttn.lorawan.v3.MACCommand.LinkCheckAns - 58, // 41: ttn.lorawan.v3.MACCommand.link_adr_req:type_name -> ttn.lorawan.v3.MACCommand.LinkADRReq - 59, // 42: ttn.lorawan.v3.MACCommand.link_adr_ans:type_name -> ttn.lorawan.v3.MACCommand.LinkADRAns - 60, // 43: ttn.lorawan.v3.MACCommand.duty_cycle_req:type_name -> ttn.lorawan.v3.MACCommand.DutyCycleReq - 61, // 44: ttn.lorawan.v3.MACCommand.rx_param_setup_req:type_name -> ttn.lorawan.v3.MACCommand.RxParamSetupReq - 62, // 45: ttn.lorawan.v3.MACCommand.rx_param_setup_ans:type_name -> ttn.lorawan.v3.MACCommand.RxParamSetupAns - 63, // 46: ttn.lorawan.v3.MACCommand.dev_status_ans:type_name -> ttn.lorawan.v3.MACCommand.DevStatusAns - 64, // 47: ttn.lorawan.v3.MACCommand.new_channel_req:type_name -> ttn.lorawan.v3.MACCommand.NewChannelReq - 65, // 48: ttn.lorawan.v3.MACCommand.new_channel_ans:type_name -> ttn.lorawan.v3.MACCommand.NewChannelAns - 66, // 49: ttn.lorawan.v3.MACCommand.dl_channel_req:type_name -> ttn.lorawan.v3.MACCommand.DLChannelReq - 67, // 50: ttn.lorawan.v3.MACCommand.dl_channel_ans:type_name -> ttn.lorawan.v3.MACCommand.DLChannelAns - 68, // 51: ttn.lorawan.v3.MACCommand.rx_timing_setup_req:type_name -> ttn.lorawan.v3.MACCommand.RxTimingSetupReq - 69, // 52: ttn.lorawan.v3.MACCommand.tx_param_setup_req:type_name -> ttn.lorawan.v3.MACCommand.TxParamSetupReq - 70, // 53: ttn.lorawan.v3.MACCommand.rekey_ind:type_name -> ttn.lorawan.v3.MACCommand.RekeyInd - 71, // 54: ttn.lorawan.v3.MACCommand.rekey_conf:type_name -> ttn.lorawan.v3.MACCommand.RekeyConf - 72, // 55: ttn.lorawan.v3.MACCommand.adr_param_setup_req:type_name -> ttn.lorawan.v3.MACCommand.ADRParamSetupReq - 73, // 56: ttn.lorawan.v3.MACCommand.device_time_ans:type_name -> ttn.lorawan.v3.MACCommand.DeviceTimeAns - 74, // 57: ttn.lorawan.v3.MACCommand.force_rejoin_req:type_name -> ttn.lorawan.v3.MACCommand.ForceRejoinReq - 75, // 58: ttn.lorawan.v3.MACCommand.rejoin_param_setup_req:type_name -> ttn.lorawan.v3.MACCommand.RejoinParamSetupReq - 76, // 59: ttn.lorawan.v3.MACCommand.rejoin_param_setup_ans:type_name -> ttn.lorawan.v3.MACCommand.RejoinParamSetupAns - 77, // 60: ttn.lorawan.v3.MACCommand.ping_slot_info_req:type_name -> ttn.lorawan.v3.MACCommand.PingSlotInfoReq - 78, // 61: ttn.lorawan.v3.MACCommand.ping_slot_channel_req:type_name -> ttn.lorawan.v3.MACCommand.PingSlotChannelReq - 79, // 62: ttn.lorawan.v3.MACCommand.ping_slot_channel_ans:type_name -> ttn.lorawan.v3.MACCommand.PingSlotChannelAns - 80, // 63: ttn.lorawan.v3.MACCommand.beacon_timing_ans:type_name -> ttn.lorawan.v3.MACCommand.BeaconTimingAns - 81, // 64: ttn.lorawan.v3.MACCommand.beacon_freq_req:type_name -> ttn.lorawan.v3.MACCommand.BeaconFreqReq - 82, // 65: ttn.lorawan.v3.MACCommand.beacon_freq_ans:type_name -> ttn.lorawan.v3.MACCommand.BeaconFreqAns - 83, // 66: ttn.lorawan.v3.MACCommand.device_mode_ind:type_name -> ttn.lorawan.v3.MACCommand.DeviceModeInd - 84, // 67: ttn.lorawan.v3.MACCommand.device_mode_conf:type_name -> ttn.lorawan.v3.MACCommand.DeviceModeConf - 42, // 68: ttn.lorawan.v3.MACCommands.commands:type_name -> ttn.lorawan.v3.MACCommand - 5, // 69: ttn.lorawan.v3.DataRateOffsetValue.value:type_name -> ttn.lorawan.v3.DataRateOffset - 4, // 70: ttn.lorawan.v3.DataRateIndexValue.value:type_name -> ttn.lorawan.v3.DataRateIndex - 13, // 71: ttn.lorawan.v3.PingSlotPeriodValue.value:type_name -> ttn.lorawan.v3.PingSlotPeriod - 12, // 72: ttn.lorawan.v3.AggregatedDutyCycleValue.value:type_name -> ttn.lorawan.v3.AggregatedDutyCycle - 20, // 73: ttn.lorawan.v3.RxDelayValue.value:type_name -> ttn.lorawan.v3.RxDelay - 18, // 74: ttn.lorawan.v3.ADRAckLimitExponentValue.value:type_name -> ttn.lorawan.v3.ADRAckLimitExponent - 19, // 75: ttn.lorawan.v3.ADRAckDelayExponentValue.value:type_name -> ttn.lorawan.v3.ADRAckDelayExponent - 17, // 76: ttn.lorawan.v3.DeviceEIRPValue.value:type_name -> ttn.lorawan.v3.DeviceEIRP - 21, // 77: ttn.lorawan.v3.MACCommand.ResetInd.minor_version:type_name -> ttn.lorawan.v3.Minor - 21, // 78: ttn.lorawan.v3.MACCommand.ResetConf.minor_version:type_name -> ttn.lorawan.v3.Minor - 4, // 79: ttn.lorawan.v3.MACCommand.LinkADRReq.data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 12, // 80: ttn.lorawan.v3.MACCommand.DutyCycleReq.max_duty_cycle:type_name -> ttn.lorawan.v3.AggregatedDutyCycle - 4, // 81: ttn.lorawan.v3.MACCommand.RxParamSetupReq.rx2_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 5, // 82: ttn.lorawan.v3.MACCommand.RxParamSetupReq.rx1_data_rate_offset:type_name -> ttn.lorawan.v3.DataRateOffset - 4, // 83: ttn.lorawan.v3.MACCommand.NewChannelReq.min_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 4, // 84: ttn.lorawan.v3.MACCommand.NewChannelReq.max_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 20, // 85: ttn.lorawan.v3.MACCommand.RxTimingSetupReq.delay:type_name -> ttn.lorawan.v3.RxDelay - 17, // 86: ttn.lorawan.v3.MACCommand.TxParamSetupReq.max_eirp_index:type_name -> ttn.lorawan.v3.DeviceEIRP - 21, // 87: ttn.lorawan.v3.MACCommand.RekeyInd.minor_version:type_name -> ttn.lorawan.v3.Minor - 21, // 88: ttn.lorawan.v3.MACCommand.RekeyConf.minor_version:type_name -> ttn.lorawan.v3.Minor - 18, // 89: ttn.lorawan.v3.MACCommand.ADRParamSetupReq.adr_ack_limit_exponent:type_name -> ttn.lorawan.v3.ADRAckLimitExponent - 19, // 90: ttn.lorawan.v3.MACCommand.ADRParamSetupReq.adr_ack_delay_exponent:type_name -> ttn.lorawan.v3.ADRAckDelayExponent - 86, // 91: ttn.lorawan.v3.MACCommand.DeviceTimeAns.time:type_name -> google.protobuf.Timestamp - 7, // 92: ttn.lorawan.v3.MACCommand.ForceRejoinReq.rejoin_type:type_name -> ttn.lorawan.v3.RejoinRequestType - 4, // 93: ttn.lorawan.v3.MACCommand.ForceRejoinReq.data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 16, // 94: ttn.lorawan.v3.MACCommand.ForceRejoinReq.period_exponent:type_name -> ttn.lorawan.v3.RejoinPeriodExponent - 14, // 95: ttn.lorawan.v3.MACCommand.RejoinParamSetupReq.max_count_exponent:type_name -> ttn.lorawan.v3.RejoinCountExponent - 15, // 96: ttn.lorawan.v3.MACCommand.RejoinParamSetupReq.max_time_exponent:type_name -> ttn.lorawan.v3.RejoinTimeExponent - 13, // 97: ttn.lorawan.v3.MACCommand.PingSlotInfoReq.period:type_name -> ttn.lorawan.v3.PingSlotPeriod - 4, // 98: ttn.lorawan.v3.MACCommand.PingSlotChannelReq.data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 9, // 99: ttn.lorawan.v3.MACCommand.DeviceModeInd.class:type_name -> ttn.lorawan.v3.Class - 9, // 100: ttn.lorawan.v3.MACCommand.DeviceModeConf.class:type_name -> ttn.lorawan.v3.Class - 101, // [101:101] is the sub-list for method output_type - 101, // [101:101] 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 + 115, // 35: ttn.lorawan.v3.TxRequest.absolute_time:type_name -> google.protobuf.Timestamp + 114, // 36: ttn.lorawan.v3.TxRequest.advanced:type_name -> google.protobuf.Struct + 13, // 37: ttn.lorawan.v3.RelaySecondChannel.ack_offset:type_name -> ttn.lorawan.v3.RelaySecondChAckOffset + 4, // 38: ttn.lorawan.v3.RelaySecondChannel.data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 14, // 39: ttn.lorawan.v3.RelayUplinkForwardLimits.bucket_size:type_name -> ttn.lorawan.v3.RelayLimitBucketSize + 14, // 40: ttn.lorawan.v3.RelayForwardLimits.bucket_size:type_name -> ttn.lorawan.v3.RelayLimitBucketSize + 15, // 41: ttn.lorawan.v3.RelayEndDeviceDynamicMode.smart_enable_level:type_name -> ttn.lorawan.v3.RelaySmartEnableLevel + 11, // 42: ttn.lorawan.v3.MACCommand.cid:type_name -> ttn.lorawan.v3.MACCommandIdentifier + 71, // 43: ttn.lorawan.v3.MACCommand.reset_ind:type_name -> ttn.lorawan.v3.MACCommand.ResetInd + 72, // 44: ttn.lorawan.v3.MACCommand.reset_conf:type_name -> ttn.lorawan.v3.MACCommand.ResetConf + 73, // 45: ttn.lorawan.v3.MACCommand.link_check_ans:type_name -> ttn.lorawan.v3.MACCommand.LinkCheckAns + 74, // 46: ttn.lorawan.v3.MACCommand.link_adr_req:type_name -> ttn.lorawan.v3.MACCommand.LinkADRReq + 75, // 47: ttn.lorawan.v3.MACCommand.link_adr_ans:type_name -> ttn.lorawan.v3.MACCommand.LinkADRAns + 76, // 48: ttn.lorawan.v3.MACCommand.duty_cycle_req:type_name -> ttn.lorawan.v3.MACCommand.DutyCycleReq + 77, // 49: ttn.lorawan.v3.MACCommand.rx_param_setup_req:type_name -> ttn.lorawan.v3.MACCommand.RxParamSetupReq + 78, // 50: ttn.lorawan.v3.MACCommand.rx_param_setup_ans:type_name -> ttn.lorawan.v3.MACCommand.RxParamSetupAns + 79, // 51: ttn.lorawan.v3.MACCommand.dev_status_ans:type_name -> ttn.lorawan.v3.MACCommand.DevStatusAns + 80, // 52: ttn.lorawan.v3.MACCommand.new_channel_req:type_name -> ttn.lorawan.v3.MACCommand.NewChannelReq + 81, // 53: ttn.lorawan.v3.MACCommand.new_channel_ans:type_name -> ttn.lorawan.v3.MACCommand.NewChannelAns + 82, // 54: ttn.lorawan.v3.MACCommand.dl_channel_req:type_name -> ttn.lorawan.v3.MACCommand.DLChannelReq + 83, // 55: ttn.lorawan.v3.MACCommand.dl_channel_ans:type_name -> ttn.lorawan.v3.MACCommand.DLChannelAns + 84, // 56: ttn.lorawan.v3.MACCommand.rx_timing_setup_req:type_name -> ttn.lorawan.v3.MACCommand.RxTimingSetupReq + 85, // 57: ttn.lorawan.v3.MACCommand.tx_param_setup_req:type_name -> ttn.lorawan.v3.MACCommand.TxParamSetupReq + 86, // 58: ttn.lorawan.v3.MACCommand.rekey_ind:type_name -> ttn.lorawan.v3.MACCommand.RekeyInd + 87, // 59: ttn.lorawan.v3.MACCommand.rekey_conf:type_name -> ttn.lorawan.v3.MACCommand.RekeyConf + 88, // 60: ttn.lorawan.v3.MACCommand.adr_param_setup_req:type_name -> ttn.lorawan.v3.MACCommand.ADRParamSetupReq + 89, // 61: ttn.lorawan.v3.MACCommand.device_time_ans:type_name -> ttn.lorawan.v3.MACCommand.DeviceTimeAns + 90, // 62: ttn.lorawan.v3.MACCommand.force_rejoin_req:type_name -> ttn.lorawan.v3.MACCommand.ForceRejoinReq + 91, // 63: ttn.lorawan.v3.MACCommand.rejoin_param_setup_req:type_name -> ttn.lorawan.v3.MACCommand.RejoinParamSetupReq + 92, // 64: ttn.lorawan.v3.MACCommand.rejoin_param_setup_ans:type_name -> ttn.lorawan.v3.MACCommand.RejoinParamSetupAns + 93, // 65: ttn.lorawan.v3.MACCommand.ping_slot_info_req:type_name -> ttn.lorawan.v3.MACCommand.PingSlotInfoReq + 94, // 66: ttn.lorawan.v3.MACCommand.ping_slot_channel_req:type_name -> ttn.lorawan.v3.MACCommand.PingSlotChannelReq + 95, // 67: ttn.lorawan.v3.MACCommand.ping_slot_channel_ans:type_name -> ttn.lorawan.v3.MACCommand.PingSlotChannelAns + 96, // 68: ttn.lorawan.v3.MACCommand.beacon_timing_ans:type_name -> ttn.lorawan.v3.MACCommand.BeaconTimingAns + 97, // 69: ttn.lorawan.v3.MACCommand.beacon_freq_req:type_name -> ttn.lorawan.v3.MACCommand.BeaconFreqReq + 98, // 70: ttn.lorawan.v3.MACCommand.beacon_freq_ans:type_name -> ttn.lorawan.v3.MACCommand.BeaconFreqAns + 99, // 71: ttn.lorawan.v3.MACCommand.device_mode_ind:type_name -> ttn.lorawan.v3.MACCommand.DeviceModeInd + 100, // 72: ttn.lorawan.v3.MACCommand.device_mode_conf:type_name -> ttn.lorawan.v3.MACCommand.DeviceModeConf + 101, // 73: ttn.lorawan.v3.MACCommand.relay_conf_req:type_name -> ttn.lorawan.v3.MACCommand.RelayConfReq + 102, // 74: ttn.lorawan.v3.MACCommand.relay_conf_ans:type_name -> ttn.lorawan.v3.MACCommand.RelayConfAns + 103, // 75: ttn.lorawan.v3.MACCommand.relay_end_device_conf_req:type_name -> ttn.lorawan.v3.MACCommand.RelayEndDeviceConfReq + 104, // 76: ttn.lorawan.v3.MACCommand.relay_end_device_conf_ans:type_name -> ttn.lorawan.v3.MACCommand.RelayEndDeviceConfAns + 105, // 77: ttn.lorawan.v3.MACCommand.relay_update_uplink_list_req:type_name -> ttn.lorawan.v3.MACCommand.RelayUpdateUplinkListReq + 106, // 78: ttn.lorawan.v3.MACCommand.relay_update_uplink_list_ans:type_name -> ttn.lorawan.v3.MACCommand.RelayUpdateUplinkListAns + 107, // 79: ttn.lorawan.v3.MACCommand.relay_ctrl_uplink_list_req:type_name -> ttn.lorawan.v3.MACCommand.RelayCtrlUplinkListReq + 108, // 80: ttn.lorawan.v3.MACCommand.relay_ctrl_uplink_list_ans:type_name -> ttn.lorawan.v3.MACCommand.RelayCtrlUplinkListAns + 109, // 81: ttn.lorawan.v3.MACCommand.relay_configure_fwd_limit_req:type_name -> ttn.lorawan.v3.MACCommand.RelayConfigureFwdLimitReq + 110, // 82: ttn.lorawan.v3.MACCommand.relay_configure_fwd_limit_ans:type_name -> ttn.lorawan.v3.MACCommand.RelayConfigureFwdLimitAns + 111, // 83: ttn.lorawan.v3.MACCommand.relay_notify_new_end_device_req:type_name -> ttn.lorawan.v3.MACCommand.RelayNotifyNewEndDeviceReq + 55, // 84: ttn.lorawan.v3.MACCommands.commands:type_name -> ttn.lorawan.v3.MACCommand + 5, // 85: ttn.lorawan.v3.DataRateOffsetValue.value:type_name -> ttn.lorawan.v3.DataRateOffset + 4, // 86: ttn.lorawan.v3.DataRateIndexValue.value:type_name -> ttn.lorawan.v3.DataRateIndex + 20, // 87: ttn.lorawan.v3.PingSlotPeriodValue.value:type_name -> ttn.lorawan.v3.PingSlotPeriod + 19, // 88: ttn.lorawan.v3.AggregatedDutyCycleValue.value:type_name -> ttn.lorawan.v3.AggregatedDutyCycle + 27, // 89: ttn.lorawan.v3.RxDelayValue.value:type_name -> ttn.lorawan.v3.RxDelay + 25, // 90: ttn.lorawan.v3.ADRAckLimitExponentValue.value:type_name -> ttn.lorawan.v3.ADRAckLimitExponent + 26, // 91: ttn.lorawan.v3.ADRAckDelayExponentValue.value:type_name -> ttn.lorawan.v3.ADRAckDelayExponent + 24, // 92: ttn.lorawan.v3.DeviceEIRPValue.value:type_name -> ttn.lorawan.v3.DeviceEIRP + 42, // 93: ttn.lorawan.v3.RelayForwardUplinkReq.data_rate:type_name -> ttn.lorawan.v3.DataRate + 16, // 94: ttn.lorawan.v3.RelayForwardUplinkReq.wor_channel:type_name -> ttn.lorawan.v3.RelayWORChannel + 117, // 95: ttn.lorawan.v3.RelayUplinkToken.ids:type_name -> ttn.lorawan.v3.EndDeviceIdentifiers + 28, // 96: ttn.lorawan.v3.MACCommand.ResetInd.minor_version:type_name -> ttn.lorawan.v3.Minor + 28, // 97: ttn.lorawan.v3.MACCommand.ResetConf.minor_version:type_name -> ttn.lorawan.v3.Minor + 4, // 98: ttn.lorawan.v3.MACCommand.LinkADRReq.data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 19, // 99: ttn.lorawan.v3.MACCommand.DutyCycleReq.max_duty_cycle:type_name -> ttn.lorawan.v3.AggregatedDutyCycle + 4, // 100: ttn.lorawan.v3.MACCommand.RxParamSetupReq.rx2_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 5, // 101: ttn.lorawan.v3.MACCommand.RxParamSetupReq.rx1_data_rate_offset:type_name -> ttn.lorawan.v3.DataRateOffset + 4, // 102: ttn.lorawan.v3.MACCommand.NewChannelReq.min_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 4, // 103: ttn.lorawan.v3.MACCommand.NewChannelReq.max_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 27, // 104: ttn.lorawan.v3.MACCommand.RxTimingSetupReq.delay:type_name -> ttn.lorawan.v3.RxDelay + 24, // 105: ttn.lorawan.v3.MACCommand.TxParamSetupReq.max_eirp_index:type_name -> ttn.lorawan.v3.DeviceEIRP + 28, // 106: ttn.lorawan.v3.MACCommand.RekeyInd.minor_version:type_name -> ttn.lorawan.v3.Minor + 28, // 107: ttn.lorawan.v3.MACCommand.RekeyConf.minor_version:type_name -> ttn.lorawan.v3.Minor + 25, // 108: ttn.lorawan.v3.MACCommand.ADRParamSetupReq.adr_ack_limit_exponent:type_name -> ttn.lorawan.v3.ADRAckLimitExponent + 26, // 109: ttn.lorawan.v3.MACCommand.ADRParamSetupReq.adr_ack_delay_exponent:type_name -> ttn.lorawan.v3.ADRAckDelayExponent + 115, // 110: ttn.lorawan.v3.MACCommand.DeviceTimeAns.time:type_name -> google.protobuf.Timestamp + 7, // 111: ttn.lorawan.v3.MACCommand.ForceRejoinReq.rejoin_type:type_name -> ttn.lorawan.v3.RejoinRequestType + 4, // 112: ttn.lorawan.v3.MACCommand.ForceRejoinReq.data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 23, // 113: ttn.lorawan.v3.MACCommand.ForceRejoinReq.period_exponent:type_name -> ttn.lorawan.v3.RejoinPeriodExponent + 21, // 114: ttn.lorawan.v3.MACCommand.RejoinParamSetupReq.max_count_exponent:type_name -> ttn.lorawan.v3.RejoinCountExponent + 22, // 115: ttn.lorawan.v3.MACCommand.RejoinParamSetupReq.max_time_exponent:type_name -> ttn.lorawan.v3.RejoinTimeExponent + 20, // 116: ttn.lorawan.v3.MACCommand.PingSlotInfoReq.period:type_name -> ttn.lorawan.v3.PingSlotPeriod + 4, // 117: ttn.lorawan.v3.MACCommand.PingSlotChannelReq.data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 9, // 118: ttn.lorawan.v3.MACCommand.DeviceModeInd.class:type_name -> ttn.lorawan.v3.Class + 9, // 119: ttn.lorawan.v3.MACCommand.DeviceModeConf.class:type_name -> ttn.lorawan.v3.Class + 112, // 120: ttn.lorawan.v3.MACCommand.RelayConfReq.configuration:type_name -> ttn.lorawan.v3.MACCommand.RelayConfReq.Configuration + 113, // 121: ttn.lorawan.v3.MACCommand.RelayEndDeviceConfReq.configuration:type_name -> ttn.lorawan.v3.MACCommand.RelayEndDeviceConfReq.Configuration + 50, // 122: ttn.lorawan.v3.MACCommand.RelayUpdateUplinkListReq.forward_limits:type_name -> ttn.lorawan.v3.RelayUplinkForwardLimits + 18, // 123: ttn.lorawan.v3.MACCommand.RelayCtrlUplinkListReq.action:type_name -> ttn.lorawan.v3.RelayCtrlUplinkListAction + 17, // 124: ttn.lorawan.v3.MACCommand.RelayConfigureFwdLimitReq.reset_limit_counter:type_name -> ttn.lorawan.v3.RelayResetLimitCounter + 51, // 125: ttn.lorawan.v3.MACCommand.RelayConfigureFwdLimitReq.join_request_limits:type_name -> ttn.lorawan.v3.RelayForwardLimits + 51, // 126: ttn.lorawan.v3.MACCommand.RelayConfigureFwdLimitReq.notify_limits:type_name -> ttn.lorawan.v3.RelayForwardLimits + 51, // 127: ttn.lorawan.v3.MACCommand.RelayConfigureFwdLimitReq.global_uplink_limits:type_name -> ttn.lorawan.v3.RelayForwardLimits + 51, // 128: ttn.lorawan.v3.MACCommand.RelayConfigureFwdLimitReq.overall_limits:type_name -> ttn.lorawan.v3.RelayForwardLimits + 49, // 129: ttn.lorawan.v3.MACCommand.RelayConfReq.Configuration.second_channel:type_name -> ttn.lorawan.v3.RelaySecondChannel + 12, // 130: ttn.lorawan.v3.MACCommand.RelayConfReq.Configuration.cad_periodicity:type_name -> ttn.lorawan.v3.RelayCADPeriodicity + 52, // 131: ttn.lorawan.v3.MACCommand.RelayEndDeviceConfReq.Configuration.always:type_name -> ttn.lorawan.v3.RelayEndDeviceAlwaysMode + 53, // 132: ttn.lorawan.v3.MACCommand.RelayEndDeviceConfReq.Configuration.dynamic:type_name -> ttn.lorawan.v3.RelayEndDeviceDynamicMode + 54, // 133: ttn.lorawan.v3.MACCommand.RelayEndDeviceConfReq.Configuration.end_device_controlled:type_name -> ttn.lorawan.v3.RelayEndDeviceControlledMode + 49, // 134: ttn.lorawan.v3.MACCommand.RelayEndDeviceConfReq.Configuration.second_channel:type_name -> ttn.lorawan.v3.RelaySecondChannel + 135, // [135:135] is the sub-list for method output_type + 135, // [135:135] is the sub-list for method input_type + 135, // [135:135] is the sub-list for extension type_name + 135, // [135:135] is the sub-list for extension extendee + 0, // [0:135] is the sub-list for field type_name } func init() { file_ttn_lorawan_v3_lorawan_proto_init() } @@ -7597,8 +10074,224 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MHDR); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MHDR); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACPayload); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FHDR); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FCtrl); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*JoinRequestPayload); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RejoinRequestPayload); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*JoinAcceptPayload); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DLSettings); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CFList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LoRaDataRate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FSKDataRate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LRFHSSDataRate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataRate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TxSettings); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GatewayAntennaIdentifiers); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClassBCGatewayIdentifiers); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UplinkToken); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DownlinkPath); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TxRequest); i { case 0: return &v.state case 1: @@ -7609,8 +10302,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACPayload); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RelaySecondChannel); i { case 0: return &v.state case 1: @@ -7621,8 +10314,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FHDR); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RelayUplinkForwardLimits); i { case 0: return &v.state case 1: @@ -7633,8 +10326,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FCtrl); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RelayForwardLimits); i { case 0: return &v.state case 1: @@ -7645,8 +10338,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JoinRequestPayload); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RelayEndDeviceAlwaysMode); i { case 0: return &v.state case 1: @@ -7657,8 +10350,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RejoinRequestPayload); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RelayEndDeviceDynamicMode); i { case 0: return &v.state case 1: @@ -7669,8 +10362,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JoinAcceptPayload); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RelayEndDeviceControlledMode); i { case 0: return &v.state case 1: @@ -7681,8 +10374,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DLSettings); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand); i { case 0: return &v.state case 1: @@ -7693,8 +10386,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CFList); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommands); i { case 0: return &v.state case 1: @@ -7705,8 +10398,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoRaDataRate); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FrequencyValue); i { case 0: return &v.state case 1: @@ -7717,8 +10410,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FSKDataRate); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ZeroableFrequencyValue); i { case 0: return &v.state case 1: @@ -7729,8 +10422,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LRFHSSDataRate); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataRateOffsetValue); i { case 0: return &v.state case 1: @@ -7741,8 +10434,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataRate); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataRateIndexValue); i { case 0: return &v.state case 1: @@ -7753,8 +10446,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TxSettings); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PingSlotPeriodValue); i { case 0: return &v.state case 1: @@ -7765,8 +10458,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GatewayAntennaIdentifiers); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AggregatedDutyCycleValue); i { case 0: return &v.state case 1: @@ -7777,8 +10470,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClassBCGatewayIdentifiers); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RxDelayValue); i { case 0: return &v.state case 1: @@ -7789,8 +10482,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UplinkToken); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ADRAckLimitExponentValue); i { case 0: return &v.state case 1: @@ -7801,8 +10494,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DownlinkPath); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ADRAckDelayExponentValue); i { case 0: return &v.state case 1: @@ -7813,8 +10506,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TxRequest); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeviceEIRPValue); i { case 0: return &v.state case 1: @@ -7825,8 +10518,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RelayForwardUplinkReq); i { case 0: return &v.state case 1: @@ -7837,8 +10530,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommands); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RelayForwardDownlinkReq); i { case 0: return &v.state case 1: @@ -7849,8 +10542,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FrequencyValue); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RelayUplinkToken); i { case 0: return &v.state case 1: @@ -7861,8 +10554,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ZeroableFrequencyValue); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TxSettings_Downlink); i { case 0: return &v.state case 1: @@ -7873,8 +10566,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataRateOffsetValue); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_ResetInd); i { case 0: return &v.state case 1: @@ -7885,8 +10578,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataRateIndexValue); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_ResetConf); i { case 0: return &v.state case 1: @@ -7897,8 +10590,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PingSlotPeriodValue); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_LinkCheckAns); i { case 0: return &v.state case 1: @@ -7909,8 +10602,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AggregatedDutyCycleValue); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_LinkADRReq); i { case 0: return &v.state case 1: @@ -7921,8 +10614,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RxDelayValue); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_LinkADRAns); i { case 0: return &v.state case 1: @@ -7933,8 +10626,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ADRAckLimitExponentValue); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_DutyCycleReq); i { case 0: return &v.state case 1: @@ -7945,8 +10638,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ADRAckDelayExponentValue); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_RxParamSetupReq); i { case 0: return &v.state case 1: @@ -7957,8 +10650,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeviceEIRPValue); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_RxParamSetupAns); i { case 0: return &v.state case 1: @@ -7969,8 +10662,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TxSettings_Downlink); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_DevStatusAns); i { case 0: return &v.state case 1: @@ -7981,8 +10674,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_ResetInd); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_NewChannelReq); i { case 0: return &v.state case 1: @@ -7993,8 +10686,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_ResetConf); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_NewChannelAns); i { case 0: return &v.state case 1: @@ -8005,8 +10698,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_LinkCheckAns); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_DLChannelReq); i { case 0: return &v.state case 1: @@ -8017,8 +10710,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_LinkADRReq); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_DLChannelAns); i { case 0: return &v.state case 1: @@ -8029,8 +10722,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_LinkADRAns); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_RxTimingSetupReq); i { case 0: return &v.state case 1: @@ -8041,8 +10734,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_DutyCycleReq); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_TxParamSetupReq); i { case 0: return &v.state case 1: @@ -8053,8 +10746,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_RxParamSetupReq); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_RekeyInd); i { case 0: return &v.state case 1: @@ -8065,8 +10758,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_RxParamSetupAns); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_RekeyConf); i { case 0: return &v.state case 1: @@ -8077,8 +10770,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_DevStatusAns); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_ADRParamSetupReq); i { case 0: return &v.state case 1: @@ -8089,8 +10782,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_NewChannelReq); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_DeviceTimeAns); i { case 0: return &v.state case 1: @@ -8101,8 +10794,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_NewChannelAns); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_ForceRejoinReq); i { case 0: return &v.state case 1: @@ -8113,8 +10806,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_DLChannelReq); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_RejoinParamSetupReq); i { case 0: return &v.state case 1: @@ -8125,8 +10818,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_DLChannelAns); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_RejoinParamSetupAns); i { case 0: return &v.state case 1: @@ -8137,8 +10830,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_RxTimingSetupReq); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_PingSlotInfoReq); i { case 0: return &v.state case 1: @@ -8149,8 +10842,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_TxParamSetupReq); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_PingSlotChannelReq); i { case 0: return &v.state case 1: @@ -8161,8 +10854,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_RekeyInd); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_PingSlotChannelAns); i { case 0: return &v.state case 1: @@ -8173,8 +10866,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_RekeyConf); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_BeaconTimingAns); i { case 0: return &v.state case 1: @@ -8185,8 +10878,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_ADRParamSetupReq); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_BeaconFreqReq); i { case 0: return &v.state case 1: @@ -8197,8 +10890,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_DeviceTimeAns); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_BeaconFreqAns); i { case 0: return &v.state case 1: @@ -8209,8 +10902,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_ForceRejoinReq); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_DeviceModeInd); i { case 0: return &v.state case 1: @@ -8221,8 +10914,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_RejoinParamSetupReq); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_DeviceModeConf); i { case 0: return &v.state case 1: @@ -8233,8 +10926,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_RejoinParamSetupAns); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_RelayConfReq); i { case 0: return &v.state case 1: @@ -8245,8 +10938,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_PingSlotInfoReq); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_RelayConfAns); i { case 0: return &v.state case 1: @@ -8257,8 +10950,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_PingSlotChannelReq); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_RelayEndDeviceConfReq); i { case 0: return &v.state case 1: @@ -8269,8 +10962,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_PingSlotChannelAns); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_RelayEndDeviceConfAns); i { case 0: return &v.state case 1: @@ -8281,8 +10974,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_BeaconTimingAns); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_RelayUpdateUplinkListReq); i { case 0: return &v.state case 1: @@ -8293,8 +10986,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_BeaconFreqReq); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_RelayUpdateUplinkListAns); i { case 0: return &v.state case 1: @@ -8305,8 +10998,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_BeaconFreqAns); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_RelayCtrlUplinkListReq); i { case 0: return &v.state case 1: @@ -8317,8 +11010,8 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_DeviceModeInd); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_RelayCtrlUplinkListAns); i { case 0: return &v.state case 1: @@ -8329,8 +11022,56 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { return nil } } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACCommand_DeviceModeConf); i { + file_ttn_lorawan_v3_lorawan_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_RelayConfigureFwdLimitReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_RelayConfigureFwdLimitAns); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_RelayNotifyNewEndDeviceReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_RelayConfReq_Configuration); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACCommand_RelayEndDeviceConfReq_Configuration); i { case 0: return &v.state case 1: @@ -8357,7 +11098,7 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { (*DownlinkPath_UplinkToken)(nil), (*DownlinkPath_Fixed)(nil), } - file_ttn_lorawan_v3_lorawan_proto_msgTypes[20].OneofWrappers = []interface{}{ + file_ttn_lorawan_v3_lorawan_proto_msgTypes[26].OneofWrappers = []interface{}{ (*MACCommand_RawPayload)(nil), (*MACCommand_ResetInd_)(nil), (*MACCommand_ResetConf_)(nil), @@ -8389,14 +11130,30 @@ func file_ttn_lorawan_v3_lorawan_proto_init() { (*MACCommand_BeaconFreqAns_)(nil), (*MACCommand_DeviceModeInd_)(nil), (*MACCommand_DeviceModeConf_)(nil), + (*MACCommand_RelayConfReq_)(nil), + (*MACCommand_RelayConfAns_)(nil), + (*MACCommand_RelayEndDeviceConfReq_)(nil), + (*MACCommand_RelayEndDeviceConfAns_)(nil), + (*MACCommand_RelayUpdateUplinkListReq_)(nil), + (*MACCommand_RelayUpdateUplinkListAns_)(nil), + (*MACCommand_RelayCtrlUplinkListReq_)(nil), + (*MACCommand_RelayCtrlUplinkListAns_)(nil), + (*MACCommand_RelayConfigureFwdLimitReq_)(nil), + (*MACCommand_RelayConfigureFwdLimitAns_)(nil), + (*MACCommand_RelayNotifyNewEndDeviceReq_)(nil), + } + file_ttn_lorawan_v3_lorawan_proto_msgTypes[84].OneofWrappers = []interface{}{ + (*MACCommand_RelayEndDeviceConfReq_Configuration_Always)(nil), + (*MACCommand_RelayEndDeviceConfReq_Configuration_Dynamic)(nil), + (*MACCommand_RelayEndDeviceConfReq_Configuration_EndDeviceControlled)(nil), } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_ttn_lorawan_v3_lorawan_proto_rawDesc, - NumEnums: 22, - NumMessages: 63, + NumEnums: 29, + NumMessages: 85, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/ttnpb/lorawan.pb.paths.fm.go b/pkg/ttnpb/lorawan.pb.paths.fm.go index 477846bc13..ca77ac871e 100644 --- a/pkg/ttnpb/lorawan.pb.paths.fm.go +++ b/pkg/ttnpb/lorawan.pb.paths.fm.go @@ -377,6 +377,46 @@ var TxRequestFieldPathsTopLevel = []string{ "rx2_data_rate", "rx2_frequency", } +var RelaySecondChannelFieldPathsNested = []string{ + "ack_offset", + "data_rate_index", + "frequency", +} + +var RelaySecondChannelFieldPathsTopLevel = []string{ + "ack_offset", + "data_rate_index", + "frequency", +} +var RelayUplinkForwardLimitsFieldPathsNested = []string{ + "bucket_size", + "reload_rate", +} + +var RelayUplinkForwardLimitsFieldPathsTopLevel = []string{ + "bucket_size", + "reload_rate", +} +var RelayForwardLimitsFieldPathsNested = []string{ + "bucket_size", + "reload_rate", +} + +var RelayForwardLimitsFieldPathsTopLevel = []string{ + "bucket_size", + "reload_rate", +} +var RelayEndDeviceAlwaysModeFieldPathsNested []string +var RelayEndDeviceAlwaysModeFieldPathsTopLevel []string +var RelayEndDeviceDynamicModeFieldPathsNested = []string{ + "smart_enable_level", +} + +var RelayEndDeviceDynamicModeFieldPathsTopLevel = []string{ + "smart_enable_level", +} +var RelayEndDeviceControlledModeFieldPathsNested []string +var RelayEndDeviceControlledModeFieldPathsTopLevel []string var MACCommandFieldPathsNested = []string{ "cid", "payload", @@ -451,6 +491,75 @@ var MACCommandFieldPathsNested = []string{ "payload.rekey_conf.minor_version", "payload.rekey_ind", "payload.rekey_ind.minor_version", + "payload.relay_conf_ans", + "payload.relay_conf_ans.cad_periodicity_ack", + "payload.relay_conf_ans.default_channel_index_ack", + "payload.relay_conf_ans.second_channel_ack_offset_ack", + "payload.relay_conf_ans.second_channel_data_rate_index_ack", + "payload.relay_conf_ans.second_channel_frequency_ack", + "payload.relay_conf_ans.second_channel_index_ack", + "payload.relay_conf_req", + "payload.relay_conf_req.configuration", + "payload.relay_conf_req.configuration.cad_periodicity", + "payload.relay_conf_req.configuration.default_channel_index", + "payload.relay_conf_req.configuration.second_channel", + "payload.relay_conf_req.configuration.second_channel.ack_offset", + "payload.relay_conf_req.configuration.second_channel.data_rate_index", + "payload.relay_conf_req.configuration.second_channel.frequency", + "payload.relay_configure_fwd_limit_ans", + "payload.relay_configure_fwd_limit_req", + "payload.relay_configure_fwd_limit_req.global_uplink_limits", + "payload.relay_configure_fwd_limit_req.global_uplink_limits.bucket_size", + "payload.relay_configure_fwd_limit_req.global_uplink_limits.reload_rate", + "payload.relay_configure_fwd_limit_req.join_request_limits", + "payload.relay_configure_fwd_limit_req.join_request_limits.bucket_size", + "payload.relay_configure_fwd_limit_req.join_request_limits.reload_rate", + "payload.relay_configure_fwd_limit_req.notify_limits", + "payload.relay_configure_fwd_limit_req.notify_limits.bucket_size", + "payload.relay_configure_fwd_limit_req.notify_limits.reload_rate", + "payload.relay_configure_fwd_limit_req.overall_limits", + "payload.relay_configure_fwd_limit_req.overall_limits.bucket_size", + "payload.relay_configure_fwd_limit_req.overall_limits.reload_rate", + "payload.relay_configure_fwd_limit_req.reset_limit_counter", + "payload.relay_ctrl_uplink_list_ans", + "payload.relay_ctrl_uplink_list_ans.rule_index_ack", + "payload.relay_ctrl_uplink_list_ans.w_f_cnt", + "payload.relay_ctrl_uplink_list_req", + "payload.relay_ctrl_uplink_list_req.action", + "payload.relay_ctrl_uplink_list_req.rule_index", + "payload.relay_end_device_conf_ans", + "payload.relay_end_device_conf_ans.backoff_ack", + "payload.relay_end_device_conf_ans.second_channel_data_rate_index_ack", + "payload.relay_end_device_conf_ans.second_channel_frequency_ack", + "payload.relay_end_device_conf_ans.second_channel_index_ack", + "payload.relay_end_device_conf_req", + "payload.relay_end_device_conf_req.configuration", + "payload.relay_end_device_conf_req.configuration.backoff", + "payload.relay_end_device_conf_req.configuration.mode", + "payload.relay_end_device_conf_req.configuration.mode.always", + "payload.relay_end_device_conf_req.configuration.mode.dynamic", + "payload.relay_end_device_conf_req.configuration.mode.dynamic.smart_enable_level", + "payload.relay_end_device_conf_req.configuration.mode.end_device_controlled", + "payload.relay_end_device_conf_req.configuration.second_channel", + "payload.relay_end_device_conf_req.configuration.second_channel.ack_offset", + "payload.relay_end_device_conf_req.configuration.second_channel.data_rate_index", + "payload.relay_end_device_conf_req.configuration.second_channel.frequency", + "payload.relay_end_device_conf_req.configuration.serving_device_id", + "payload.relay_notify_new_end_device_req", + "payload.relay_notify_new_end_device_req.dev_addr", + "payload.relay_notify_new_end_device_req.rssi", + "payload.relay_notify_new_end_device_req.snr", + "payload.relay_update_uplink_list_ans", + "payload.relay_update_uplink_list_req", + "payload.relay_update_uplink_list_req.dev_addr", + "payload.relay_update_uplink_list_req.device_id", + "payload.relay_update_uplink_list_req.forward_limits", + "payload.relay_update_uplink_list_req.forward_limits.bucket_size", + "payload.relay_update_uplink_list_req.forward_limits.reload_rate", + "payload.relay_update_uplink_list_req.root_wor_s_key", + "payload.relay_update_uplink_list_req.rule_index", + "payload.relay_update_uplink_list_req.session_key_id", + "payload.relay_update_uplink_list_req.w_f_cnt", "payload.reset_conf", "payload.reset_conf.minor_version", "payload.reset_ind", @@ -552,6 +661,58 @@ var DeviceEIRPValueFieldPathsNested = []string{ var DeviceEIRPValueFieldPathsTopLevel = []string{ "value", } +var RelayForwardUplinkReqFieldPathsNested = []string{ + "data_rate", + "data_rate.modulation", + "data_rate.modulation.fsk", + "data_rate.modulation.fsk.bit_rate", + "data_rate.modulation.lora", + "data_rate.modulation.lora.bandwidth", + "data_rate.modulation.lora.coding_rate", + "data_rate.modulation.lora.spreading_factor", + "data_rate.modulation.lrfhss", + "data_rate.modulation.lrfhss.coding_rate", + "data_rate.modulation.lrfhss.modulation_type", + "data_rate.modulation.lrfhss.operating_channel_width", + "frequency", + "raw_payload", + "rssi", + "snr", + "wor_channel", +} + +var RelayForwardUplinkReqFieldPathsTopLevel = []string{ + "data_rate", + "frequency", + "raw_payload", + "rssi", + "snr", + "wor_channel", +} +var RelayForwardDownlinkReqFieldPathsNested = []string{ + "raw_payload", +} + +var RelayForwardDownlinkReqFieldPathsTopLevel = []string{ + "raw_payload", +} +var RelayUplinkTokenFieldPathsNested = []string{ + "full_f_cnt", + "ids", + "ids.application_ids", + "ids.application_ids.application_id", + "ids.dev_addr", + "ids.dev_eui", + "ids.device_id", + "ids.join_eui", + "session_key_id", +} + +var RelayUplinkTokenFieldPathsTopLevel = []string{ + "full_f_cnt", + "ids", + "session_key_id", +} var TxSettings_DownlinkFieldPathsNested = []string{ "antenna_index", "invert_polarization", @@ -829,3 +990,175 @@ var MACCommand_DeviceModeConfFieldPathsNested = []string{ var MACCommand_DeviceModeConfFieldPathsTopLevel = []string{ "class", } +var MACCommand_RelayConfReqFieldPathsNested = []string{ + "configuration", + "configuration.cad_periodicity", + "configuration.default_channel_index", + "configuration.second_channel", + "configuration.second_channel.ack_offset", + "configuration.second_channel.data_rate_index", + "configuration.second_channel.frequency", +} + +var MACCommand_RelayConfReqFieldPathsTopLevel = []string{ + "configuration", +} +var MACCommand_RelayConfAnsFieldPathsNested = []string{ + "cad_periodicity_ack", + "default_channel_index_ack", + "second_channel_ack_offset_ack", + "second_channel_data_rate_index_ack", + "second_channel_frequency_ack", + "second_channel_index_ack", +} + +var MACCommand_RelayConfAnsFieldPathsTopLevel = []string{ + "cad_periodicity_ack", + "default_channel_index_ack", + "second_channel_ack_offset_ack", + "second_channel_data_rate_index_ack", + "second_channel_frequency_ack", + "second_channel_index_ack", +} +var MACCommand_RelayEndDeviceConfReqFieldPathsNested = []string{ + "configuration", + "configuration.backoff", + "configuration.mode", + "configuration.mode.always", + "configuration.mode.dynamic", + "configuration.mode.dynamic.smart_enable_level", + "configuration.mode.end_device_controlled", + "configuration.second_channel", + "configuration.second_channel.ack_offset", + "configuration.second_channel.data_rate_index", + "configuration.second_channel.frequency", + "configuration.serving_device_id", +} + +var MACCommand_RelayEndDeviceConfReqFieldPathsTopLevel = []string{ + "configuration", +} +var MACCommand_RelayEndDeviceConfAnsFieldPathsNested = []string{ + "backoff_ack", + "second_channel_data_rate_index_ack", + "second_channel_frequency_ack", + "second_channel_index_ack", +} + +var MACCommand_RelayEndDeviceConfAnsFieldPathsTopLevel = []string{ + "backoff_ack", + "second_channel_data_rate_index_ack", + "second_channel_frequency_ack", + "second_channel_index_ack", +} +var MACCommand_RelayUpdateUplinkListReqFieldPathsNested = []string{ + "dev_addr", + "device_id", + "forward_limits", + "forward_limits.bucket_size", + "forward_limits.reload_rate", + "root_wor_s_key", + "rule_index", + "session_key_id", + "w_f_cnt", +} + +var MACCommand_RelayUpdateUplinkListReqFieldPathsTopLevel = []string{ + "dev_addr", + "device_id", + "forward_limits", + "root_wor_s_key", + "rule_index", + "session_key_id", + "w_f_cnt", +} +var MACCommand_RelayUpdateUplinkListAnsFieldPathsNested []string +var MACCommand_RelayUpdateUplinkListAnsFieldPathsTopLevel []string +var MACCommand_RelayCtrlUplinkListReqFieldPathsNested = []string{ + "action", + "rule_index", +} + +var MACCommand_RelayCtrlUplinkListReqFieldPathsTopLevel = []string{ + "action", + "rule_index", +} +var MACCommand_RelayCtrlUplinkListAnsFieldPathsNested = []string{ + "rule_index_ack", + "w_f_cnt", +} + +var MACCommand_RelayCtrlUplinkListAnsFieldPathsTopLevel = []string{ + "rule_index_ack", + "w_f_cnt", +} +var MACCommand_RelayConfigureFwdLimitReqFieldPathsNested = []string{ + "global_uplink_limits", + "global_uplink_limits.bucket_size", + "global_uplink_limits.reload_rate", + "join_request_limits", + "join_request_limits.bucket_size", + "join_request_limits.reload_rate", + "notify_limits", + "notify_limits.bucket_size", + "notify_limits.reload_rate", + "overall_limits", + "overall_limits.bucket_size", + "overall_limits.reload_rate", + "reset_limit_counter", +} + +var MACCommand_RelayConfigureFwdLimitReqFieldPathsTopLevel = []string{ + "global_uplink_limits", + "join_request_limits", + "notify_limits", + "overall_limits", + "reset_limit_counter", +} +var MACCommand_RelayConfigureFwdLimitAnsFieldPathsNested []string +var MACCommand_RelayConfigureFwdLimitAnsFieldPathsTopLevel []string +var MACCommand_RelayNotifyNewEndDeviceReqFieldPathsNested = []string{ + "dev_addr", + "rssi", + "snr", +} + +var MACCommand_RelayNotifyNewEndDeviceReqFieldPathsTopLevel = []string{ + "dev_addr", + "rssi", + "snr", +} +var MACCommand_RelayConfReq_ConfigurationFieldPathsNested = []string{ + "cad_periodicity", + "default_channel_index", + "second_channel", + "second_channel.ack_offset", + "second_channel.data_rate_index", + "second_channel.frequency", +} + +var MACCommand_RelayConfReq_ConfigurationFieldPathsTopLevel = []string{ + "cad_periodicity", + "default_channel_index", + "second_channel", +} +var MACCommand_RelayEndDeviceConfReq_ConfigurationFieldPathsNested = []string{ + "backoff", + "mode", + "mode.always", + "mode.dynamic", + "mode.dynamic.smart_enable_level", + "mode.end_device_controlled", + "second_channel", + "second_channel.ack_offset", + "second_channel.data_rate_index", + "second_channel.frequency", + "serving_device_id", +} + +var MACCommand_RelayEndDeviceConfReq_ConfigurationFieldPathsTopLevel = []string{ + "backoff", + "mode", + "second_channel", + "serving_device_id", +} diff --git a/pkg/ttnpb/lorawan.pb.setters.fm.go b/pkg/ttnpb/lorawan.pb.setters.fm.go index cfba782da7..69b540cbae 100644 --- a/pkg/ttnpb/lorawan.pb.setters.fm.go +++ b/pkg/ttnpb/lorawan.pb.setters.fm.go @@ -1482,6 +1482,139 @@ func (dst *TxRequest) SetFields(src *TxRequest, paths ...string) error { return nil } +func (dst *RelaySecondChannel) SetFields(src *RelaySecondChannel, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "ack_offset": + if len(subs) > 0 { + return fmt.Errorf("'ack_offset' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.AckOffset = src.AckOffset + } else { + dst.AckOffset = 0 + } + case "data_rate_index": + if len(subs) > 0 { + return fmt.Errorf("'data_rate_index' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.DataRateIndex = src.DataRateIndex + } else { + dst.DataRateIndex = 0 + } + case "frequency": + if len(subs) > 0 { + return fmt.Errorf("'frequency' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Frequency = src.Frequency + } else { + var zero uint64 + dst.Frequency = zero + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *RelayUplinkForwardLimits) SetFields(src *RelayUplinkForwardLimits, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "bucket_size": + if len(subs) > 0 { + return fmt.Errorf("'bucket_size' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.BucketSize = src.BucketSize + } else { + dst.BucketSize = 0 + } + case "reload_rate": + if len(subs) > 0 { + return fmt.Errorf("'reload_rate' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.ReloadRate = src.ReloadRate + } else { + var zero uint32 + dst.ReloadRate = zero + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *RelayForwardLimits) SetFields(src *RelayForwardLimits, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "bucket_size": + if len(subs) > 0 { + return fmt.Errorf("'bucket_size' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.BucketSize = src.BucketSize + } else { + dst.BucketSize = 0 + } + case "reload_rate": + if len(subs) > 0 { + return fmt.Errorf("'reload_rate' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.ReloadRate = src.ReloadRate + } else { + var zero uint32 + dst.ReloadRate = zero + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *RelayEndDeviceAlwaysMode) SetFields(src *RelayEndDeviceAlwaysMode, paths ...string) error { + if len(paths) != 0 { + return fmt.Errorf("message RelayEndDeviceAlwaysMode has no fields, but paths %s were specified", paths) + } + return nil +} + +func (dst *RelayEndDeviceDynamicMode) SetFields(src *RelayEndDeviceDynamicMode, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "smart_enable_level": + if len(subs) > 0 { + return fmt.Errorf("'smart_enable_level' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.SmartEnableLevel = src.SmartEnableLevel + } else { + dst.SmartEnableLevel = 0 + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *RelayEndDeviceControlledMode) SetFields(src *RelayEndDeviceControlledMode, paths ...string) error { + if len(paths) != 0 { + return fmt.Errorf("message RelayEndDeviceControlledMode has no fields, but paths %s were specified", paths) + } + return nil +} + func (dst *MACCommand) SetFields(src *MACCommand, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { @@ -2610,172 +2743,999 @@ func (dst *MACCommand) SetFields(src *MACCommand, paths ...string) error { dst.Payload = nil } } - - default: - return fmt.Errorf("invalid oneof field: '%s.%s'", name, oneofName) - } - } - - default: - return fmt.Errorf("invalid field: '%s'", name) - } - } - return nil -} - -func (dst *MACCommands) SetFields(src *MACCommands, paths ...string) error { - for name, subs := range _processPaths(paths) { - switch name { - case "commands": - if len(subs) > 0 { - return fmt.Errorf("'commands' has no subfields, but %s were specified", subs) - } - if src != nil { - dst.Commands = src.Commands - } else { - dst.Commands = nil - } - - default: - return fmt.Errorf("invalid field: '%s'", name) - } - } - return nil -} - -func (dst *FrequencyValue) SetFields(src *FrequencyValue, paths ...string) error { - for name, subs := range _processPaths(paths) { - switch name { - case "value": - if len(subs) > 0 { - return fmt.Errorf("'value' has no subfields, but %s were specified", subs) - } - if src != nil { - dst.Value = src.Value - } else { - var zero uint64 - dst.Value = zero - } - - default: - return fmt.Errorf("invalid field: '%s'", name) - } - } - return nil -} - -func (dst *ZeroableFrequencyValue) SetFields(src *ZeroableFrequencyValue, paths ...string) error { - for name, subs := range _processPaths(paths) { - switch name { - case "value": - if len(subs) > 0 { - return fmt.Errorf("'value' has no subfields, but %s were specified", subs) - } - if src != nil { - dst.Value = src.Value - } else { - var zero uint64 - dst.Value = zero - } - - default: - return fmt.Errorf("invalid field: '%s'", name) - } - } - return nil -} - -func (dst *DataRateOffsetValue) SetFields(src *DataRateOffsetValue, paths ...string) error { - for name, subs := range _processPaths(paths) { - switch name { - case "value": - if len(subs) > 0 { - return fmt.Errorf("'value' has no subfields, but %s were specified", subs) - } - if src != nil { - dst.Value = src.Value - } else { - dst.Value = 0 - } - - default: - return fmt.Errorf("invalid field: '%s'", name) - } - } - return nil -} - -func (dst *DataRateIndexValue) SetFields(src *DataRateIndexValue, paths ...string) error { - for name, subs := range _processPaths(paths) { - switch name { - case "value": - if len(subs) > 0 { - return fmt.Errorf("'value' has no subfields, but %s were specified", subs) - } - if src != nil { - dst.Value = src.Value - } else { - dst.Value = 0 - } - - default: - return fmt.Errorf("invalid field: '%s'", name) - } - } - return nil -} - -func (dst *PingSlotPeriodValue) SetFields(src *PingSlotPeriodValue, paths ...string) error { - for name, subs := range _processPaths(paths) { - switch name { - case "value": - if len(subs) > 0 { - return fmt.Errorf("'value' has no subfields, but %s were specified", subs) - } - if src != nil { - dst.Value = src.Value - } else { - dst.Value = 0 - } - - default: - return fmt.Errorf("invalid field: '%s'", name) - } - } - return nil -} - -func (dst *AggregatedDutyCycleValue) SetFields(src *AggregatedDutyCycleValue, paths ...string) error { - for name, subs := range _processPaths(paths) { - switch name { - case "value": - if len(subs) > 0 { - return fmt.Errorf("'value' has no subfields, but %s were specified", subs) - } - if src != nil { - dst.Value = src.Value - } else { - dst.Value = 0 - } - - default: - return fmt.Errorf("invalid field: '%s'", name) - } - } - return nil -} - -func (dst *RxDelayValue) SetFields(src *RxDelayValue, paths ...string) error { - for name, subs := range _processPaths(paths) { + case "relay_conf_req": + var srcTypeOk bool + if src != nil { + _, srcTypeOk = src.Payload.(*MACCommand_RelayConfReq_) + } + if srcValid := srcTypeOk || src == nil || src.Payload == nil || len(oneofSubs) == 0; !srcValid { + return fmt.Errorf("attempt to set oneof 'relay_conf_req', while different oneof is set in source") + } + _, dstTypeOk := dst.Payload.(*MACCommand_RelayConfReq_) + if dstValid := dstTypeOk || dst.Payload == nil || len(oneofSubs) == 0; !dstValid { + return fmt.Errorf("attempt to set oneof 'relay_conf_req', while different oneof is set in destination") + } + if len(oneofSubs) > 0 { + var newDst, newSrc *MACCommand_RelayConfReq + if srcTypeOk { + newSrc = src.Payload.(*MACCommand_RelayConfReq_).RelayConfReq + } + if dstTypeOk { + newDst = dst.Payload.(*MACCommand_RelayConfReq_).RelayConfReq + } else if srcTypeOk { + newDst = &MACCommand_RelayConfReq{} + dst.Payload = &MACCommand_RelayConfReq_{RelayConfReq: newDst} + } else { + dst.Payload = nil + continue + } + if err := newDst.SetFields(newSrc, oneofSubs...); err != nil { + return err + } + } else { + if srcTypeOk { + dst.Payload = src.Payload + } else { + dst.Payload = nil + } + } + case "relay_conf_ans": + var srcTypeOk bool + if src != nil { + _, srcTypeOk = src.Payload.(*MACCommand_RelayConfAns_) + } + if srcValid := srcTypeOk || src == nil || src.Payload == nil || len(oneofSubs) == 0; !srcValid { + return fmt.Errorf("attempt to set oneof 'relay_conf_ans', while different oneof is set in source") + } + _, dstTypeOk := dst.Payload.(*MACCommand_RelayConfAns_) + if dstValid := dstTypeOk || dst.Payload == nil || len(oneofSubs) == 0; !dstValid { + return fmt.Errorf("attempt to set oneof 'relay_conf_ans', while different oneof is set in destination") + } + if len(oneofSubs) > 0 { + var newDst, newSrc *MACCommand_RelayConfAns + if srcTypeOk { + newSrc = src.Payload.(*MACCommand_RelayConfAns_).RelayConfAns + } + if dstTypeOk { + newDst = dst.Payload.(*MACCommand_RelayConfAns_).RelayConfAns + } else if srcTypeOk { + newDst = &MACCommand_RelayConfAns{} + dst.Payload = &MACCommand_RelayConfAns_{RelayConfAns: newDst} + } else { + dst.Payload = nil + continue + } + if err := newDst.SetFields(newSrc, oneofSubs...); err != nil { + return err + } + } else { + if srcTypeOk { + dst.Payload = src.Payload + } else { + dst.Payload = nil + } + } + case "relay_end_device_conf_req": + var srcTypeOk bool + if src != nil { + _, srcTypeOk = src.Payload.(*MACCommand_RelayEndDeviceConfReq_) + } + if srcValid := srcTypeOk || src == nil || src.Payload == nil || len(oneofSubs) == 0; !srcValid { + return fmt.Errorf("attempt to set oneof 'relay_end_device_conf_req', while different oneof is set in source") + } + _, dstTypeOk := dst.Payload.(*MACCommand_RelayEndDeviceConfReq_) + if dstValid := dstTypeOk || dst.Payload == nil || len(oneofSubs) == 0; !dstValid { + return fmt.Errorf("attempt to set oneof 'relay_end_device_conf_req', while different oneof is set in destination") + } + if len(oneofSubs) > 0 { + var newDst, newSrc *MACCommand_RelayEndDeviceConfReq + if srcTypeOk { + newSrc = src.Payload.(*MACCommand_RelayEndDeviceConfReq_).RelayEndDeviceConfReq + } + if dstTypeOk { + newDst = dst.Payload.(*MACCommand_RelayEndDeviceConfReq_).RelayEndDeviceConfReq + } else if srcTypeOk { + newDst = &MACCommand_RelayEndDeviceConfReq{} + dst.Payload = &MACCommand_RelayEndDeviceConfReq_{RelayEndDeviceConfReq: newDst} + } else { + dst.Payload = nil + continue + } + if err := newDst.SetFields(newSrc, oneofSubs...); err != nil { + return err + } + } else { + if srcTypeOk { + dst.Payload = src.Payload + } else { + dst.Payload = nil + } + } + case "relay_end_device_conf_ans": + var srcTypeOk bool + if src != nil { + _, srcTypeOk = src.Payload.(*MACCommand_RelayEndDeviceConfAns_) + } + if srcValid := srcTypeOk || src == nil || src.Payload == nil || len(oneofSubs) == 0; !srcValid { + return fmt.Errorf("attempt to set oneof 'relay_end_device_conf_ans', while different oneof is set in source") + } + _, dstTypeOk := dst.Payload.(*MACCommand_RelayEndDeviceConfAns_) + if dstValid := dstTypeOk || dst.Payload == nil || len(oneofSubs) == 0; !dstValid { + return fmt.Errorf("attempt to set oneof 'relay_end_device_conf_ans', while different oneof is set in destination") + } + if len(oneofSubs) > 0 { + var newDst, newSrc *MACCommand_RelayEndDeviceConfAns + if srcTypeOk { + newSrc = src.Payload.(*MACCommand_RelayEndDeviceConfAns_).RelayEndDeviceConfAns + } + if dstTypeOk { + newDst = dst.Payload.(*MACCommand_RelayEndDeviceConfAns_).RelayEndDeviceConfAns + } else if srcTypeOk { + newDst = &MACCommand_RelayEndDeviceConfAns{} + dst.Payload = &MACCommand_RelayEndDeviceConfAns_{RelayEndDeviceConfAns: newDst} + } else { + dst.Payload = nil + continue + } + if err := newDst.SetFields(newSrc, oneofSubs...); err != nil { + return err + } + } else { + if srcTypeOk { + dst.Payload = src.Payload + } else { + dst.Payload = nil + } + } + case "relay_update_uplink_list_req": + var srcTypeOk bool + if src != nil { + _, srcTypeOk = src.Payload.(*MACCommand_RelayUpdateUplinkListReq_) + } + if srcValid := srcTypeOk || src == nil || src.Payload == nil || len(oneofSubs) == 0; !srcValid { + return fmt.Errorf("attempt to set oneof 'relay_update_uplink_list_req', while different oneof is set in source") + } + _, dstTypeOk := dst.Payload.(*MACCommand_RelayUpdateUplinkListReq_) + if dstValid := dstTypeOk || dst.Payload == nil || len(oneofSubs) == 0; !dstValid { + return fmt.Errorf("attempt to set oneof 'relay_update_uplink_list_req', while different oneof is set in destination") + } + if len(oneofSubs) > 0 { + var newDst, newSrc *MACCommand_RelayUpdateUplinkListReq + if srcTypeOk { + newSrc = src.Payload.(*MACCommand_RelayUpdateUplinkListReq_).RelayUpdateUplinkListReq + } + if dstTypeOk { + newDst = dst.Payload.(*MACCommand_RelayUpdateUplinkListReq_).RelayUpdateUplinkListReq + } else if srcTypeOk { + newDst = &MACCommand_RelayUpdateUplinkListReq{} + dst.Payload = &MACCommand_RelayUpdateUplinkListReq_{RelayUpdateUplinkListReq: newDst} + } else { + dst.Payload = nil + continue + } + if err := newDst.SetFields(newSrc, oneofSubs...); err != nil { + return err + } + } else { + if srcTypeOk { + dst.Payload = src.Payload + } else { + dst.Payload = nil + } + } + case "relay_update_uplink_list_ans": + var srcTypeOk bool + if src != nil { + _, srcTypeOk = src.Payload.(*MACCommand_RelayUpdateUplinkListAns_) + } + if srcValid := srcTypeOk || src == nil || src.Payload == nil || len(oneofSubs) == 0; !srcValid { + return fmt.Errorf("attempt to set oneof 'relay_update_uplink_list_ans', while different oneof is set in source") + } + _, dstTypeOk := dst.Payload.(*MACCommand_RelayUpdateUplinkListAns_) + if dstValid := dstTypeOk || dst.Payload == nil || len(oneofSubs) == 0; !dstValid { + return fmt.Errorf("attempt to set oneof 'relay_update_uplink_list_ans', while different oneof is set in destination") + } + if len(oneofSubs) > 0 { + var newDst, newSrc *MACCommand_RelayUpdateUplinkListAns + if srcTypeOk { + newSrc = src.Payload.(*MACCommand_RelayUpdateUplinkListAns_).RelayUpdateUplinkListAns + } + if dstTypeOk { + newDst = dst.Payload.(*MACCommand_RelayUpdateUplinkListAns_).RelayUpdateUplinkListAns + } else if srcTypeOk { + newDst = &MACCommand_RelayUpdateUplinkListAns{} + dst.Payload = &MACCommand_RelayUpdateUplinkListAns_{RelayUpdateUplinkListAns: newDst} + } else { + dst.Payload = nil + continue + } + if err := newDst.SetFields(newSrc, oneofSubs...); err != nil { + return err + } + } else { + if srcTypeOk { + dst.Payload = src.Payload + } else { + dst.Payload = nil + } + } + case "relay_ctrl_uplink_list_req": + var srcTypeOk bool + if src != nil { + _, srcTypeOk = src.Payload.(*MACCommand_RelayCtrlUplinkListReq_) + } + if srcValid := srcTypeOk || src == nil || src.Payload == nil || len(oneofSubs) == 0; !srcValid { + return fmt.Errorf("attempt to set oneof 'relay_ctrl_uplink_list_req', while different oneof is set in source") + } + _, dstTypeOk := dst.Payload.(*MACCommand_RelayCtrlUplinkListReq_) + if dstValid := dstTypeOk || dst.Payload == nil || len(oneofSubs) == 0; !dstValid { + return fmt.Errorf("attempt to set oneof 'relay_ctrl_uplink_list_req', while different oneof is set in destination") + } + if len(oneofSubs) > 0 { + var newDst, newSrc *MACCommand_RelayCtrlUplinkListReq + if srcTypeOk { + newSrc = src.Payload.(*MACCommand_RelayCtrlUplinkListReq_).RelayCtrlUplinkListReq + } + if dstTypeOk { + newDst = dst.Payload.(*MACCommand_RelayCtrlUplinkListReq_).RelayCtrlUplinkListReq + } else if srcTypeOk { + newDst = &MACCommand_RelayCtrlUplinkListReq{} + dst.Payload = &MACCommand_RelayCtrlUplinkListReq_{RelayCtrlUplinkListReq: newDst} + } else { + dst.Payload = nil + continue + } + if err := newDst.SetFields(newSrc, oneofSubs...); err != nil { + return err + } + } else { + if srcTypeOk { + dst.Payload = src.Payload + } else { + dst.Payload = nil + } + } + case "relay_ctrl_uplink_list_ans": + var srcTypeOk bool + if src != nil { + _, srcTypeOk = src.Payload.(*MACCommand_RelayCtrlUplinkListAns_) + } + if srcValid := srcTypeOk || src == nil || src.Payload == nil || len(oneofSubs) == 0; !srcValid { + return fmt.Errorf("attempt to set oneof 'relay_ctrl_uplink_list_ans', while different oneof is set in source") + } + _, dstTypeOk := dst.Payload.(*MACCommand_RelayCtrlUplinkListAns_) + if dstValid := dstTypeOk || dst.Payload == nil || len(oneofSubs) == 0; !dstValid { + return fmt.Errorf("attempt to set oneof 'relay_ctrl_uplink_list_ans', while different oneof is set in destination") + } + if len(oneofSubs) > 0 { + var newDst, newSrc *MACCommand_RelayCtrlUplinkListAns + if srcTypeOk { + newSrc = src.Payload.(*MACCommand_RelayCtrlUplinkListAns_).RelayCtrlUplinkListAns + } + if dstTypeOk { + newDst = dst.Payload.(*MACCommand_RelayCtrlUplinkListAns_).RelayCtrlUplinkListAns + } else if srcTypeOk { + newDst = &MACCommand_RelayCtrlUplinkListAns{} + dst.Payload = &MACCommand_RelayCtrlUplinkListAns_{RelayCtrlUplinkListAns: newDst} + } else { + dst.Payload = nil + continue + } + if err := newDst.SetFields(newSrc, oneofSubs...); err != nil { + return err + } + } else { + if srcTypeOk { + dst.Payload = src.Payload + } else { + dst.Payload = nil + } + } + case "relay_configure_fwd_limit_req": + var srcTypeOk bool + if src != nil { + _, srcTypeOk = src.Payload.(*MACCommand_RelayConfigureFwdLimitReq_) + } + if srcValid := srcTypeOk || src == nil || src.Payload == nil || len(oneofSubs) == 0; !srcValid { + return fmt.Errorf("attempt to set oneof 'relay_configure_fwd_limit_req', while different oneof is set in source") + } + _, dstTypeOk := dst.Payload.(*MACCommand_RelayConfigureFwdLimitReq_) + if dstValid := dstTypeOk || dst.Payload == nil || len(oneofSubs) == 0; !dstValid { + return fmt.Errorf("attempt to set oneof 'relay_configure_fwd_limit_req', while different oneof is set in destination") + } + if len(oneofSubs) > 0 { + var newDst, newSrc *MACCommand_RelayConfigureFwdLimitReq + if srcTypeOk { + newSrc = src.Payload.(*MACCommand_RelayConfigureFwdLimitReq_).RelayConfigureFwdLimitReq + } + if dstTypeOk { + newDst = dst.Payload.(*MACCommand_RelayConfigureFwdLimitReq_).RelayConfigureFwdLimitReq + } else if srcTypeOk { + newDst = &MACCommand_RelayConfigureFwdLimitReq{} + dst.Payload = &MACCommand_RelayConfigureFwdLimitReq_{RelayConfigureFwdLimitReq: newDst} + } else { + dst.Payload = nil + continue + } + if err := newDst.SetFields(newSrc, oneofSubs...); err != nil { + return err + } + } else { + if srcTypeOk { + dst.Payload = src.Payload + } else { + dst.Payload = nil + } + } + case "relay_configure_fwd_limit_ans": + var srcTypeOk bool + if src != nil { + _, srcTypeOk = src.Payload.(*MACCommand_RelayConfigureFwdLimitAns_) + } + if srcValid := srcTypeOk || src == nil || src.Payload == nil || len(oneofSubs) == 0; !srcValid { + return fmt.Errorf("attempt to set oneof 'relay_configure_fwd_limit_ans', while different oneof is set in source") + } + _, dstTypeOk := dst.Payload.(*MACCommand_RelayConfigureFwdLimitAns_) + if dstValid := dstTypeOk || dst.Payload == nil || len(oneofSubs) == 0; !dstValid { + return fmt.Errorf("attempt to set oneof 'relay_configure_fwd_limit_ans', while different oneof is set in destination") + } + if len(oneofSubs) > 0 { + var newDst, newSrc *MACCommand_RelayConfigureFwdLimitAns + if srcTypeOk { + newSrc = src.Payload.(*MACCommand_RelayConfigureFwdLimitAns_).RelayConfigureFwdLimitAns + } + if dstTypeOk { + newDst = dst.Payload.(*MACCommand_RelayConfigureFwdLimitAns_).RelayConfigureFwdLimitAns + } else if srcTypeOk { + newDst = &MACCommand_RelayConfigureFwdLimitAns{} + dst.Payload = &MACCommand_RelayConfigureFwdLimitAns_{RelayConfigureFwdLimitAns: newDst} + } else { + dst.Payload = nil + continue + } + if err := newDst.SetFields(newSrc, oneofSubs...); err != nil { + return err + } + } else { + if srcTypeOk { + dst.Payload = src.Payload + } else { + dst.Payload = nil + } + } + case "relay_notify_new_end_device_req": + var srcTypeOk bool + if src != nil { + _, srcTypeOk = src.Payload.(*MACCommand_RelayNotifyNewEndDeviceReq_) + } + if srcValid := srcTypeOk || src == nil || src.Payload == nil || len(oneofSubs) == 0; !srcValid { + return fmt.Errorf("attempt to set oneof 'relay_notify_new_end_device_req', while different oneof is set in source") + } + _, dstTypeOk := dst.Payload.(*MACCommand_RelayNotifyNewEndDeviceReq_) + if dstValid := dstTypeOk || dst.Payload == nil || len(oneofSubs) == 0; !dstValid { + return fmt.Errorf("attempt to set oneof 'relay_notify_new_end_device_req', while different oneof is set in destination") + } + if len(oneofSubs) > 0 { + var newDst, newSrc *MACCommand_RelayNotifyNewEndDeviceReq + if srcTypeOk { + newSrc = src.Payload.(*MACCommand_RelayNotifyNewEndDeviceReq_).RelayNotifyNewEndDeviceReq + } + if dstTypeOk { + newDst = dst.Payload.(*MACCommand_RelayNotifyNewEndDeviceReq_).RelayNotifyNewEndDeviceReq + } else if srcTypeOk { + newDst = &MACCommand_RelayNotifyNewEndDeviceReq{} + dst.Payload = &MACCommand_RelayNotifyNewEndDeviceReq_{RelayNotifyNewEndDeviceReq: newDst} + } else { + dst.Payload = nil + continue + } + if err := newDst.SetFields(newSrc, oneofSubs...); err != nil { + return err + } + } else { + if srcTypeOk { + dst.Payload = src.Payload + } else { + dst.Payload = nil + } + } + + default: + return fmt.Errorf("invalid oneof field: '%s.%s'", name, oneofName) + } + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *MACCommands) SetFields(src *MACCommands, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "commands": + if len(subs) > 0 { + return fmt.Errorf("'commands' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Commands = src.Commands + } else { + dst.Commands = nil + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *FrequencyValue) SetFields(src *FrequencyValue, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "value": + if len(subs) > 0 { + return fmt.Errorf("'value' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Value = src.Value + } else { + var zero uint64 + dst.Value = zero + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *ZeroableFrequencyValue) SetFields(src *ZeroableFrequencyValue, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "value": + if len(subs) > 0 { + return fmt.Errorf("'value' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Value = src.Value + } else { + var zero uint64 + dst.Value = zero + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *DataRateOffsetValue) SetFields(src *DataRateOffsetValue, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "value": + if len(subs) > 0 { + return fmt.Errorf("'value' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Value = src.Value + } else { + dst.Value = 0 + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *DataRateIndexValue) SetFields(src *DataRateIndexValue, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "value": + if len(subs) > 0 { + return fmt.Errorf("'value' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Value = src.Value + } else { + dst.Value = 0 + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *PingSlotPeriodValue) SetFields(src *PingSlotPeriodValue, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "value": + if len(subs) > 0 { + return fmt.Errorf("'value' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Value = src.Value + } else { + dst.Value = 0 + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *AggregatedDutyCycleValue) SetFields(src *AggregatedDutyCycleValue, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "value": + if len(subs) > 0 { + return fmt.Errorf("'value' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Value = src.Value + } else { + dst.Value = 0 + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *RxDelayValue) SetFields(src *RxDelayValue, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "value": + if len(subs) > 0 { + return fmt.Errorf("'value' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Value = src.Value + } else { + dst.Value = 0 + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *ADRAckLimitExponentValue) SetFields(src *ADRAckLimitExponentValue, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "value": + if len(subs) > 0 { + return fmt.Errorf("'value' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Value = src.Value + } else { + dst.Value = 0 + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *ADRAckDelayExponentValue) SetFields(src *ADRAckDelayExponentValue, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "value": + if len(subs) > 0 { + return fmt.Errorf("'value' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Value = src.Value + } else { + dst.Value = 0 + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *DeviceEIRPValue) SetFields(src *DeviceEIRPValue, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "value": + if len(subs) > 0 { + return fmt.Errorf("'value' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Value = src.Value + } else { + dst.Value = 0 + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *RelayForwardUplinkReq) SetFields(src *RelayForwardUplinkReq, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "data_rate": + if len(subs) > 0 { + var newDst, newSrc *DataRate + if (src == nil || src.DataRate == nil) && dst.DataRate == nil { + continue + } + if src != nil { + newSrc = src.DataRate + } + if dst.DataRate != nil { + newDst = dst.DataRate + } else { + newDst = &DataRate{} + dst.DataRate = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.DataRate = src.DataRate + } else { + dst.DataRate = nil + } + } + case "snr": + if len(subs) > 0 { + return fmt.Errorf("'snr' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Snr = src.Snr + } else { + var zero int32 + dst.Snr = zero + } + case "rssi": + if len(subs) > 0 { + return fmt.Errorf("'rssi' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Rssi = src.Rssi + } else { + var zero int32 + dst.Rssi = zero + } + case "wor_channel": + if len(subs) > 0 { + return fmt.Errorf("'wor_channel' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.WorChannel = src.WorChannel + } else { + dst.WorChannel = 0 + } + case "frequency": + if len(subs) > 0 { + return fmt.Errorf("'frequency' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Frequency = src.Frequency + } else { + var zero uint64 + dst.Frequency = zero + } + case "raw_payload": + if len(subs) > 0 { + return fmt.Errorf("'raw_payload' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.RawPayload = src.RawPayload + } else { + dst.RawPayload = nil + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *RelayForwardDownlinkReq) SetFields(src *RelayForwardDownlinkReq, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "raw_payload": + if len(subs) > 0 { + return fmt.Errorf("'raw_payload' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.RawPayload = src.RawPayload + } else { + dst.RawPayload = nil + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *RelayUplinkToken) SetFields(src *RelayUplinkToken, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "ids": + if len(subs) > 0 { + var newDst, newSrc *EndDeviceIdentifiers + if (src == nil || src.Ids == nil) && dst.Ids == nil { + continue + } + if src != nil { + newSrc = src.Ids + } + if dst.Ids != nil { + newDst = dst.Ids + } else { + newDst = &EndDeviceIdentifiers{} + dst.Ids = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.Ids = src.Ids + } else { + dst.Ids = nil + } + } + case "session_key_id": + if len(subs) > 0 { + return fmt.Errorf("'session_key_id' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.SessionKeyId = src.SessionKeyId + } else { + dst.SessionKeyId = nil + } + case "full_f_cnt": + if len(subs) > 0 { + return fmt.Errorf("'full_f_cnt' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.FullFCnt = src.FullFCnt + } else { + var zero uint32 + dst.FullFCnt = zero + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *TxSettings_Downlink) SetFields(src *TxSettings_Downlink, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "antenna_index": + if len(subs) > 0 { + return fmt.Errorf("'antenna_index' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.AntennaIndex = src.AntennaIndex + } else { + var zero uint32 + dst.AntennaIndex = zero + } + case "tx_power": + if len(subs) > 0 { + return fmt.Errorf("'tx_power' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.TxPower = src.TxPower + } else { + var zero float32 + dst.TxPower = zero + } + case "invert_polarization": + if len(subs) > 0 { + return fmt.Errorf("'invert_polarization' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.InvertPolarization = src.InvertPolarization + } else { + var zero bool + dst.InvertPolarization = zero + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *MACCommand_ResetInd) SetFields(src *MACCommand_ResetInd, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "minor_version": + if len(subs) > 0 { + return fmt.Errorf("'minor_version' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.MinorVersion = src.MinorVersion + } else { + dst.MinorVersion = 0 + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *MACCommand_ResetConf) SetFields(src *MACCommand_ResetConf, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "minor_version": + if len(subs) > 0 { + return fmt.Errorf("'minor_version' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.MinorVersion = src.MinorVersion + } else { + dst.MinorVersion = 0 + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *MACCommand_LinkCheckAns) SetFields(src *MACCommand_LinkCheckAns, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "margin": + if len(subs) > 0 { + return fmt.Errorf("'margin' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Margin = src.Margin + } else { + var zero uint32 + dst.Margin = zero + } + case "gateway_count": + if len(subs) > 0 { + return fmt.Errorf("'gateway_count' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.GatewayCount = src.GatewayCount + } else { + var zero uint32 + dst.GatewayCount = zero + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *MACCommand_LinkADRReq) SetFields(src *MACCommand_LinkADRReq, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "data_rate_index": + if len(subs) > 0 { + return fmt.Errorf("'data_rate_index' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.DataRateIndex = src.DataRateIndex + } else { + dst.DataRateIndex = 0 + } + case "tx_power_index": + if len(subs) > 0 { + return fmt.Errorf("'tx_power_index' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.TxPowerIndex = src.TxPowerIndex + } else { + var zero uint32 + dst.TxPowerIndex = zero + } + case "channel_mask": + if len(subs) > 0 { + return fmt.Errorf("'channel_mask' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.ChannelMask = src.ChannelMask + } else { + dst.ChannelMask = nil + } + case "channel_mask_control": + if len(subs) > 0 { + return fmt.Errorf("'channel_mask_control' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.ChannelMaskControl = src.ChannelMaskControl + } else { + var zero uint32 + dst.ChannelMaskControl = zero + } + case "nb_trans": + if len(subs) > 0 { + return fmt.Errorf("'nb_trans' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.NbTrans = src.NbTrans + } else { + var zero uint32 + dst.NbTrans = zero + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *MACCommand_LinkADRAns) SetFields(src *MACCommand_LinkADRAns, paths ...string) error { + for name, subs := range _processPaths(paths) { switch name { - case "value": + case "channel_mask_ack": if len(subs) > 0 { - return fmt.Errorf("'value' has no subfields, but %s were specified", subs) + return fmt.Errorf("'channel_mask_ack' has no subfields, but %s were specified", subs) } if src != nil { - dst.Value = src.Value + dst.ChannelMaskAck = src.ChannelMaskAck } else { - dst.Value = 0 + var zero bool + dst.ChannelMaskAck = zero + } + case "data_rate_index_ack": + if len(subs) > 0 { + return fmt.Errorf("'data_rate_index_ack' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.DataRateIndexAck = src.DataRateIndexAck + } else { + var zero bool + dst.DataRateIndexAck = zero + } + case "tx_power_index_ack": + if len(subs) > 0 { + return fmt.Errorf("'tx_power_index_ack' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.TxPowerIndexAck = src.TxPowerIndexAck + } else { + var zero bool + dst.TxPowerIndexAck = zero } default: @@ -2785,17 +3745,17 @@ func (dst *RxDelayValue) SetFields(src *RxDelayValue, paths ...string) error { return nil } -func (dst *ADRAckLimitExponentValue) SetFields(src *ADRAckLimitExponentValue, paths ...string) error { +func (dst *MACCommand_DutyCycleReq) SetFields(src *MACCommand_DutyCycleReq, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "value": + case "max_duty_cycle": if len(subs) > 0 { - return fmt.Errorf("'value' has no subfields, but %s were specified", subs) + return fmt.Errorf("'max_duty_cycle' has no subfields, but %s were specified", subs) } if src != nil { - dst.Value = src.Value + dst.MaxDutyCycle = src.MaxDutyCycle } else { - dst.Value = 0 + dst.MaxDutyCycle = 0 } default: @@ -2805,17 +3765,36 @@ func (dst *ADRAckLimitExponentValue) SetFields(src *ADRAckLimitExponentValue, pa return nil } -func (dst *ADRAckDelayExponentValue) SetFields(src *ADRAckDelayExponentValue, paths ...string) error { +func (dst *MACCommand_RxParamSetupReq) SetFields(src *MACCommand_RxParamSetupReq, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "value": + case "rx2_data_rate_index": if len(subs) > 0 { - return fmt.Errorf("'value' has no subfields, but %s were specified", subs) + return fmt.Errorf("'rx2_data_rate_index' has no subfields, but %s were specified", subs) } if src != nil { - dst.Value = src.Value + dst.Rx2DataRateIndex = src.Rx2DataRateIndex } else { - dst.Value = 0 + dst.Rx2DataRateIndex = 0 + } + case "rx1_data_rate_offset": + if len(subs) > 0 { + return fmt.Errorf("'rx1_data_rate_offset' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Rx1DataRateOffset = src.Rx1DataRateOffset + } else { + dst.Rx1DataRateOffset = 0 + } + case "rx2_frequency": + if len(subs) > 0 { + return fmt.Errorf("'rx2_frequency' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Rx2Frequency = src.Rx2Frequency + } else { + var zero uint64 + dst.Rx2Frequency = zero } default: @@ -2825,17 +3804,38 @@ func (dst *ADRAckDelayExponentValue) SetFields(src *ADRAckDelayExponentValue, pa return nil } -func (dst *DeviceEIRPValue) SetFields(src *DeviceEIRPValue, paths ...string) error { +func (dst *MACCommand_RxParamSetupAns) SetFields(src *MACCommand_RxParamSetupAns, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "value": + case "rx2_data_rate_index_ack": if len(subs) > 0 { - return fmt.Errorf("'value' has no subfields, but %s were specified", subs) + return fmt.Errorf("'rx2_data_rate_index_ack' has no subfields, but %s were specified", subs) } if src != nil { - dst.Value = src.Value + dst.Rx2DataRateIndexAck = src.Rx2DataRateIndexAck } else { - dst.Value = 0 + var zero bool + dst.Rx2DataRateIndexAck = zero + } + case "rx1_data_rate_offset_ack": + if len(subs) > 0 { + return fmt.Errorf("'rx1_data_rate_offset_ack' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Rx1DataRateOffsetAck = src.Rx1DataRateOffsetAck + } else { + var zero bool + dst.Rx1DataRateOffsetAck = zero + } + case "rx2_frequency_ack": + if len(subs) > 0 { + return fmt.Errorf("'rx2_frequency_ack' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Rx2FrequencyAck = src.Rx2FrequencyAck + } else { + var zero bool + dst.Rx2FrequencyAck = zero } default: @@ -2845,38 +3845,77 @@ func (dst *DeviceEIRPValue) SetFields(src *DeviceEIRPValue, paths ...string) err return nil } -func (dst *TxSettings_Downlink) SetFields(src *TxSettings_Downlink, paths ...string) error { +func (dst *MACCommand_DevStatusAns) SetFields(src *MACCommand_DevStatusAns, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "antenna_index": + case "battery": if len(subs) > 0 { - return fmt.Errorf("'antenna_index' has no subfields, but %s were specified", subs) + return fmt.Errorf("'battery' has no subfields, but %s were specified", subs) } if src != nil { - dst.AntennaIndex = src.AntennaIndex + dst.Battery = src.Battery } else { var zero uint32 - dst.AntennaIndex = zero + dst.Battery = zero } - case "tx_power": + case "margin": if len(subs) > 0 { - return fmt.Errorf("'tx_power' has no subfields, but %s were specified", subs) + return fmt.Errorf("'margin' has no subfields, but %s were specified", subs) } if src != nil { - dst.TxPower = src.TxPower + dst.Margin = src.Margin } else { - var zero float32 - dst.TxPower = zero + var zero int32 + dst.Margin = zero } - case "invert_polarization": + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *MACCommand_NewChannelReq) SetFields(src *MACCommand_NewChannelReq, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "channel_index": if len(subs) > 0 { - return fmt.Errorf("'invert_polarization' has no subfields, but %s were specified", subs) + return fmt.Errorf("'channel_index' has no subfields, but %s were specified", subs) } if src != nil { - dst.InvertPolarization = src.InvertPolarization + dst.ChannelIndex = src.ChannelIndex } else { - var zero bool - dst.InvertPolarization = zero + var zero uint32 + dst.ChannelIndex = zero + } + case "frequency": + if len(subs) > 0 { + return fmt.Errorf("'frequency' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Frequency = src.Frequency + } else { + var zero uint64 + dst.Frequency = zero + } + case "min_data_rate_index": + if len(subs) > 0 { + return fmt.Errorf("'min_data_rate_index' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.MinDataRateIndex = src.MinDataRateIndex + } else { + dst.MinDataRateIndex = 0 + } + case "max_data_rate_index": + if len(subs) > 0 { + return fmt.Errorf("'max_data_rate_index' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.MaxDataRateIndex = src.MaxDataRateIndex + } else { + dst.MaxDataRateIndex = 0 } default: @@ -2886,17 +3925,28 @@ func (dst *TxSettings_Downlink) SetFields(src *TxSettings_Downlink, paths ...str return nil } -func (dst *MACCommand_ResetInd) SetFields(src *MACCommand_ResetInd, paths ...string) error { +func (dst *MACCommand_NewChannelAns) SetFields(src *MACCommand_NewChannelAns, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "minor_version": + case "frequency_ack": if len(subs) > 0 { - return fmt.Errorf("'minor_version' has no subfields, but %s were specified", subs) + return fmt.Errorf("'frequency_ack' has no subfields, but %s were specified", subs) } if src != nil { - dst.MinorVersion = src.MinorVersion + dst.FrequencyAck = src.FrequencyAck } else { - dst.MinorVersion = 0 + var zero bool + dst.FrequencyAck = zero + } + case "data_rate_ack": + if len(subs) > 0 { + return fmt.Errorf("'data_rate_ack' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.DataRateAck = src.DataRateAck + } else { + var zero bool + dst.DataRateAck = zero } default: @@ -2906,17 +3956,28 @@ func (dst *MACCommand_ResetInd) SetFields(src *MACCommand_ResetInd, paths ...str return nil } -func (dst *MACCommand_ResetConf) SetFields(src *MACCommand_ResetConf, paths ...string) error { +func (dst *MACCommand_DLChannelReq) SetFields(src *MACCommand_DLChannelReq, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "minor_version": + case "channel_index": if len(subs) > 0 { - return fmt.Errorf("'minor_version' has no subfields, but %s were specified", subs) + return fmt.Errorf("'channel_index' has no subfields, but %s were specified", subs) } if src != nil { - dst.MinorVersion = src.MinorVersion + dst.ChannelIndex = src.ChannelIndex } else { - dst.MinorVersion = 0 + var zero uint32 + dst.ChannelIndex = zero + } + case "frequency": + if len(subs) > 0 { + return fmt.Errorf("'frequency' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Frequency = src.Frequency + } else { + var zero uint64 + dst.Frequency = zero } default: @@ -2926,28 +3987,28 @@ func (dst *MACCommand_ResetConf) SetFields(src *MACCommand_ResetConf, paths ...s return nil } -func (dst *MACCommand_LinkCheckAns) SetFields(src *MACCommand_LinkCheckAns, paths ...string) error { +func (dst *MACCommand_DLChannelAns) SetFields(src *MACCommand_DLChannelAns, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "margin": + case "channel_index_ack": if len(subs) > 0 { - return fmt.Errorf("'margin' has no subfields, but %s were specified", subs) + return fmt.Errorf("'channel_index_ack' has no subfields, but %s were specified", subs) } if src != nil { - dst.Margin = src.Margin + dst.ChannelIndexAck = src.ChannelIndexAck } else { - var zero uint32 - dst.Margin = zero + var zero bool + dst.ChannelIndexAck = zero } - case "gateway_count": + case "frequency_ack": if len(subs) > 0 { - return fmt.Errorf("'gateway_count' has no subfields, but %s were specified", subs) + return fmt.Errorf("'frequency_ack' has no subfields, but %s were specified", subs) } if src != nil { - dst.GatewayCount = src.GatewayCount + dst.FrequencyAck = src.FrequencyAck } else { - var zero uint32 - dst.GatewayCount = zero + var zero bool + dst.FrequencyAck = zero } default: @@ -2957,56 +4018,77 @@ func (dst *MACCommand_LinkCheckAns) SetFields(src *MACCommand_LinkCheckAns, path return nil } -func (dst *MACCommand_LinkADRReq) SetFields(src *MACCommand_LinkADRReq, paths ...string) error { +func (dst *MACCommand_RxTimingSetupReq) SetFields(src *MACCommand_RxTimingSetupReq, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "data_rate_index": + case "delay": if len(subs) > 0 { - return fmt.Errorf("'data_rate_index' has no subfields, but %s were specified", subs) + return fmt.Errorf("'delay' has no subfields, but %s were specified", subs) } if src != nil { - dst.DataRateIndex = src.DataRateIndex + dst.Delay = src.Delay } else { - dst.DataRateIndex = 0 + dst.Delay = 0 } - case "tx_power_index": + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *MACCommand_TxParamSetupReq) SetFields(src *MACCommand_TxParamSetupReq, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "max_eirp_index": if len(subs) > 0 { - return fmt.Errorf("'tx_power_index' has no subfields, but %s were specified", subs) + return fmt.Errorf("'max_eirp_index' has no subfields, but %s were specified", subs) } if src != nil { - dst.TxPowerIndex = src.TxPowerIndex + dst.MaxEirpIndex = src.MaxEirpIndex } else { - var zero uint32 - dst.TxPowerIndex = zero + dst.MaxEirpIndex = 0 } - case "channel_mask": + case "uplink_dwell_time": if len(subs) > 0 { - return fmt.Errorf("'channel_mask' has no subfields, but %s were specified", subs) + return fmt.Errorf("'uplink_dwell_time' has no subfields, but %s were specified", subs) } if src != nil { - dst.ChannelMask = src.ChannelMask + dst.UplinkDwellTime = src.UplinkDwellTime } else { - dst.ChannelMask = nil + var zero bool + dst.UplinkDwellTime = zero } - case "channel_mask_control": + case "downlink_dwell_time": if len(subs) > 0 { - return fmt.Errorf("'channel_mask_control' has no subfields, but %s were specified", subs) + return fmt.Errorf("'downlink_dwell_time' has no subfields, but %s were specified", subs) } if src != nil { - dst.ChannelMaskControl = src.ChannelMaskControl + dst.DownlinkDwellTime = src.DownlinkDwellTime } else { - var zero uint32 - dst.ChannelMaskControl = zero + var zero bool + dst.DownlinkDwellTime = zero } - case "nb_trans": + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *MACCommand_RekeyInd) SetFields(src *MACCommand_RekeyInd, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "minor_version": if len(subs) > 0 { - return fmt.Errorf("'nb_trans' has no subfields, but %s were specified", subs) + return fmt.Errorf("'minor_version' has no subfields, but %s were specified", subs) } if src != nil { - dst.NbTrans = src.NbTrans + dst.MinorVersion = src.MinorVersion } else { - var zero uint32 - dst.NbTrans = zero + dst.MinorVersion = 0 } default: @@ -3016,38 +4098,46 @@ func (dst *MACCommand_LinkADRReq) SetFields(src *MACCommand_LinkADRReq, paths .. return nil } -func (dst *MACCommand_LinkADRAns) SetFields(src *MACCommand_LinkADRAns, paths ...string) error { +func (dst *MACCommand_RekeyConf) SetFields(src *MACCommand_RekeyConf, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "channel_mask_ack": + case "minor_version": if len(subs) > 0 { - return fmt.Errorf("'channel_mask_ack' has no subfields, but %s were specified", subs) + return fmt.Errorf("'minor_version' has no subfields, but %s were specified", subs) } if src != nil { - dst.ChannelMaskAck = src.ChannelMaskAck + dst.MinorVersion = src.MinorVersion } else { - var zero bool - dst.ChannelMaskAck = zero + dst.MinorVersion = 0 } - case "data_rate_index_ack": + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *MACCommand_ADRParamSetupReq) SetFields(src *MACCommand_ADRParamSetupReq, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "adr_ack_limit_exponent": if len(subs) > 0 { - return fmt.Errorf("'data_rate_index_ack' has no subfields, but %s were specified", subs) + return fmt.Errorf("'adr_ack_limit_exponent' has no subfields, but %s were specified", subs) } if src != nil { - dst.DataRateIndexAck = src.DataRateIndexAck + dst.AdrAckLimitExponent = src.AdrAckLimitExponent } else { - var zero bool - dst.DataRateIndexAck = zero + dst.AdrAckLimitExponent = 0 } - case "tx_power_index_ack": + case "adr_ack_delay_exponent": if len(subs) > 0 { - return fmt.Errorf("'tx_power_index_ack' has no subfields, but %s were specified", subs) + return fmt.Errorf("'adr_ack_delay_exponent' has no subfields, but %s were specified", subs) } if src != nil { - dst.TxPowerIndexAck = src.TxPowerIndexAck + dst.AdrAckDelayExponent = src.AdrAckDelayExponent } else { - var zero bool - dst.TxPowerIndexAck = zero + dst.AdrAckDelayExponent = 0 } default: @@ -3057,17 +4147,17 @@ func (dst *MACCommand_LinkADRAns) SetFields(src *MACCommand_LinkADRAns, paths .. return nil } -func (dst *MACCommand_DutyCycleReq) SetFields(src *MACCommand_DutyCycleReq, paths ...string) error { +func (dst *MACCommand_DeviceTimeAns) SetFields(src *MACCommand_DeviceTimeAns, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "max_duty_cycle": + case "time": if len(subs) > 0 { - return fmt.Errorf("'max_duty_cycle' has no subfields, but %s were specified", subs) + return fmt.Errorf("'time' has no subfields, but %s were specified", subs) } if src != nil { - dst.MaxDutyCycle = src.MaxDutyCycle + dst.Time = src.Time } else { - dst.MaxDutyCycle = 0 + dst.Time = nil } default: @@ -3077,36 +4167,45 @@ func (dst *MACCommand_DutyCycleReq) SetFields(src *MACCommand_DutyCycleReq, path return nil } -func (dst *MACCommand_RxParamSetupReq) SetFields(src *MACCommand_RxParamSetupReq, paths ...string) error { +func (dst *MACCommand_ForceRejoinReq) SetFields(src *MACCommand_ForceRejoinReq, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "rx2_data_rate_index": + case "rejoin_type": if len(subs) > 0 { - return fmt.Errorf("'rx2_data_rate_index' has no subfields, but %s were specified", subs) + return fmt.Errorf("'rejoin_type' has no subfields, but %s were specified", subs) } if src != nil { - dst.Rx2DataRateIndex = src.Rx2DataRateIndex + dst.RejoinType = src.RejoinType } else { - dst.Rx2DataRateIndex = 0 + dst.RejoinType = 0 } - case "rx1_data_rate_offset": + case "data_rate_index": if len(subs) > 0 { - return fmt.Errorf("'rx1_data_rate_offset' has no subfields, but %s were specified", subs) + return fmt.Errorf("'data_rate_index' has no subfields, but %s were specified", subs) } if src != nil { - dst.Rx1DataRateOffset = src.Rx1DataRateOffset + dst.DataRateIndex = src.DataRateIndex } else { - dst.Rx1DataRateOffset = 0 + dst.DataRateIndex = 0 } - case "rx2_frequency": + case "max_retries": if len(subs) > 0 { - return fmt.Errorf("'rx2_frequency' has no subfields, but %s were specified", subs) + return fmt.Errorf("'max_retries' has no subfields, but %s were specified", subs) } if src != nil { - dst.Rx2Frequency = src.Rx2Frequency + dst.MaxRetries = src.MaxRetries } else { - var zero uint64 - dst.Rx2Frequency = zero + var zero uint32 + dst.MaxRetries = zero + } + case "period_exponent": + if len(subs) > 0 { + return fmt.Errorf("'period_exponent' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.PeriodExponent = src.PeriodExponent + } else { + dst.PeriodExponent = 0 } default: @@ -3116,38 +4215,47 @@ func (dst *MACCommand_RxParamSetupReq) SetFields(src *MACCommand_RxParamSetupReq return nil } -func (dst *MACCommand_RxParamSetupAns) SetFields(src *MACCommand_RxParamSetupAns, paths ...string) error { +func (dst *MACCommand_RejoinParamSetupReq) SetFields(src *MACCommand_RejoinParamSetupReq, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "rx2_data_rate_index_ack": + case "max_count_exponent": if len(subs) > 0 { - return fmt.Errorf("'rx2_data_rate_index_ack' has no subfields, but %s were specified", subs) + return fmt.Errorf("'max_count_exponent' has no subfields, but %s were specified", subs) } if src != nil { - dst.Rx2DataRateIndexAck = src.Rx2DataRateIndexAck + dst.MaxCountExponent = src.MaxCountExponent } else { - var zero bool - dst.Rx2DataRateIndexAck = zero + dst.MaxCountExponent = 0 } - case "rx1_data_rate_offset_ack": + case "max_time_exponent": if len(subs) > 0 { - return fmt.Errorf("'rx1_data_rate_offset_ack' has no subfields, but %s were specified", subs) + return fmt.Errorf("'max_time_exponent' has no subfields, but %s were specified", subs) } if src != nil { - dst.Rx1DataRateOffsetAck = src.Rx1DataRateOffsetAck + dst.MaxTimeExponent = src.MaxTimeExponent } else { - var zero bool - dst.Rx1DataRateOffsetAck = zero + dst.MaxTimeExponent = 0 } - case "rx2_frequency_ack": + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *MACCommand_RejoinParamSetupAns) SetFields(src *MACCommand_RejoinParamSetupAns, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "max_time_exponent_ack": if len(subs) > 0 { - return fmt.Errorf("'rx2_frequency_ack' has no subfields, but %s were specified", subs) + return fmt.Errorf("'max_time_exponent_ack' has no subfields, but %s were specified", subs) } if src != nil { - dst.Rx2FrequencyAck = src.Rx2FrequencyAck + dst.MaxTimeExponentAck = src.MaxTimeExponentAck } else { var zero bool - dst.Rx2FrequencyAck = zero + dst.MaxTimeExponentAck = zero } default: @@ -3157,28 +4265,17 @@ func (dst *MACCommand_RxParamSetupAns) SetFields(src *MACCommand_RxParamSetupAns return nil } -func (dst *MACCommand_DevStatusAns) SetFields(src *MACCommand_DevStatusAns, paths ...string) error { +func (dst *MACCommand_PingSlotInfoReq) SetFields(src *MACCommand_PingSlotInfoReq, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "battery": - if len(subs) > 0 { - return fmt.Errorf("'battery' has no subfields, but %s were specified", subs) - } - if src != nil { - dst.Battery = src.Battery - } else { - var zero uint32 - dst.Battery = zero - } - case "margin": + case "period": if len(subs) > 0 { - return fmt.Errorf("'margin' has no subfields, but %s were specified", subs) + return fmt.Errorf("'period' has no subfields, but %s were specified", subs) } if src != nil { - dst.Margin = src.Margin + dst.Period = src.Period } else { - var zero int32 - dst.Margin = zero + dst.Period = 0 } default: @@ -3188,19 +4285,9 @@ func (dst *MACCommand_DevStatusAns) SetFields(src *MACCommand_DevStatusAns, path return nil } -func (dst *MACCommand_NewChannelReq) SetFields(src *MACCommand_NewChannelReq, paths ...string) error { +func (dst *MACCommand_PingSlotChannelReq) SetFields(src *MACCommand_PingSlotChannelReq, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "channel_index": - if len(subs) > 0 { - return fmt.Errorf("'channel_index' has no subfields, but %s were specified", subs) - } - if src != nil { - dst.ChannelIndex = src.ChannelIndex - } else { - var zero uint32 - dst.ChannelIndex = zero - } case "frequency": if len(subs) > 0 { return fmt.Errorf("'frequency' has no subfields, but %s were specified", subs) @@ -3211,23 +4298,14 @@ func (dst *MACCommand_NewChannelReq) SetFields(src *MACCommand_NewChannelReq, pa var zero uint64 dst.Frequency = zero } - case "min_data_rate_index": - if len(subs) > 0 { - return fmt.Errorf("'min_data_rate_index' has no subfields, but %s were specified", subs) - } - if src != nil { - dst.MinDataRateIndex = src.MinDataRateIndex - } else { - dst.MinDataRateIndex = 0 - } - case "max_data_rate_index": + case "data_rate_index": if len(subs) > 0 { - return fmt.Errorf("'max_data_rate_index' has no subfields, but %s were specified", subs) + return fmt.Errorf("'data_rate_index' has no subfields, but %s were specified", subs) } if src != nil { - dst.MaxDataRateIndex = src.MaxDataRateIndex + dst.DataRateIndex = src.DataRateIndex } else { - dst.MaxDataRateIndex = 0 + dst.DataRateIndex = 0 } default: @@ -3237,7 +4315,7 @@ func (dst *MACCommand_NewChannelReq) SetFields(src *MACCommand_NewChannelReq, pa return nil } -func (dst *MACCommand_NewChannelAns) SetFields(src *MACCommand_NewChannelAns, paths ...string) error { +func (dst *MACCommand_PingSlotChannelAns) SetFields(src *MACCommand_PingSlotChannelAns, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { case "frequency_ack": @@ -3250,15 +4328,46 @@ func (dst *MACCommand_NewChannelAns) SetFields(src *MACCommand_NewChannelAns, pa var zero bool dst.FrequencyAck = zero } - case "data_rate_ack": + case "data_rate_index_ack": + if len(subs) > 0 { + return fmt.Errorf("'data_rate_index_ack' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.DataRateIndexAck = src.DataRateIndexAck + } else { + var zero bool + dst.DataRateIndexAck = zero + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *MACCommand_BeaconTimingAns) SetFields(src *MACCommand_BeaconTimingAns, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "delay": + if len(subs) > 0 { + return fmt.Errorf("'delay' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Delay = src.Delay + } else { + var zero uint32 + dst.Delay = zero + } + case "channel_index": if len(subs) > 0 { - return fmt.Errorf("'data_rate_ack' has no subfields, but %s were specified", subs) + return fmt.Errorf("'channel_index' has no subfields, but %s were specified", subs) } if src != nil { - dst.DataRateAck = src.DataRateAck + dst.ChannelIndex = src.ChannelIndex } else { - var zero bool - dst.DataRateAck = zero + var zero uint32 + dst.ChannelIndex = zero } default: @@ -3268,19 +4377,9 @@ func (dst *MACCommand_NewChannelAns) SetFields(src *MACCommand_NewChannelAns, pa return nil } -func (dst *MACCommand_DLChannelReq) SetFields(src *MACCommand_DLChannelReq, paths ...string) error { +func (dst *MACCommand_BeaconFreqReq) SetFields(src *MACCommand_BeaconFreqReq, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "channel_index": - if len(subs) > 0 { - return fmt.Errorf("'channel_index' has no subfields, but %s were specified", subs) - } - if src != nil { - dst.ChannelIndex = src.ChannelIndex - } else { - var zero uint32 - dst.ChannelIndex = zero - } case "frequency": if len(subs) > 0 { return fmt.Errorf("'frequency' has no subfields, but %s were specified", subs) @@ -3299,19 +4398,9 @@ func (dst *MACCommand_DLChannelReq) SetFields(src *MACCommand_DLChannelReq, path return nil } -func (dst *MACCommand_DLChannelAns) SetFields(src *MACCommand_DLChannelAns, paths ...string) error { +func (dst *MACCommand_BeaconFreqAns) SetFields(src *MACCommand_BeaconFreqAns, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "channel_index_ack": - if len(subs) > 0 { - return fmt.Errorf("'channel_index_ack' has no subfields, but %s were specified", subs) - } - if src != nil { - dst.ChannelIndexAck = src.ChannelIndexAck - } else { - var zero bool - dst.ChannelIndexAck = zero - } case "frequency_ack": if len(subs) > 0 { return fmt.Errorf("'frequency_ack' has no subfields, but %s were specified", subs) @@ -3330,17 +4419,17 @@ func (dst *MACCommand_DLChannelAns) SetFields(src *MACCommand_DLChannelAns, path return nil } -func (dst *MACCommand_RxTimingSetupReq) SetFields(src *MACCommand_RxTimingSetupReq, paths ...string) error { +func (dst *MACCommand_DeviceModeInd) SetFields(src *MACCommand_DeviceModeInd, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "delay": + case "class": if len(subs) > 0 { - return fmt.Errorf("'delay' has no subfields, but %s were specified", subs) + return fmt.Errorf("'class' has no subfields, but %s were specified", subs) } if src != nil { - dst.Delay = src.Delay + dst.Class = src.Class } else { - dst.Delay = 0 + dst.Class = 0 } default: @@ -3350,37 +4439,17 @@ func (dst *MACCommand_RxTimingSetupReq) SetFields(src *MACCommand_RxTimingSetupR return nil } -func (dst *MACCommand_TxParamSetupReq) SetFields(src *MACCommand_TxParamSetupReq, paths ...string) error { +func (dst *MACCommand_DeviceModeConf) SetFields(src *MACCommand_DeviceModeConf, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "max_eirp_index": - if len(subs) > 0 { - return fmt.Errorf("'max_eirp_index' has no subfields, but %s were specified", subs) - } - if src != nil { - dst.MaxEirpIndex = src.MaxEirpIndex - } else { - dst.MaxEirpIndex = 0 - } - case "uplink_dwell_time": - if len(subs) > 0 { - return fmt.Errorf("'uplink_dwell_time' has no subfields, but %s were specified", subs) - } - if src != nil { - dst.UplinkDwellTime = src.UplinkDwellTime - } else { - var zero bool - dst.UplinkDwellTime = zero - } - case "downlink_dwell_time": + case "class": if len(subs) > 0 { - return fmt.Errorf("'downlink_dwell_time' has no subfields, but %s were specified", subs) + return fmt.Errorf("'class' has no subfields, but %s were specified", subs) } if src != nil { - dst.DownlinkDwellTime = src.DownlinkDwellTime + dst.Class = src.Class } else { - var zero bool - dst.DownlinkDwellTime = zero + dst.Class = 0 } default: @@ -3390,17 +4459,33 @@ func (dst *MACCommand_TxParamSetupReq) SetFields(src *MACCommand_TxParamSetupReq return nil } -func (dst *MACCommand_RekeyInd) SetFields(src *MACCommand_RekeyInd, paths ...string) error { +func (dst *MACCommand_RelayConfReq) SetFields(src *MACCommand_RelayConfReq, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "minor_version": + case "configuration": if len(subs) > 0 { - return fmt.Errorf("'minor_version' has no subfields, but %s were specified", subs) - } - if src != nil { - dst.MinorVersion = src.MinorVersion + var newDst, newSrc *MACCommand_RelayConfReq_Configuration + if (src == nil || src.Configuration == nil) && dst.Configuration == nil { + continue + } + if src != nil { + newSrc = src.Configuration + } + if dst.Configuration != nil { + newDst = dst.Configuration + } else { + newDst = &MACCommand_RelayConfReq_Configuration{} + dst.Configuration = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } } else { - dst.MinorVersion = 0 + if src != nil { + dst.Configuration = src.Configuration + } else { + dst.Configuration = nil + } } default: @@ -3410,46 +4495,68 @@ func (dst *MACCommand_RekeyInd) SetFields(src *MACCommand_RekeyInd, paths ...str return nil } -func (dst *MACCommand_RekeyConf) SetFields(src *MACCommand_RekeyConf, paths ...string) error { +func (dst *MACCommand_RelayConfAns) SetFields(src *MACCommand_RelayConfAns, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "minor_version": + case "second_channel_frequency_ack": if len(subs) > 0 { - return fmt.Errorf("'minor_version' has no subfields, but %s were specified", subs) + return fmt.Errorf("'second_channel_frequency_ack' has no subfields, but %s were specified", subs) } if src != nil { - dst.MinorVersion = src.MinorVersion + dst.SecondChannelFrequencyAck = src.SecondChannelFrequencyAck } else { - dst.MinorVersion = 0 + var zero bool + dst.SecondChannelFrequencyAck = zero } - - default: - return fmt.Errorf("invalid field: '%s'", name) - } - } - return nil -} - -func (dst *MACCommand_ADRParamSetupReq) SetFields(src *MACCommand_ADRParamSetupReq, paths ...string) error { - for name, subs := range _processPaths(paths) { - switch name { - case "adr_ack_limit_exponent": + case "second_channel_ack_offset_ack": if len(subs) > 0 { - return fmt.Errorf("'adr_ack_limit_exponent' has no subfields, but %s were specified", subs) + return fmt.Errorf("'second_channel_ack_offset_ack' has no subfields, but %s were specified", subs) } if src != nil { - dst.AdrAckLimitExponent = src.AdrAckLimitExponent + dst.SecondChannelAckOffsetAck = src.SecondChannelAckOffsetAck } else { - dst.AdrAckLimitExponent = 0 + var zero bool + dst.SecondChannelAckOffsetAck = zero } - case "adr_ack_delay_exponent": + case "second_channel_data_rate_index_ack": if len(subs) > 0 { - return fmt.Errorf("'adr_ack_delay_exponent' has no subfields, but %s were specified", subs) + return fmt.Errorf("'second_channel_data_rate_index_ack' has no subfields, but %s were specified", subs) } if src != nil { - dst.AdrAckDelayExponent = src.AdrAckDelayExponent + dst.SecondChannelDataRateIndexAck = src.SecondChannelDataRateIndexAck } else { - dst.AdrAckDelayExponent = 0 + var zero bool + dst.SecondChannelDataRateIndexAck = zero + } + case "second_channel_index_ack": + if len(subs) > 0 { + return fmt.Errorf("'second_channel_index_ack' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.SecondChannelIndexAck = src.SecondChannelIndexAck + } else { + var zero bool + dst.SecondChannelIndexAck = zero + } + case "default_channel_index_ack": + if len(subs) > 0 { + return fmt.Errorf("'default_channel_index_ack' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.DefaultChannelIndexAck = src.DefaultChannelIndexAck + } else { + var zero bool + dst.DefaultChannelIndexAck = zero + } + case "cad_periodicity_ack": + if len(subs) > 0 { + return fmt.Errorf("'cad_periodicity_ack' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.CadPeriodicityAck = src.CadPeriodicityAck + } else { + var zero bool + dst.CadPeriodicityAck = zero } default: @@ -3459,17 +4566,33 @@ func (dst *MACCommand_ADRParamSetupReq) SetFields(src *MACCommand_ADRParamSetupR return nil } -func (dst *MACCommand_DeviceTimeAns) SetFields(src *MACCommand_DeviceTimeAns, paths ...string) error { +func (dst *MACCommand_RelayEndDeviceConfReq) SetFields(src *MACCommand_RelayEndDeviceConfReq, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "time": + case "configuration": if len(subs) > 0 { - return fmt.Errorf("'time' has no subfields, but %s were specified", subs) - } - if src != nil { - dst.Time = src.Time + var newDst, newSrc *MACCommand_RelayEndDeviceConfReq_Configuration + if (src == nil || src.Configuration == nil) && dst.Configuration == nil { + continue + } + if src != nil { + newSrc = src.Configuration + } + if dst.Configuration != nil { + newDst = dst.Configuration + } else { + newDst = &MACCommand_RelayEndDeviceConfReq_Configuration{} + dst.Configuration = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } } else { - dst.Time = nil + if src != nil { + dst.Configuration = src.Configuration + } else { + dst.Configuration = nil + } } default: @@ -3479,45 +4602,48 @@ func (dst *MACCommand_DeviceTimeAns) SetFields(src *MACCommand_DeviceTimeAns, pa return nil } -func (dst *MACCommand_ForceRejoinReq) SetFields(src *MACCommand_ForceRejoinReq, paths ...string) error { +func (dst *MACCommand_RelayEndDeviceConfAns) SetFields(src *MACCommand_RelayEndDeviceConfAns, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "rejoin_type": + case "second_channel_frequency_ack": if len(subs) > 0 { - return fmt.Errorf("'rejoin_type' has no subfields, but %s were specified", subs) + return fmt.Errorf("'second_channel_frequency_ack' has no subfields, but %s were specified", subs) } if src != nil { - dst.RejoinType = src.RejoinType + dst.SecondChannelFrequencyAck = src.SecondChannelFrequencyAck } else { - dst.RejoinType = 0 + var zero bool + dst.SecondChannelFrequencyAck = zero } - case "data_rate_index": + case "second_channel_data_rate_index_ack": if len(subs) > 0 { - return fmt.Errorf("'data_rate_index' has no subfields, but %s were specified", subs) + return fmt.Errorf("'second_channel_data_rate_index_ack' has no subfields, but %s were specified", subs) } if src != nil { - dst.DataRateIndex = src.DataRateIndex + dst.SecondChannelDataRateIndexAck = src.SecondChannelDataRateIndexAck } else { - dst.DataRateIndex = 0 + var zero bool + dst.SecondChannelDataRateIndexAck = zero } - case "max_retries": + case "second_channel_index_ack": if len(subs) > 0 { - return fmt.Errorf("'max_retries' has no subfields, but %s were specified", subs) + return fmt.Errorf("'second_channel_index_ack' has no subfields, but %s were specified", subs) } if src != nil { - dst.MaxRetries = src.MaxRetries + dst.SecondChannelIndexAck = src.SecondChannelIndexAck } else { - var zero uint32 - dst.MaxRetries = zero + var zero bool + dst.SecondChannelIndexAck = zero } - case "period_exponent": + case "backoff_ack": if len(subs) > 0 { - return fmt.Errorf("'period_exponent' has no subfields, but %s were specified", subs) + return fmt.Errorf("'backoff_ack' has no subfields, but %s were specified", subs) } if src != nil { - dst.PeriodExponent = src.PeriodExponent + dst.BackoffAck = src.BackoffAck } else { - dst.PeriodExponent = 0 + var zero bool + dst.BackoffAck = zero } default: @@ -3527,97 +4653,90 @@ func (dst *MACCommand_ForceRejoinReq) SetFields(src *MACCommand_ForceRejoinReq, return nil } -func (dst *MACCommand_RejoinParamSetupReq) SetFields(src *MACCommand_RejoinParamSetupReq, paths ...string) error { +func (dst *MACCommand_RelayUpdateUplinkListReq) SetFields(src *MACCommand_RelayUpdateUplinkListReq, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "max_count_exponent": + case "rule_index": if len(subs) > 0 { - return fmt.Errorf("'max_count_exponent' has no subfields, but %s were specified", subs) + return fmt.Errorf("'rule_index' has no subfields, but %s were specified", subs) } if src != nil { - dst.MaxCountExponent = src.MaxCountExponent + dst.RuleIndex = src.RuleIndex } else { - dst.MaxCountExponent = 0 + var zero uint32 + dst.RuleIndex = zero } - case "max_time_exponent": + case "forward_limits": if len(subs) > 0 { - return fmt.Errorf("'max_time_exponent' has no subfields, but %s were specified", subs) + var newDst, newSrc *RelayUplinkForwardLimits + if (src == nil || src.ForwardLimits == nil) && dst.ForwardLimits == nil { + continue + } + if src != nil { + newSrc = src.ForwardLimits + } + if dst.ForwardLimits != nil { + newDst = dst.ForwardLimits + } else { + newDst = &RelayUplinkForwardLimits{} + dst.ForwardLimits = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.ForwardLimits = src.ForwardLimits + } else { + dst.ForwardLimits = nil + } + } + case "dev_addr": + if len(subs) > 0 { + return fmt.Errorf("'dev_addr' has no subfields, but %s were specified", subs) } if src != nil { - dst.MaxTimeExponent = src.MaxTimeExponent + dst.DevAddr = src.DevAddr } else { - dst.MaxTimeExponent = 0 + dst.DevAddr = nil } - - default: - return fmt.Errorf("invalid field: '%s'", name) - } - } - return nil -} - -func (dst *MACCommand_RejoinParamSetupAns) SetFields(src *MACCommand_RejoinParamSetupAns, paths ...string) error { - for name, subs := range _processPaths(paths) { - switch name { - case "max_time_exponent_ack": + case "w_f_cnt": if len(subs) > 0 { - return fmt.Errorf("'max_time_exponent_ack' has no subfields, but %s were specified", subs) + return fmt.Errorf("'w_f_cnt' has no subfields, but %s were specified", subs) } if src != nil { - dst.MaxTimeExponentAck = src.MaxTimeExponentAck + dst.WFCnt = src.WFCnt } else { - var zero bool - dst.MaxTimeExponentAck = zero + var zero uint32 + dst.WFCnt = zero } - - default: - return fmt.Errorf("invalid field: '%s'", name) - } - } - return nil -} - -func (dst *MACCommand_PingSlotInfoReq) SetFields(src *MACCommand_PingSlotInfoReq, paths ...string) error { - for name, subs := range _processPaths(paths) { - switch name { - case "period": + case "root_wor_s_key": if len(subs) > 0 { - return fmt.Errorf("'period' has no subfields, but %s were specified", subs) + return fmt.Errorf("'root_wor_s_key' has no subfields, but %s were specified", subs) } if src != nil { - dst.Period = src.Period + dst.RootWorSKey = src.RootWorSKey } else { - dst.Period = 0 + dst.RootWorSKey = nil } - - default: - return fmt.Errorf("invalid field: '%s'", name) - } - } - return nil -} - -func (dst *MACCommand_PingSlotChannelReq) SetFields(src *MACCommand_PingSlotChannelReq, paths ...string) error { - for name, subs := range _processPaths(paths) { - switch name { - case "frequency": + case "device_id": if len(subs) > 0 { - return fmt.Errorf("'frequency' has no subfields, but %s were specified", subs) + return fmt.Errorf("'device_id' has no subfields, but %s were specified", subs) } if src != nil { - dst.Frequency = src.Frequency + dst.DeviceId = src.DeviceId } else { - var zero uint64 - dst.Frequency = zero + var zero string + dst.DeviceId = zero } - case "data_rate_index": + case "session_key_id": if len(subs) > 0 { - return fmt.Errorf("'data_rate_index' has no subfields, but %s were specified", subs) + return fmt.Errorf("'session_key_id' has no subfields, but %s were specified", subs) } if src != nil { - dst.DataRateIndex = src.DataRateIndex + dst.SessionKeyId = src.SessionKeyId } else { - dst.DataRateIndex = 0 + dst.SessionKeyId = nil } default: @@ -3627,28 +4746,34 @@ func (dst *MACCommand_PingSlotChannelReq) SetFields(src *MACCommand_PingSlotChan return nil } -func (dst *MACCommand_PingSlotChannelAns) SetFields(src *MACCommand_PingSlotChannelAns, paths ...string) error { +func (dst *MACCommand_RelayUpdateUplinkListAns) SetFields(src *MACCommand_RelayUpdateUplinkListAns, paths ...string) error { + if len(paths) != 0 { + return fmt.Errorf("message MACCommand_RelayUpdateUplinkListAns has no fields, but paths %s were specified", paths) + } + return nil +} + +func (dst *MACCommand_RelayCtrlUplinkListReq) SetFields(src *MACCommand_RelayCtrlUplinkListReq, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "frequency_ack": + case "rule_index": if len(subs) > 0 { - return fmt.Errorf("'frequency_ack' has no subfields, but %s were specified", subs) + return fmt.Errorf("'rule_index' has no subfields, but %s were specified", subs) } if src != nil { - dst.FrequencyAck = src.FrequencyAck + dst.RuleIndex = src.RuleIndex } else { - var zero bool - dst.FrequencyAck = zero + var zero uint32 + dst.RuleIndex = zero } - case "data_rate_index_ack": + case "action": if len(subs) > 0 { - return fmt.Errorf("'data_rate_index_ack' has no subfields, but %s were specified", subs) + return fmt.Errorf("'action' has no subfields, but %s were specified", subs) } if src != nil { - dst.DataRateIndexAck = src.DataRateIndexAck + dst.Action = src.Action } else { - var zero bool - dst.DataRateIndexAck = zero + dst.Action = 0 } default: @@ -3658,28 +4783,28 @@ func (dst *MACCommand_PingSlotChannelAns) SetFields(src *MACCommand_PingSlotChan return nil } -func (dst *MACCommand_BeaconTimingAns) SetFields(src *MACCommand_BeaconTimingAns, paths ...string) error { +func (dst *MACCommand_RelayCtrlUplinkListAns) SetFields(src *MACCommand_RelayCtrlUplinkListAns, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "delay": + case "rule_index_ack": if len(subs) > 0 { - return fmt.Errorf("'delay' has no subfields, but %s were specified", subs) + return fmt.Errorf("'rule_index_ack' has no subfields, but %s were specified", subs) } if src != nil { - dst.Delay = src.Delay + dst.RuleIndexAck = src.RuleIndexAck } else { - var zero uint32 - dst.Delay = zero + var zero bool + dst.RuleIndexAck = zero } - case "channel_index": + case "w_f_cnt": if len(subs) > 0 { - return fmt.Errorf("'channel_index' has no subfields, but %s were specified", subs) + return fmt.Errorf("'w_f_cnt' has no subfields, but %s were specified", subs) } if src != nil { - dst.ChannelIndex = src.ChannelIndex + dst.WFCnt = src.WFCnt } else { var zero uint32 - dst.ChannelIndex = zero + dst.WFCnt = zero } default: @@ -3689,18 +4814,117 @@ func (dst *MACCommand_BeaconTimingAns) SetFields(src *MACCommand_BeaconTimingAns return nil } -func (dst *MACCommand_BeaconFreqReq) SetFields(src *MACCommand_BeaconFreqReq, paths ...string) error { +func (dst *MACCommand_RelayConfigureFwdLimitReq) SetFields(src *MACCommand_RelayConfigureFwdLimitReq, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "frequency": + case "reset_limit_counter": if len(subs) > 0 { - return fmt.Errorf("'frequency' has no subfields, but %s were specified", subs) + return fmt.Errorf("'reset_limit_counter' has no subfields, but %s were specified", subs) } if src != nil { - dst.Frequency = src.Frequency + dst.ResetLimitCounter = src.ResetLimitCounter } else { - var zero uint64 - dst.Frequency = zero + dst.ResetLimitCounter = 0 + } + case "join_request_limits": + if len(subs) > 0 { + var newDst, newSrc *RelayForwardLimits + if (src == nil || src.JoinRequestLimits == nil) && dst.JoinRequestLimits == nil { + continue + } + if src != nil { + newSrc = src.JoinRequestLimits + } + if dst.JoinRequestLimits != nil { + newDst = dst.JoinRequestLimits + } else { + newDst = &RelayForwardLimits{} + dst.JoinRequestLimits = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.JoinRequestLimits = src.JoinRequestLimits + } else { + dst.JoinRequestLimits = nil + } + } + case "notify_limits": + if len(subs) > 0 { + var newDst, newSrc *RelayForwardLimits + if (src == nil || src.NotifyLimits == nil) && dst.NotifyLimits == nil { + continue + } + if src != nil { + newSrc = src.NotifyLimits + } + if dst.NotifyLimits != nil { + newDst = dst.NotifyLimits + } else { + newDst = &RelayForwardLimits{} + dst.NotifyLimits = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.NotifyLimits = src.NotifyLimits + } else { + dst.NotifyLimits = nil + } + } + case "global_uplink_limits": + if len(subs) > 0 { + var newDst, newSrc *RelayForwardLimits + if (src == nil || src.GlobalUplinkLimits == nil) && dst.GlobalUplinkLimits == nil { + continue + } + if src != nil { + newSrc = src.GlobalUplinkLimits + } + if dst.GlobalUplinkLimits != nil { + newDst = dst.GlobalUplinkLimits + } else { + newDst = &RelayForwardLimits{} + dst.GlobalUplinkLimits = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.GlobalUplinkLimits = src.GlobalUplinkLimits + } else { + dst.GlobalUplinkLimits = nil + } + } + case "overall_limits": + if len(subs) > 0 { + var newDst, newSrc *RelayForwardLimits + if (src == nil || src.OverallLimits == nil) && dst.OverallLimits == nil { + continue + } + if src != nil { + newSrc = src.OverallLimits + } + if dst.OverallLimits != nil { + newDst = dst.OverallLimits + } else { + newDst = &RelayForwardLimits{} + dst.OverallLimits = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.OverallLimits = src.OverallLimits + } else { + dst.OverallLimits = nil + } } default: @@ -3710,18 +4934,44 @@ func (dst *MACCommand_BeaconFreqReq) SetFields(src *MACCommand_BeaconFreqReq, pa return nil } -func (dst *MACCommand_BeaconFreqAns) SetFields(src *MACCommand_BeaconFreqAns, paths ...string) error { +func (dst *MACCommand_RelayConfigureFwdLimitAns) SetFields(src *MACCommand_RelayConfigureFwdLimitAns, paths ...string) error { + if len(paths) != 0 { + return fmt.Errorf("message MACCommand_RelayConfigureFwdLimitAns has no fields, but paths %s were specified", paths) + } + return nil +} + +func (dst *MACCommand_RelayNotifyNewEndDeviceReq) SetFields(src *MACCommand_RelayNotifyNewEndDeviceReq, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "frequency_ack": + case "dev_addr": if len(subs) > 0 { - return fmt.Errorf("'frequency_ack' has no subfields, but %s were specified", subs) + return fmt.Errorf("'dev_addr' has no subfields, but %s were specified", subs) } if src != nil { - dst.FrequencyAck = src.FrequencyAck + dst.DevAddr = src.DevAddr } else { - var zero bool - dst.FrequencyAck = zero + dst.DevAddr = nil + } + case "snr": + if len(subs) > 0 { + return fmt.Errorf("'snr' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Snr = src.Snr + } else { + var zero int32 + dst.Snr = zero + } + case "rssi": + if len(subs) > 0 { + return fmt.Errorf("'rssi' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Rssi = src.Rssi + } else { + var zero int32 + dst.Rssi = zero } default: @@ -3731,17 +4981,52 @@ func (dst *MACCommand_BeaconFreqAns) SetFields(src *MACCommand_BeaconFreqAns, pa return nil } -func (dst *MACCommand_DeviceModeInd) SetFields(src *MACCommand_DeviceModeInd, paths ...string) error { +func (dst *MACCommand_RelayConfReq_Configuration) SetFields(src *MACCommand_RelayConfReq_Configuration, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "class": + case "second_channel": if len(subs) > 0 { - return fmt.Errorf("'class' has no subfields, but %s were specified", subs) + var newDst, newSrc *RelaySecondChannel + if (src == nil || src.SecondChannel == nil) && dst.SecondChannel == nil { + continue + } + if src != nil { + newSrc = src.SecondChannel + } + if dst.SecondChannel != nil { + newDst = dst.SecondChannel + } else { + newDst = &RelaySecondChannel{} + dst.SecondChannel = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.SecondChannel = src.SecondChannel + } else { + dst.SecondChannel = nil + } + } + case "default_channel_index": + if len(subs) > 0 { + return fmt.Errorf("'default_channel_index' has no subfields, but %s were specified", subs) } if src != nil { - dst.Class = src.Class + dst.DefaultChannelIndex = src.DefaultChannelIndex } else { - dst.Class = 0 + var zero uint32 + dst.DefaultChannelIndex = zero + } + case "cad_periodicity": + if len(subs) > 0 { + return fmt.Errorf("'cad_periodicity' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.CadPeriodicity = src.CadPeriodicity + } else { + dst.CadPeriodicity = 0 } default: @@ -3751,17 +5036,182 @@ func (dst *MACCommand_DeviceModeInd) SetFields(src *MACCommand_DeviceModeInd, pa return nil } -func (dst *MACCommand_DeviceModeConf) SetFields(src *MACCommand_DeviceModeConf, paths ...string) error { +func (dst *MACCommand_RelayEndDeviceConfReq_Configuration) SetFields(src *MACCommand_RelayEndDeviceConfReq_Configuration, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { - case "class": + case "backoff": if len(subs) > 0 { - return fmt.Errorf("'class' has no subfields, but %s were specified", subs) + return fmt.Errorf("'backoff' has no subfields, but %s were specified", subs) } if src != nil { - dst.Class = src.Class + dst.Backoff = src.Backoff } else { - dst.Class = 0 + var zero uint32 + dst.Backoff = zero + } + case "second_channel": + if len(subs) > 0 { + var newDst, newSrc *RelaySecondChannel + if (src == nil || src.SecondChannel == nil) && dst.SecondChannel == nil { + continue + } + if src != nil { + newSrc = src.SecondChannel + } + if dst.SecondChannel != nil { + newDst = dst.SecondChannel + } else { + newDst = &RelaySecondChannel{} + dst.SecondChannel = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.SecondChannel = src.SecondChannel + } else { + dst.SecondChannel = nil + } + } + case "serving_device_id": + if len(subs) > 0 { + return fmt.Errorf("'serving_device_id' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.ServingDeviceId = src.ServingDeviceId + } else { + var zero string + dst.ServingDeviceId = zero + } + + case "mode": + if len(subs) == 0 && src == nil { + dst.Mode = nil + continue + } else if len(subs) == 0 { + dst.Mode = src.Mode + continue + } + + subPathMap := _processPaths(subs) + if len(subPathMap) > 1 { + return fmt.Errorf("more than one field specified for oneof field '%s'", name) + } + for oneofName, oneofSubs := range subPathMap { + switch oneofName { + case "always": + var srcTypeOk bool + if src != nil { + _, srcTypeOk = src.Mode.(*MACCommand_RelayEndDeviceConfReq_Configuration_Always) + } + if srcValid := srcTypeOk || src == nil || src.Mode == nil || len(oneofSubs) == 0; !srcValid { + return fmt.Errorf("attempt to set oneof 'always', while different oneof is set in source") + } + _, dstTypeOk := dst.Mode.(*MACCommand_RelayEndDeviceConfReq_Configuration_Always) + if dstValid := dstTypeOk || dst.Mode == nil || len(oneofSubs) == 0; !dstValid { + return fmt.Errorf("attempt to set oneof 'always', while different oneof is set in destination") + } + if len(oneofSubs) > 0 { + var newDst, newSrc *RelayEndDeviceAlwaysMode + if srcTypeOk { + newSrc = src.Mode.(*MACCommand_RelayEndDeviceConfReq_Configuration_Always).Always + } + if dstTypeOk { + newDst = dst.Mode.(*MACCommand_RelayEndDeviceConfReq_Configuration_Always).Always + } else if srcTypeOk { + newDst = &RelayEndDeviceAlwaysMode{} + dst.Mode = &MACCommand_RelayEndDeviceConfReq_Configuration_Always{Always: newDst} + } else { + dst.Mode = nil + continue + } + if err := newDst.SetFields(newSrc, oneofSubs...); err != nil { + return err + } + } else { + if srcTypeOk { + dst.Mode = src.Mode + } else { + dst.Mode = nil + } + } + case "dynamic": + var srcTypeOk bool + if src != nil { + _, srcTypeOk = src.Mode.(*MACCommand_RelayEndDeviceConfReq_Configuration_Dynamic) + } + if srcValid := srcTypeOk || src == nil || src.Mode == nil || len(oneofSubs) == 0; !srcValid { + return fmt.Errorf("attempt to set oneof 'dynamic', while different oneof is set in source") + } + _, dstTypeOk := dst.Mode.(*MACCommand_RelayEndDeviceConfReq_Configuration_Dynamic) + if dstValid := dstTypeOk || dst.Mode == nil || len(oneofSubs) == 0; !dstValid { + return fmt.Errorf("attempt to set oneof 'dynamic', while different oneof is set in destination") + } + if len(oneofSubs) > 0 { + var newDst, newSrc *RelayEndDeviceDynamicMode + if srcTypeOk { + newSrc = src.Mode.(*MACCommand_RelayEndDeviceConfReq_Configuration_Dynamic).Dynamic + } + if dstTypeOk { + newDst = dst.Mode.(*MACCommand_RelayEndDeviceConfReq_Configuration_Dynamic).Dynamic + } else if srcTypeOk { + newDst = &RelayEndDeviceDynamicMode{} + dst.Mode = &MACCommand_RelayEndDeviceConfReq_Configuration_Dynamic{Dynamic: newDst} + } else { + dst.Mode = nil + continue + } + if err := newDst.SetFields(newSrc, oneofSubs...); err != nil { + return err + } + } else { + if srcTypeOk { + dst.Mode = src.Mode + } else { + dst.Mode = nil + } + } + case "end_device_controlled": + var srcTypeOk bool + if src != nil { + _, srcTypeOk = src.Mode.(*MACCommand_RelayEndDeviceConfReq_Configuration_EndDeviceControlled) + } + if srcValid := srcTypeOk || src == nil || src.Mode == nil || len(oneofSubs) == 0; !srcValid { + return fmt.Errorf("attempt to set oneof 'end_device_controlled', while different oneof is set in source") + } + _, dstTypeOk := dst.Mode.(*MACCommand_RelayEndDeviceConfReq_Configuration_EndDeviceControlled) + if dstValid := dstTypeOk || dst.Mode == nil || len(oneofSubs) == 0; !dstValid { + return fmt.Errorf("attempt to set oneof 'end_device_controlled', while different oneof is set in destination") + } + if len(oneofSubs) > 0 { + var newDst, newSrc *RelayEndDeviceControlledMode + if srcTypeOk { + newSrc = src.Mode.(*MACCommand_RelayEndDeviceConfReq_Configuration_EndDeviceControlled).EndDeviceControlled + } + if dstTypeOk { + newDst = dst.Mode.(*MACCommand_RelayEndDeviceConfReq_Configuration_EndDeviceControlled).EndDeviceControlled + } else if srcTypeOk { + newDst = &RelayEndDeviceControlledMode{} + dst.Mode = &MACCommand_RelayEndDeviceConfReq_Configuration_EndDeviceControlled{EndDeviceControlled: newDst} + } else { + dst.Mode = nil + continue + } + if err := newDst.SetFields(newSrc, oneofSubs...); err != nil { + return err + } + } else { + if srcTypeOk { + dst.Mode = src.Mode + } else { + dst.Mode = nil + } + } + + default: + return fmt.Errorf("invalid oneof field: '%s.%s'", name, oneofName) + } } default: diff --git a/pkg/ttnpb/lorawan.pb.validate.go b/pkg/ttnpb/lorawan.pb.validate.go index cb1ee3b620..637c773803 100644 --- a/pkg/ttnpb/lorawan.pb.validate.go +++ b/pkg/ttnpb/lorawan.pb.validate.go @@ -2421,536 +2421,2649 @@ var _ interface { ErrorName() string } = TxRequestValidationError{} -// ValidateFields checks the field values on MACCommand with the rules defined -// in the proto definition for this message. If any rules are violated, an -// error is returned. -func (m *MACCommand) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on RelaySecondChannel with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *RelaySecondChannel) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommandFieldPathsNested + paths = RelaySecondChannelFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "cid": + case "ack_offset": - if _, ok := _MACCommand_Cid_NotInLookup[m.GetCid()]; ok { - return MACCommandValidationError{ - field: "cid", - reason: "value must not be in list [0]", + if _, ok := RelaySecondChAckOffset_name[int32(m.GetAckOffset())]; !ok { + return RelaySecondChannelValidationError{ + field: "ack_offset", + reason: "value must be one of the defined enum values", } } - if _, ok := MACCommandIdentifier_name[int32(m.GetCid())]; !ok { - return MACCommandValidationError{ - field: "cid", + case "data_rate_index": + + if _, ok := DataRateIndex_name[int32(m.GetDataRateIndex())]; !ok { + return RelaySecondChannelValidationError{ + field: "data_rate_index", reason: "value must be one of the defined enum values", } } - case "payload": - if len(subs) == 0 { - subs = []string{ - "raw_payload", "reset_ind", "reset_conf", "link_check_ans", "link_adr_req", "link_adr_ans", "duty_cycle_req", "rx_param_setup_req", "rx_param_setup_ans", "dev_status_ans", "new_channel_req", "new_channel_ans", "dl_channel_req", "dl_channel_ans", "rx_timing_setup_req", "tx_param_setup_req", "rekey_ind", "rekey_conf", "adr_param_setup_req", "device_time_ans", "force_rejoin_req", "rejoin_param_setup_req", "rejoin_param_setup_ans", "ping_slot_info_req", "ping_slot_channel_req", "ping_slot_channel_ans", "beacon_timing_ans", "beacon_freq_req", "beacon_freq_ans", "device_mode_ind", "device_mode_conf", + case "frequency": + + if m.GetFrequency() < 100000 { + return RelaySecondChannelValidationError{ + field: "frequency", + reason: "value must be greater than or equal to 100000", } } - for name, subs := range _processPaths(subs) { - _ = subs - switch name { - case "raw_payload": - w, ok := m.Payload.(*MACCommand_RawPayload) - if !ok || w == nil { - continue - } - // no validation rules for RawPayload - case "reset_ind": - w, ok := m.Payload.(*MACCommand_ResetInd_) - if !ok || w == nil { - continue - } - if v, ok := interface{}(m.GetResetInd()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "reset_ind", - reason: "embedded message failed validation", - cause: err, - } - } - } + default: + return RelaySecondChannelValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} - case "reset_conf": - w, ok := m.Payload.(*MACCommand_ResetConf_) - if !ok || w == nil { - continue - } +// RelaySecondChannelValidationError is the validation error returned by +// RelaySecondChannel.ValidateFields if the designated constraints aren't met. +type RelaySecondChannelValidationError struct { + field string + reason string + cause error + key bool +} - if v, ok := interface{}(m.GetResetConf()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "reset_conf", - reason: "embedded message failed validation", - cause: err, - } - } - } +// Field function returns field value. +func (e RelaySecondChannelValidationError) Field() string { return e.field } - case "link_check_ans": - w, ok := m.Payload.(*MACCommand_LinkCheckAns_) - if !ok || w == nil { - continue - } +// Reason function returns reason value. +func (e RelaySecondChannelValidationError) Reason() string { return e.reason } - if v, ok := interface{}(m.GetLinkCheckAns()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "link_check_ans", - reason: "embedded message failed validation", - cause: err, - } - } - } +// Cause function returns cause value. +func (e RelaySecondChannelValidationError) Cause() error { return e.cause } - case "link_adr_req": - w, ok := m.Payload.(*MACCommand_LinkAdrReq) - if !ok || w == nil { - continue - } +// Key function returns key value. +func (e RelaySecondChannelValidationError) Key() bool { return e.key } - if v, ok := interface{}(m.GetLinkAdrReq()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "link_adr_req", - reason: "embedded message failed validation", - cause: err, - } - } - } +// ErrorName returns error name. +func (e RelaySecondChannelValidationError) ErrorName() string { + return "RelaySecondChannelValidationError" +} - case "link_adr_ans": - w, ok := m.Payload.(*MACCommand_LinkAdrAns) - if !ok || w == nil { - continue - } +// Error satisfies the builtin error interface +func (e RelaySecondChannelValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } - if v, ok := interface{}(m.GetLinkAdrAns()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "link_adr_ans", - reason: "embedded message failed validation", - cause: err, - } - } - } + key := "" + if e.key { + key = "key for " + } - case "duty_cycle_req": - w, ok := m.Payload.(*MACCommand_DutyCycleReq_) - if !ok || w == nil { - continue - } + return fmt.Sprintf( + "invalid %sRelaySecondChannel.%s: %s%s", + key, + e.field, + e.reason, + cause) +} - if v, ok := interface{}(m.GetDutyCycleReq()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "duty_cycle_req", - reason: "embedded message failed validation", - cause: err, - } - } - } +var _ error = RelaySecondChannelValidationError{} - case "rx_param_setup_req": - w, ok := m.Payload.(*MACCommand_RxParamSetupReq_) - if !ok || w == nil { - continue - } +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RelaySecondChannelValidationError{} - if v, ok := interface{}(m.GetRxParamSetupReq()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "rx_param_setup_req", - reason: "embedded message failed validation", - cause: err, - } - } - } +// ValidateFields checks the field values on RelayUplinkForwardLimits with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *RelayUplinkForwardLimits) ValidateFields(paths ...string) error { + if m == nil { + return nil + } - case "rx_param_setup_ans": - w, ok := m.Payload.(*MACCommand_RxParamSetupAns_) - if !ok || w == nil { - continue - } + if len(paths) == 0 { + paths = RelayUplinkForwardLimitsFieldPathsNested + } - if v, ok := interface{}(m.GetRxParamSetupAns()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "rx_param_setup_ans", - reason: "embedded message failed validation", - cause: err, - } - } - } + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "bucket_size": - case "dev_status_ans": - w, ok := m.Payload.(*MACCommand_DevStatusAns_) - if !ok || w == nil { - continue - } + if _, ok := RelayLimitBucketSize_name[int32(m.GetBucketSize())]; !ok { + return RelayUplinkForwardLimitsValidationError{ + field: "bucket_size", + reason: "value must be one of the defined enum values", + } + } - if v, ok := interface{}(m.GetDevStatusAns()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "dev_status_ans", - reason: "embedded message failed validation", - cause: err, - } - } - } + case "reload_rate": - case "new_channel_req": - w, ok := m.Payload.(*MACCommand_NewChannelReq_) - if !ok || w == nil { - continue - } + if m.GetReloadRate() > 62 { + return RelayUplinkForwardLimitsValidationError{ + field: "reload_rate", + reason: "value must be less than or equal to 62", + } + } - if v, ok := interface{}(m.GetNewChannelReq()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "new_channel_req", - reason: "embedded message failed validation", - cause: err, - } - } - } + default: + return RelayUplinkForwardLimitsValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} - case "new_channel_ans": - w, ok := m.Payload.(*MACCommand_NewChannelAns_) - if !ok || w == nil { - continue - } +// RelayUplinkForwardLimitsValidationError is the validation error returned by +// RelayUplinkForwardLimits.ValidateFields if the designated constraints +// aren't met. +type RelayUplinkForwardLimitsValidationError struct { + field string + reason string + cause error + key bool +} - if v, ok := interface{}(m.GetNewChannelAns()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "new_channel_ans", - reason: "embedded message failed validation", +// Field function returns field value. +func (e RelayUplinkForwardLimitsValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e RelayUplinkForwardLimitsValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e RelayUplinkForwardLimitsValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e RelayUplinkForwardLimitsValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e RelayUplinkForwardLimitsValidationError) ErrorName() string { + return "RelayUplinkForwardLimitsValidationError" +} + +// Error satisfies the builtin error interface +func (e RelayUplinkForwardLimitsValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sRelayUplinkForwardLimits.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = RelayUplinkForwardLimitsValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RelayUplinkForwardLimitsValidationError{} + +// ValidateFields checks the field values on RelayForwardLimits with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *RelayForwardLimits) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = RelayForwardLimitsFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "bucket_size": + + if _, ok := RelayLimitBucketSize_name[int32(m.GetBucketSize())]; !ok { + return RelayForwardLimitsValidationError{ + field: "bucket_size", + reason: "value must be one of the defined enum values", + } + } + + case "reload_rate": + + if m.GetReloadRate() > 126 { + return RelayForwardLimitsValidationError{ + field: "reload_rate", + reason: "value must be less than or equal to 126", + } + } + + default: + return RelayForwardLimitsValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// RelayForwardLimitsValidationError is the validation error returned by +// RelayForwardLimits.ValidateFields if the designated constraints aren't met. +type RelayForwardLimitsValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e RelayForwardLimitsValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e RelayForwardLimitsValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e RelayForwardLimitsValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e RelayForwardLimitsValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e RelayForwardLimitsValidationError) ErrorName() string { + return "RelayForwardLimitsValidationError" +} + +// Error satisfies the builtin error interface +func (e RelayForwardLimitsValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sRelayForwardLimits.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = RelayForwardLimitsValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RelayForwardLimitsValidationError{} + +// ValidateFields checks the field values on RelayEndDeviceAlwaysMode with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *RelayEndDeviceAlwaysMode) ValidateFields(paths ...string) error { + if len(paths) > 0 { + return fmt.Errorf("message RelayEndDeviceAlwaysMode has no fields, but paths %s were specified", paths) + } + return nil +} + +// RelayEndDeviceAlwaysModeValidationError is the validation error returned by +// RelayEndDeviceAlwaysMode.ValidateFields if the designated constraints +// aren't met. +type RelayEndDeviceAlwaysModeValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e RelayEndDeviceAlwaysModeValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e RelayEndDeviceAlwaysModeValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e RelayEndDeviceAlwaysModeValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e RelayEndDeviceAlwaysModeValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e RelayEndDeviceAlwaysModeValidationError) ErrorName() string { + return "RelayEndDeviceAlwaysModeValidationError" +} + +// Error satisfies the builtin error interface +func (e RelayEndDeviceAlwaysModeValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sRelayEndDeviceAlwaysMode.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = RelayEndDeviceAlwaysModeValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RelayEndDeviceAlwaysModeValidationError{} + +// ValidateFields checks the field values on RelayEndDeviceDynamicMode with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *RelayEndDeviceDynamicMode) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = RelayEndDeviceDynamicModeFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "smart_enable_level": + + if _, ok := RelaySmartEnableLevel_name[int32(m.GetSmartEnableLevel())]; !ok { + return RelayEndDeviceDynamicModeValidationError{ + field: "smart_enable_level", + reason: "value must be one of the defined enum values", + } + } + + default: + return RelayEndDeviceDynamicModeValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// RelayEndDeviceDynamicModeValidationError is the validation error returned by +// RelayEndDeviceDynamicMode.ValidateFields if the designated constraints +// aren't met. +type RelayEndDeviceDynamicModeValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e RelayEndDeviceDynamicModeValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e RelayEndDeviceDynamicModeValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e RelayEndDeviceDynamicModeValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e RelayEndDeviceDynamicModeValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e RelayEndDeviceDynamicModeValidationError) ErrorName() string { + return "RelayEndDeviceDynamicModeValidationError" +} + +// Error satisfies the builtin error interface +func (e RelayEndDeviceDynamicModeValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sRelayEndDeviceDynamicMode.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = RelayEndDeviceDynamicModeValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RelayEndDeviceDynamicModeValidationError{} + +// ValidateFields checks the field values on RelayEndDeviceControlledMode with +// the rules defined in the proto definition for this message. If any rules +// are violated, an error is returned. +func (m *RelayEndDeviceControlledMode) ValidateFields(paths ...string) error { + if len(paths) > 0 { + return fmt.Errorf("message RelayEndDeviceControlledMode has no fields, but paths %s were specified", paths) + } + return nil +} + +// RelayEndDeviceControlledModeValidationError is the validation error returned +// by RelayEndDeviceControlledMode.ValidateFields if the designated +// constraints aren't met. +type RelayEndDeviceControlledModeValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e RelayEndDeviceControlledModeValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e RelayEndDeviceControlledModeValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e RelayEndDeviceControlledModeValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e RelayEndDeviceControlledModeValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e RelayEndDeviceControlledModeValidationError) ErrorName() string { + return "RelayEndDeviceControlledModeValidationError" +} + +// Error satisfies the builtin error interface +func (e RelayEndDeviceControlledModeValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sRelayEndDeviceControlledMode.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = RelayEndDeviceControlledModeValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RelayEndDeviceControlledModeValidationError{} + +// ValidateFields checks the field values on MACCommand with the rules defined +// in the proto definition for this message. If any rules are violated, an +// error is returned. +func (m *MACCommand) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = MACCommandFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "cid": + + if _, ok := _MACCommand_Cid_NotInLookup[m.GetCid()]; ok { + return MACCommandValidationError{ + field: "cid", + reason: "value must not be in list [0]", + } + } + + if _, ok := MACCommandIdentifier_name[int32(m.GetCid())]; !ok { + return MACCommandValidationError{ + field: "cid", + reason: "value must be one of the defined enum values", + } + } + + case "payload": + if len(subs) == 0 { + subs = []string{ + "raw_payload", "reset_ind", "reset_conf", "link_check_ans", "link_adr_req", "link_adr_ans", "duty_cycle_req", "rx_param_setup_req", "rx_param_setup_ans", "dev_status_ans", "new_channel_req", "new_channel_ans", "dl_channel_req", "dl_channel_ans", "rx_timing_setup_req", "tx_param_setup_req", "rekey_ind", "rekey_conf", "adr_param_setup_req", "device_time_ans", "force_rejoin_req", "rejoin_param_setup_req", "rejoin_param_setup_ans", "ping_slot_info_req", "ping_slot_channel_req", "ping_slot_channel_ans", "beacon_timing_ans", "beacon_freq_req", "beacon_freq_ans", "device_mode_ind", "device_mode_conf", "relay_conf_req", "relay_conf_ans", "relay_end_device_conf_req", "relay_end_device_conf_ans", "relay_update_uplink_list_req", "relay_update_uplink_list_ans", "relay_ctrl_uplink_list_req", "relay_ctrl_uplink_list_ans", "relay_configure_fwd_limit_req", "relay_configure_fwd_limit_ans", "relay_notify_new_end_device_req", + } + } + for name, subs := range _processPaths(subs) { + _ = subs + switch name { + case "raw_payload": + w, ok := m.Payload.(*MACCommand_RawPayload) + if !ok || w == nil { + continue + } + // no validation rules for RawPayload + case "reset_ind": + w, ok := m.Payload.(*MACCommand_ResetInd_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetResetInd()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "reset_ind", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "reset_conf": + w, ok := m.Payload.(*MACCommand_ResetConf_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetResetConf()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "reset_conf", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "link_check_ans": + w, ok := m.Payload.(*MACCommand_LinkCheckAns_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetLinkCheckAns()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "link_check_ans", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "link_adr_req": + w, ok := m.Payload.(*MACCommand_LinkAdrReq) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetLinkAdrReq()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "link_adr_req", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "link_adr_ans": + w, ok := m.Payload.(*MACCommand_LinkAdrAns) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetLinkAdrAns()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "link_adr_ans", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "duty_cycle_req": + w, ok := m.Payload.(*MACCommand_DutyCycleReq_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetDutyCycleReq()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "duty_cycle_req", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "rx_param_setup_req": + w, ok := m.Payload.(*MACCommand_RxParamSetupReq_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetRxParamSetupReq()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "rx_param_setup_req", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "rx_param_setup_ans": + w, ok := m.Payload.(*MACCommand_RxParamSetupAns_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetRxParamSetupAns()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "rx_param_setup_ans", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "dev_status_ans": + w, ok := m.Payload.(*MACCommand_DevStatusAns_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetDevStatusAns()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "dev_status_ans", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "new_channel_req": + w, ok := m.Payload.(*MACCommand_NewChannelReq_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetNewChannelReq()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "new_channel_req", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "new_channel_ans": + w, ok := m.Payload.(*MACCommand_NewChannelAns_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetNewChannelAns()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "new_channel_ans", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "dl_channel_req": + w, ok := m.Payload.(*MACCommand_DlChannelReq) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetDlChannelReq()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "dl_channel_req", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "dl_channel_ans": + w, ok := m.Payload.(*MACCommand_DlChannelAns) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetDlChannelAns()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "dl_channel_ans", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "rx_timing_setup_req": + w, ok := m.Payload.(*MACCommand_RxTimingSetupReq_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetRxTimingSetupReq()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "rx_timing_setup_req", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "tx_param_setup_req": + w, ok := m.Payload.(*MACCommand_TxParamSetupReq_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetTxParamSetupReq()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "tx_param_setup_req", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "rekey_ind": + w, ok := m.Payload.(*MACCommand_RekeyInd_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetRekeyInd()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "rekey_ind", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "rekey_conf": + w, ok := m.Payload.(*MACCommand_RekeyConf_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetRekeyConf()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "rekey_conf", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "adr_param_setup_req": + w, ok := m.Payload.(*MACCommand_AdrParamSetupReq) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetAdrParamSetupReq()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "adr_param_setup_req", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "device_time_ans": + w, ok := m.Payload.(*MACCommand_DeviceTimeAns_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetDeviceTimeAns()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "device_time_ans", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "force_rejoin_req": + w, ok := m.Payload.(*MACCommand_ForceRejoinReq_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetForceRejoinReq()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "force_rejoin_req", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "rejoin_param_setup_req": + w, ok := m.Payload.(*MACCommand_RejoinParamSetupReq_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetRejoinParamSetupReq()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "rejoin_param_setup_req", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "rejoin_param_setup_ans": + w, ok := m.Payload.(*MACCommand_RejoinParamSetupAns_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetRejoinParamSetupAns()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "rejoin_param_setup_ans", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "ping_slot_info_req": + w, ok := m.Payload.(*MACCommand_PingSlotInfoReq_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetPingSlotInfoReq()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "ping_slot_info_req", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "ping_slot_channel_req": + w, ok := m.Payload.(*MACCommand_PingSlotChannelReq_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetPingSlotChannelReq()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "ping_slot_channel_req", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "ping_slot_channel_ans": + w, ok := m.Payload.(*MACCommand_PingSlotChannelAns_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetPingSlotChannelAns()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "ping_slot_channel_ans", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "beacon_timing_ans": + w, ok := m.Payload.(*MACCommand_BeaconTimingAns_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetBeaconTimingAns()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "beacon_timing_ans", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "beacon_freq_req": + w, ok := m.Payload.(*MACCommand_BeaconFreqReq_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetBeaconFreqReq()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "beacon_freq_req", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "beacon_freq_ans": + w, ok := m.Payload.(*MACCommand_BeaconFreqAns_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetBeaconFreqAns()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "beacon_freq_ans", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "device_mode_ind": + w, ok := m.Payload.(*MACCommand_DeviceModeInd_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetDeviceModeInd()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "device_mode_ind", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "device_mode_conf": + w, ok := m.Payload.(*MACCommand_DeviceModeConf_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetDeviceModeConf()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "device_mode_conf", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "relay_conf_req": + w, ok := m.Payload.(*MACCommand_RelayConfReq_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetRelayConfReq()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "relay_conf_req", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "relay_conf_ans": + w, ok := m.Payload.(*MACCommand_RelayConfAns_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetRelayConfAns()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "relay_conf_ans", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "relay_end_device_conf_req": + w, ok := m.Payload.(*MACCommand_RelayEndDeviceConfReq_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetRelayEndDeviceConfReq()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "relay_end_device_conf_req", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "relay_end_device_conf_ans": + w, ok := m.Payload.(*MACCommand_RelayEndDeviceConfAns_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetRelayEndDeviceConfAns()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "relay_end_device_conf_ans", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "relay_update_uplink_list_req": + w, ok := m.Payload.(*MACCommand_RelayUpdateUplinkListReq_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetRelayUpdateUplinkListReq()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "relay_update_uplink_list_req", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "relay_update_uplink_list_ans": + w, ok := m.Payload.(*MACCommand_RelayUpdateUplinkListAns_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetRelayUpdateUplinkListAns()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "relay_update_uplink_list_ans", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "relay_ctrl_uplink_list_req": + w, ok := m.Payload.(*MACCommand_RelayCtrlUplinkListReq_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetRelayCtrlUplinkListReq()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "relay_ctrl_uplink_list_req", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "relay_ctrl_uplink_list_ans": + w, ok := m.Payload.(*MACCommand_RelayCtrlUplinkListAns_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetRelayCtrlUplinkListAns()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "relay_ctrl_uplink_list_ans", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "relay_configure_fwd_limit_req": + w, ok := m.Payload.(*MACCommand_RelayConfigureFwdLimitReq_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetRelayConfigureFwdLimitReq()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "relay_configure_fwd_limit_req", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "relay_configure_fwd_limit_ans": + w, ok := m.Payload.(*MACCommand_RelayConfigureFwdLimitAns_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetRelayConfigureFwdLimitAns()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "relay_configure_fwd_limit_ans", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "relay_notify_new_end_device_req": + w, ok := m.Payload.(*MACCommand_RelayNotifyNewEndDeviceReq_) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetRelayNotifyNewEndDeviceReq()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandValidationError{ + field: "relay_notify_new_end_device_req", + reason: "embedded message failed validation", cause: err, } } } - case "dl_channel_req": - w, ok := m.Payload.(*MACCommand_DlChannelReq) - if !ok || w == nil { - continue - } + } + } + default: + return MACCommandValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// MACCommandValidationError is the validation error returned by +// MACCommand.ValidateFields if the designated constraints aren't met. +type MACCommandValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e MACCommandValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e MACCommandValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e MACCommandValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e MACCommandValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e MACCommandValidationError) ErrorName() string { return "MACCommandValidationError" } + +// Error satisfies the builtin error interface +func (e MACCommandValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sMACCommand.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = MACCommandValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = MACCommandValidationError{} + +var _MACCommand_Cid_NotInLookup = map[MACCommandIdentifier]struct{}{ + 0: {}, +} + +// ValidateFields checks the field values on MACCommands with the rules defined +// in the proto definition for this message. If any rules are violated, an +// error is returned. +func (m *MACCommands) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = MACCommandsFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "commands": + + for idx, item := range m.GetCommands() { + _, _ = idx, item + + if v, ok := interface{}(item).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommandsValidationError{ + field: fmt.Sprintf("commands[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + default: + return MACCommandsValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// MACCommandsValidationError is the validation error returned by +// MACCommands.ValidateFields if the designated constraints aren't met. +type MACCommandsValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e MACCommandsValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e MACCommandsValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e MACCommandsValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e MACCommandsValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e MACCommandsValidationError) ErrorName() string { return "MACCommandsValidationError" } + +// Error satisfies the builtin error interface +func (e MACCommandsValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sMACCommands.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = MACCommandsValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = MACCommandsValidationError{} + +// ValidateFields checks the field values on FrequencyValue with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *FrequencyValue) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = FrequencyValueFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "value": + + if m.GetValue() < 100000 { + return FrequencyValueValidationError{ + field: "value", + reason: "value must be greater than or equal to 100000", + } + } + + default: + return FrequencyValueValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// FrequencyValueValidationError is the validation error returned by +// FrequencyValue.ValidateFields if the designated constraints aren't met. +type FrequencyValueValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e FrequencyValueValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e FrequencyValueValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e FrequencyValueValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e FrequencyValueValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e FrequencyValueValidationError) ErrorName() string { return "FrequencyValueValidationError" } + +// Error satisfies the builtin error interface +func (e FrequencyValueValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sFrequencyValue.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = FrequencyValueValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = FrequencyValueValidationError{} + +// ValidateFields checks the field values on ZeroableFrequencyValue with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *ZeroableFrequencyValue) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = ZeroableFrequencyValueFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "value": + + if val := m.GetValue(); val > 0 && val < 100000 { + return ZeroableFrequencyValueValidationError{ + field: "value", + reason: "value must be outside range (0, 100000)", + } + } + + default: + return ZeroableFrequencyValueValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// ZeroableFrequencyValueValidationError is the validation error returned by +// ZeroableFrequencyValue.ValidateFields if the designated constraints aren't met. +type ZeroableFrequencyValueValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ZeroableFrequencyValueValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ZeroableFrequencyValueValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ZeroableFrequencyValueValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ZeroableFrequencyValueValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ZeroableFrequencyValueValidationError) ErrorName() string { + return "ZeroableFrequencyValueValidationError" +} + +// Error satisfies the builtin error interface +func (e ZeroableFrequencyValueValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sZeroableFrequencyValue.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ZeroableFrequencyValueValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ZeroableFrequencyValueValidationError{} + +// ValidateFields checks the field values on DataRateOffsetValue with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *DataRateOffsetValue) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = DataRateOffsetValueFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "value": + + if _, ok := DataRateOffset_name[int32(m.GetValue())]; !ok { + return DataRateOffsetValueValidationError{ + field: "value", + reason: "value must be one of the defined enum values", + } + } + + default: + return DataRateOffsetValueValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// DataRateOffsetValueValidationError is the validation error returned by +// DataRateOffsetValue.ValidateFields if the designated constraints aren't met. +type DataRateOffsetValueValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e DataRateOffsetValueValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e DataRateOffsetValueValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e DataRateOffsetValueValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e DataRateOffsetValueValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e DataRateOffsetValueValidationError) ErrorName() string { + return "DataRateOffsetValueValidationError" +} + +// Error satisfies the builtin error interface +func (e DataRateOffsetValueValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sDataRateOffsetValue.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = DataRateOffsetValueValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = DataRateOffsetValueValidationError{} + +// ValidateFields checks the field values on DataRateIndexValue with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *DataRateIndexValue) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = DataRateIndexValueFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "value": + + if _, ok := DataRateIndex_name[int32(m.GetValue())]; !ok { + return DataRateIndexValueValidationError{ + field: "value", + reason: "value must be one of the defined enum values", + } + } + + default: + return DataRateIndexValueValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// DataRateIndexValueValidationError is the validation error returned by +// DataRateIndexValue.ValidateFields if the designated constraints aren't met. +type DataRateIndexValueValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e DataRateIndexValueValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e DataRateIndexValueValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e DataRateIndexValueValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e DataRateIndexValueValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e DataRateIndexValueValidationError) ErrorName() string { + return "DataRateIndexValueValidationError" +} + +// Error satisfies the builtin error interface +func (e DataRateIndexValueValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sDataRateIndexValue.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = DataRateIndexValueValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = DataRateIndexValueValidationError{} + +// ValidateFields checks the field values on PingSlotPeriodValue with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *PingSlotPeriodValue) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = PingSlotPeriodValueFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "value": + + if _, ok := PingSlotPeriod_name[int32(m.GetValue())]; !ok { + return PingSlotPeriodValueValidationError{ + field: "value", + reason: "value must be one of the defined enum values", + } + } + + default: + return PingSlotPeriodValueValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// PingSlotPeriodValueValidationError is the validation error returned by +// PingSlotPeriodValue.ValidateFields if the designated constraints aren't met. +type PingSlotPeriodValueValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e PingSlotPeriodValueValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e PingSlotPeriodValueValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e PingSlotPeriodValueValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e PingSlotPeriodValueValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e PingSlotPeriodValueValidationError) ErrorName() string { + return "PingSlotPeriodValueValidationError" +} + +// Error satisfies the builtin error interface +func (e PingSlotPeriodValueValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sPingSlotPeriodValue.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = PingSlotPeriodValueValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = PingSlotPeriodValueValidationError{} + +// ValidateFields checks the field values on AggregatedDutyCycleValue with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *AggregatedDutyCycleValue) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = AggregatedDutyCycleValueFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "value": + + if _, ok := AggregatedDutyCycle_name[int32(m.GetValue())]; !ok { + return AggregatedDutyCycleValueValidationError{ + field: "value", + reason: "value must be one of the defined enum values", + } + } + + default: + return AggregatedDutyCycleValueValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// AggregatedDutyCycleValueValidationError is the validation error returned by +// AggregatedDutyCycleValue.ValidateFields if the designated constraints +// aren't met. +type AggregatedDutyCycleValueValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e AggregatedDutyCycleValueValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e AggregatedDutyCycleValueValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e AggregatedDutyCycleValueValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e AggregatedDutyCycleValueValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e AggregatedDutyCycleValueValidationError) ErrorName() string { + return "AggregatedDutyCycleValueValidationError" +} + +// Error satisfies the builtin error interface +func (e AggregatedDutyCycleValueValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sAggregatedDutyCycleValue.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = AggregatedDutyCycleValueValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = AggregatedDutyCycleValueValidationError{} + +// ValidateFields checks the field values on RxDelayValue with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *RxDelayValue) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = RxDelayValueFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "value": + + if _, ok := RxDelay_name[int32(m.GetValue())]; !ok { + return RxDelayValueValidationError{ + field: "value", + reason: "value must be one of the defined enum values", + } + } + + default: + return RxDelayValueValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// RxDelayValueValidationError is the validation error returned by +// RxDelayValue.ValidateFields if the designated constraints aren't met. +type RxDelayValueValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e RxDelayValueValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e RxDelayValueValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e RxDelayValueValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e RxDelayValueValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e RxDelayValueValidationError) ErrorName() string { return "RxDelayValueValidationError" } + +// Error satisfies the builtin error interface +func (e RxDelayValueValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sRxDelayValue.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = RxDelayValueValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RxDelayValueValidationError{} + +// ValidateFields checks the field values on ADRAckLimitExponentValue with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *ADRAckLimitExponentValue) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = ADRAckLimitExponentValueFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "value": + + if _, ok := ADRAckLimitExponent_name[int32(m.GetValue())]; !ok { + return ADRAckLimitExponentValueValidationError{ + field: "value", + reason: "value must be one of the defined enum values", + } + } + + default: + return ADRAckLimitExponentValueValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// ADRAckLimitExponentValueValidationError is the validation error returned by +// ADRAckLimitExponentValue.ValidateFields if the designated constraints +// aren't met. +type ADRAckLimitExponentValueValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ADRAckLimitExponentValueValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ADRAckLimitExponentValueValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ADRAckLimitExponentValueValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ADRAckLimitExponentValueValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ADRAckLimitExponentValueValidationError) ErrorName() string { + return "ADRAckLimitExponentValueValidationError" +} + +// Error satisfies the builtin error interface +func (e ADRAckLimitExponentValueValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sADRAckLimitExponentValue.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ADRAckLimitExponentValueValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ADRAckLimitExponentValueValidationError{} + +// ValidateFields checks the field values on ADRAckDelayExponentValue with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *ADRAckDelayExponentValue) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = ADRAckDelayExponentValueFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "value": + + if _, ok := ADRAckDelayExponent_name[int32(m.GetValue())]; !ok { + return ADRAckDelayExponentValueValidationError{ + field: "value", + reason: "value must be one of the defined enum values", + } + } + + default: + return ADRAckDelayExponentValueValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// ADRAckDelayExponentValueValidationError is the validation error returned by +// ADRAckDelayExponentValue.ValidateFields if the designated constraints +// aren't met. +type ADRAckDelayExponentValueValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ADRAckDelayExponentValueValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ADRAckDelayExponentValueValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ADRAckDelayExponentValueValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ADRAckDelayExponentValueValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ADRAckDelayExponentValueValidationError) ErrorName() string { + return "ADRAckDelayExponentValueValidationError" +} + +// Error satisfies the builtin error interface +func (e ADRAckDelayExponentValueValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sADRAckDelayExponentValue.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ADRAckDelayExponentValueValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ADRAckDelayExponentValueValidationError{} + +// ValidateFields checks the field values on DeviceEIRPValue with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *DeviceEIRPValue) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = DeviceEIRPValueFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "value": + + if _, ok := DeviceEIRP_name[int32(m.GetValue())]; !ok { + return DeviceEIRPValueValidationError{ + field: "value", + reason: "value must be one of the defined enum values", + } + } + + default: + return DeviceEIRPValueValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// DeviceEIRPValueValidationError is the validation error returned by +// DeviceEIRPValue.ValidateFields if the designated constraints aren't met. +type DeviceEIRPValueValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e DeviceEIRPValueValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e DeviceEIRPValueValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e DeviceEIRPValueValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e DeviceEIRPValueValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e DeviceEIRPValueValidationError) ErrorName() string { return "DeviceEIRPValueValidationError" } + +// Error satisfies the builtin error interface +func (e DeviceEIRPValueValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sDeviceEIRPValue.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = DeviceEIRPValueValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = DeviceEIRPValueValidationError{} + +// ValidateFields checks the field values on RelayForwardUplinkReq with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *RelayForwardUplinkReq) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = RelayForwardUplinkReqFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "data_rate": + + if m.GetDataRate() == nil { + return RelayForwardUplinkReqValidationError{ + field: "data_rate", + reason: "value is required", + } + } + + if v, ok := interface{}(m.GetDataRate()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return RelayForwardUplinkReqValidationError{ + field: "data_rate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "snr": + + if val := m.GetSnr(); val < -20 || val > 11 { + return RelayForwardUplinkReqValidationError{ + field: "snr", + reason: "value must be inside range [-20, 11]", + } + } + + case "rssi": + + if val := m.GetRssi(); val < -142 || val > -15 { + return RelayForwardUplinkReqValidationError{ + field: "rssi", + reason: "value must be inside range [-142, -15]", + } + } + + case "wor_channel": + + if _, ok := RelayWORChannel_name[int32(m.GetWorChannel())]; !ok { + return RelayForwardUplinkReqValidationError{ + field: "wor_channel", + reason: "value must be one of the defined enum values", + } + } + + case "frequency": + + if m.GetFrequency() < 100000 { + return RelayForwardUplinkReqValidationError{ + field: "frequency", + reason: "value must be greater than or equal to 100000", + } + } + + case "raw_payload": + // no validation rules for RawPayload + default: + return RelayForwardUplinkReqValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// RelayForwardUplinkReqValidationError is the validation error returned by +// RelayForwardUplinkReq.ValidateFields if the designated constraints aren't met. +type RelayForwardUplinkReqValidationError struct { + field string + reason string + cause error + key bool +} - if v, ok := interface{}(m.GetDlChannelReq()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "dl_channel_req", - reason: "embedded message failed validation", - cause: err, - } - } - } +// Field function returns field value. +func (e RelayForwardUplinkReqValidationError) Field() string { return e.field } - case "dl_channel_ans": - w, ok := m.Payload.(*MACCommand_DlChannelAns) - if !ok || w == nil { - continue - } +// Reason function returns reason value. +func (e RelayForwardUplinkReqValidationError) Reason() string { return e.reason } - if v, ok := interface{}(m.GetDlChannelAns()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "dl_channel_ans", - reason: "embedded message failed validation", - cause: err, - } - } - } +// Cause function returns cause value. +func (e RelayForwardUplinkReqValidationError) Cause() error { return e.cause } - case "rx_timing_setup_req": - w, ok := m.Payload.(*MACCommand_RxTimingSetupReq_) - if !ok || w == nil { - continue - } +// Key function returns key value. +func (e RelayForwardUplinkReqValidationError) Key() bool { return e.key } - if v, ok := interface{}(m.GetRxTimingSetupReq()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "rx_timing_setup_req", - reason: "embedded message failed validation", - cause: err, - } - } - } +// ErrorName returns error name. +func (e RelayForwardUplinkReqValidationError) ErrorName() string { + return "RelayForwardUplinkReqValidationError" +} - case "tx_param_setup_req": - w, ok := m.Payload.(*MACCommand_TxParamSetupReq_) - if !ok || w == nil { - continue - } +// Error satisfies the builtin error interface +func (e RelayForwardUplinkReqValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } - if v, ok := interface{}(m.GetTxParamSetupReq()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "tx_param_setup_req", - reason: "embedded message failed validation", - cause: err, - } - } - } + key := "" + if e.key { + key = "key for " + } - case "rekey_ind": - w, ok := m.Payload.(*MACCommand_RekeyInd_) - if !ok || w == nil { - continue - } + return fmt.Sprintf( + "invalid %sRelayForwardUplinkReq.%s: %s%s", + key, + e.field, + e.reason, + cause) +} - if v, ok := interface{}(m.GetRekeyInd()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "rekey_ind", - reason: "embedded message failed validation", - cause: err, - } - } - } +var _ error = RelayForwardUplinkReqValidationError{} - case "rekey_conf": - w, ok := m.Payload.(*MACCommand_RekeyConf_) - if !ok || w == nil { - continue - } +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RelayForwardUplinkReqValidationError{} - if v, ok := interface{}(m.GetRekeyConf()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "rekey_conf", - reason: "embedded message failed validation", - cause: err, - } - } - } +// ValidateFields checks the field values on RelayForwardDownlinkReq with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *RelayForwardDownlinkReq) ValidateFields(paths ...string) error { + if m == nil { + return nil + } - case "adr_param_setup_req": - w, ok := m.Payload.(*MACCommand_AdrParamSetupReq) - if !ok || w == nil { - continue - } + if len(paths) == 0 { + paths = RelayForwardDownlinkReqFieldPathsNested + } - if v, ok := interface{}(m.GetAdrParamSetupReq()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "adr_param_setup_req", - reason: "embedded message failed validation", - cause: err, - } - } - } + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "raw_payload": + // no validation rules for RawPayload + default: + return RelayForwardDownlinkReqValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} - case "device_time_ans": - w, ok := m.Payload.(*MACCommand_DeviceTimeAns_) - if !ok || w == nil { - continue - } +// RelayForwardDownlinkReqValidationError is the validation error returned by +// RelayForwardDownlinkReq.ValidateFields if the designated constraints aren't met. +type RelayForwardDownlinkReqValidationError struct { + field string + reason string + cause error + key bool +} - if v, ok := interface{}(m.GetDeviceTimeAns()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "device_time_ans", - reason: "embedded message failed validation", - cause: err, - } - } - } +// Field function returns field value. +func (e RelayForwardDownlinkReqValidationError) Field() string { return e.field } - case "force_rejoin_req": - w, ok := m.Payload.(*MACCommand_ForceRejoinReq_) - if !ok || w == nil { - continue - } +// Reason function returns reason value. +func (e RelayForwardDownlinkReqValidationError) Reason() string { return e.reason } - if v, ok := interface{}(m.GetForceRejoinReq()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "force_rejoin_req", - reason: "embedded message failed validation", - cause: err, - } - } - } +// Cause function returns cause value. +func (e RelayForwardDownlinkReqValidationError) Cause() error { return e.cause } - case "rejoin_param_setup_req": - w, ok := m.Payload.(*MACCommand_RejoinParamSetupReq_) - if !ok || w == nil { - continue - } +// Key function returns key value. +func (e RelayForwardDownlinkReqValidationError) Key() bool { return e.key } - if v, ok := interface{}(m.GetRejoinParamSetupReq()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "rejoin_param_setup_req", - reason: "embedded message failed validation", - cause: err, - } - } - } +// ErrorName returns error name. +func (e RelayForwardDownlinkReqValidationError) ErrorName() string { + return "RelayForwardDownlinkReqValidationError" +} - case "rejoin_param_setup_ans": - w, ok := m.Payload.(*MACCommand_RejoinParamSetupAns_) - if !ok || w == nil { - continue - } +// Error satisfies the builtin error interface +func (e RelayForwardDownlinkReqValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } - if v, ok := interface{}(m.GetRejoinParamSetupAns()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "rejoin_param_setup_ans", - reason: "embedded message failed validation", - cause: err, - } - } - } + key := "" + if e.key { + key = "key for " + } - case "ping_slot_info_req": - w, ok := m.Payload.(*MACCommand_PingSlotInfoReq_) - if !ok || w == nil { - continue - } + return fmt.Sprintf( + "invalid %sRelayForwardDownlinkReq.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = RelayForwardDownlinkReqValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RelayForwardDownlinkReqValidationError{} + +// ValidateFields checks the field values on RelayUplinkToken with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *RelayUplinkToken) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = RelayUplinkTokenFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "ids": - if v, ok := interface{}(m.GetPingSlotInfoReq()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "ping_slot_info_req", - reason: "embedded message failed validation", - cause: err, - } - } - } + if m.GetIds() == nil { + return RelayUplinkTokenValidationError{ + field: "ids", + reason: "value is required", + } + } - case "ping_slot_channel_req": - w, ok := m.Payload.(*MACCommand_PingSlotChannelReq_) - if !ok || w == nil { - continue + if v, ok := interface{}(m.GetIds()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return RelayUplinkTokenValidationError{ + field: "ids", + reason: "embedded message failed validation", + cause: err, } + } + } - if v, ok := interface{}(m.GetPingSlotChannelReq()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "ping_slot_channel_req", - reason: "embedded message failed validation", - cause: err, - } - } - } + case "session_key_id": + // no validation rules for SessionKeyId + case "full_f_cnt": + // no validation rules for FullFCnt + default: + return RelayUplinkTokenValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} - case "ping_slot_channel_ans": - w, ok := m.Payload.(*MACCommand_PingSlotChannelAns_) - if !ok || w == nil { - continue - } +// RelayUplinkTokenValidationError is the validation error returned by +// RelayUplinkToken.ValidateFields if the designated constraints aren't met. +type RelayUplinkTokenValidationError struct { + field string + reason string + cause error + key bool +} - if v, ok := interface{}(m.GetPingSlotChannelAns()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "ping_slot_channel_ans", - reason: "embedded message failed validation", - cause: err, - } - } - } +// Field function returns field value. +func (e RelayUplinkTokenValidationError) Field() string { return e.field } - case "beacon_timing_ans": - w, ok := m.Payload.(*MACCommand_BeaconTimingAns_) - if !ok || w == nil { - continue - } +// Reason function returns reason value. +func (e RelayUplinkTokenValidationError) Reason() string { return e.reason } - if v, ok := interface{}(m.GetBeaconTimingAns()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "beacon_timing_ans", - reason: "embedded message failed validation", - cause: err, - } - } - } +// Cause function returns cause value. +func (e RelayUplinkTokenValidationError) Cause() error { return e.cause } - case "beacon_freq_req": - w, ok := m.Payload.(*MACCommand_BeaconFreqReq_) - if !ok || w == nil { - continue - } +// Key function returns key value. +func (e RelayUplinkTokenValidationError) Key() bool { return e.key } - if v, ok := interface{}(m.GetBeaconFreqReq()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "beacon_freq_req", - reason: "embedded message failed validation", - cause: err, - } - } - } +// ErrorName returns error name. +func (e RelayUplinkTokenValidationError) ErrorName() string { return "RelayUplinkTokenValidationError" } - case "beacon_freq_ans": - w, ok := m.Payload.(*MACCommand_BeaconFreqAns_) - if !ok || w == nil { - continue - } +// Error satisfies the builtin error interface +func (e RelayUplinkTokenValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } - if v, ok := interface{}(m.GetBeaconFreqAns()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "beacon_freq_ans", - reason: "embedded message failed validation", - cause: err, - } - } - } + key := "" + if e.key { + key = "key for " + } - case "device_mode_ind": - w, ok := m.Payload.(*MACCommand_DeviceModeInd_) - if !ok || w == nil { - continue - } + return fmt.Sprintf( + "invalid %sRelayUplinkToken.%s: %s%s", + key, + e.field, + e.reason, + cause) +} - if v, ok := interface{}(m.GetDeviceModeInd()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "device_mode_ind", - reason: "embedded message failed validation", - cause: err, - } - } - } +var _ error = RelayUplinkTokenValidationError{} - case "device_mode_conf": - w, ok := m.Payload.(*MACCommand_DeviceModeConf_) - if !ok || w == nil { - continue - } +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RelayUplinkTokenValidationError{} - if v, ok := interface{}(m.GetDeviceModeConf()).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandValidationError{ - field: "device_mode_conf", - reason: "embedded message failed validation", - cause: err, - } - } - } +// ValidateFields checks the field values on TxSettings_Downlink with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *TxSettings_Downlink) ValidateFields(paths ...string) error { + if m == nil { + return nil + } - } - } + if len(paths) == 0 { + paths = TxSettings_DownlinkFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "antenna_index": + // no validation rules for AntennaIndex + case "tx_power": + // no validation rules for TxPower + case "invert_polarization": + // no validation rules for InvertPolarization default: - return MACCommandValidationError{ + return TxSettings_DownlinkValidationError{ field: name, reason: "invalid field path", } @@ -2959,9 +5072,9 @@ func (m *MACCommand) ValidateFields(paths ...string) error { return nil } -// MACCommandValidationError is the validation error returned by -// MACCommand.ValidateFields if the designated constraints aren't met. -type MACCommandValidationError struct { +// TxSettings_DownlinkValidationError is the validation error returned by +// TxSettings_Downlink.ValidateFields if the designated constraints aren't met. +type TxSettings_DownlinkValidationError struct { field string reason string cause error @@ -2969,22 +5082,24 @@ type MACCommandValidationError struct { } // Field function returns field value. -func (e MACCommandValidationError) Field() string { return e.field } +func (e TxSettings_DownlinkValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommandValidationError) Reason() string { return e.reason } +func (e TxSettings_DownlinkValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommandValidationError) Cause() error { return e.cause } +func (e TxSettings_DownlinkValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommandValidationError) Key() bool { return e.key } +func (e TxSettings_DownlinkValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommandValidationError) ErrorName() string { return "MACCommandValidationError" } +func (e TxSettings_DownlinkValidationError) ErrorName() string { + return "TxSettings_DownlinkValidationError" +} // Error satisfies the builtin error interface -func (e MACCommandValidationError) Error() string { +func (e TxSettings_DownlinkValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -2996,14 +5111,14 @@ func (e MACCommandValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand.%s: %s%s", + "invalid %sTxSettings_Downlink.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommandValidationError{} +var _ error = TxSettings_DownlinkValidationError{} var _ interface { Field() string @@ -3011,46 +5126,41 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommandValidationError{} - -var _MACCommand_Cid_NotInLookup = map[MACCommandIdentifier]struct{}{ - 0: {}, -} +} = TxSettings_DownlinkValidationError{} -// ValidateFields checks the field values on MACCommands with the rules defined -// in the proto definition for this message. If any rules are violated, an -// error is returned. -func (m *MACCommands) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on MACCommand_ResetInd with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *MACCommand_ResetInd) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommandsFieldPathsNested + paths = MACCommand_ResetIndFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "commands": - - for idx, item := range m.GetCommands() { - _, _ = idx, item + case "minor_version": - if v, ok := interface{}(item).(interface{ ValidateFields(...string) error }); ok { - if err := v.ValidateFields(subs...); err != nil { - return MACCommandsValidationError{ - field: fmt.Sprintf("commands[%v]", idx), - reason: "embedded message failed validation", - cause: err, - } - } + if _, ok := _MACCommand_ResetInd_MinorVersion_InLookup[m.GetMinorVersion()]; !ok { + return MACCommand_ResetIndValidationError{ + field: "minor_version", + reason: "value must be in list [1]", } + } + if _, ok := Minor_name[int32(m.GetMinorVersion())]; !ok { + return MACCommand_ResetIndValidationError{ + field: "minor_version", + reason: "value must be one of the defined enum values", + } } default: - return MACCommandsValidationError{ + return MACCommand_ResetIndValidationError{ field: name, reason: "invalid field path", } @@ -3059,9 +5169,9 @@ func (m *MACCommands) ValidateFields(paths ...string) error { return nil } -// MACCommandsValidationError is the validation error returned by -// MACCommands.ValidateFields if the designated constraints aren't met. -type MACCommandsValidationError struct { +// MACCommand_ResetIndValidationError is the validation error returned by +// MACCommand_ResetInd.ValidateFields if the designated constraints aren't met. +type MACCommand_ResetIndValidationError struct { field string reason string cause error @@ -3069,22 +5179,24 @@ type MACCommandsValidationError struct { } // Field function returns field value. -func (e MACCommandsValidationError) Field() string { return e.field } +func (e MACCommand_ResetIndValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommandsValidationError) Reason() string { return e.reason } +func (e MACCommand_ResetIndValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommandsValidationError) Cause() error { return e.cause } +func (e MACCommand_ResetIndValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommandsValidationError) Key() bool { return e.key } +func (e MACCommand_ResetIndValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommandsValidationError) ErrorName() string { return "MACCommandsValidationError" } +func (e MACCommand_ResetIndValidationError) ErrorName() string { + return "MACCommand_ResetIndValidationError" +} // Error satisfies the builtin error interface -func (e MACCommandsValidationError) Error() string { +func (e MACCommand_ResetIndValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -3096,14 +5208,14 @@ func (e MACCommandsValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommands.%s: %s%s", + "invalid %sMACCommand_ResetInd.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommandsValidationError{} +var _ error = MACCommand_ResetIndValidationError{} var _ interface { Field() string @@ -3111,34 +5223,45 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommandsValidationError{} +} = MACCommand_ResetIndValidationError{} -// ValidateFields checks the field values on FrequencyValue with the rules -// defined in the proto definition for this message. If any rules are +var _MACCommand_ResetInd_MinorVersion_InLookup = map[Minor]struct{}{ + 1: {}, +} + +// ValidateFields checks the field values on MACCommand_ResetConf with the +// rules defined in the proto definition for this message. If any rules are // violated, an error is returned. -func (m *FrequencyValue) ValidateFields(paths ...string) error { +func (m *MACCommand_ResetConf) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = FrequencyValueFieldPathsNested + paths = MACCommand_ResetConfFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "value": + case "minor_version": - if m.GetValue() < 100000 { - return FrequencyValueValidationError{ - field: "value", - reason: "value must be greater than or equal to 100000", + if _, ok := _MACCommand_ResetConf_MinorVersion_InLookup[m.GetMinorVersion()]; !ok { + return MACCommand_ResetConfValidationError{ + field: "minor_version", + reason: "value must be in list [1]", + } + } + + if _, ok := Minor_name[int32(m.GetMinorVersion())]; !ok { + return MACCommand_ResetConfValidationError{ + field: "minor_version", + reason: "value must be one of the defined enum values", } } default: - return FrequencyValueValidationError{ + return MACCommand_ResetConfValidationError{ field: name, reason: "invalid field path", } @@ -3147,9 +5270,9 @@ func (m *FrequencyValue) ValidateFields(paths ...string) error { return nil } -// FrequencyValueValidationError is the validation error returned by -// FrequencyValue.ValidateFields if the designated constraints aren't met. -type FrequencyValueValidationError struct { +// MACCommand_ResetConfValidationError is the validation error returned by +// MACCommand_ResetConf.ValidateFields if the designated constraints aren't met. +type MACCommand_ResetConfValidationError struct { field string reason string cause error @@ -3157,22 +5280,24 @@ type FrequencyValueValidationError struct { } // Field function returns field value. -func (e FrequencyValueValidationError) Field() string { return e.field } +func (e MACCommand_ResetConfValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e FrequencyValueValidationError) Reason() string { return e.reason } +func (e MACCommand_ResetConfValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e FrequencyValueValidationError) Cause() error { return e.cause } +func (e MACCommand_ResetConfValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e FrequencyValueValidationError) Key() bool { return e.key } +func (e MACCommand_ResetConfValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e FrequencyValueValidationError) ErrorName() string { return "FrequencyValueValidationError" } +func (e MACCommand_ResetConfValidationError) ErrorName() string { + return "MACCommand_ResetConfValidationError" +} // Error satisfies the builtin error interface -func (e FrequencyValueValidationError) Error() string { +func (e MACCommand_ResetConfValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -3184,14 +5309,14 @@ func (e FrequencyValueValidationError) Error() string { } return fmt.Sprintf( - "invalid %sFrequencyValue.%s: %s%s", + "invalid %sMACCommand_ResetConf.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = FrequencyValueValidationError{} +var _ error = MACCommand_ResetConfValidationError{} var _ interface { Field() string @@ -3199,34 +5324,47 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = FrequencyValueValidationError{} +} = MACCommand_ResetConfValidationError{} -// ValidateFields checks the field values on ZeroableFrequencyValue with the +var _MACCommand_ResetConf_MinorVersion_InLookup = map[Minor]struct{}{ + 1: {}, +} + +// ValidateFields checks the field values on MACCommand_LinkCheckAns with the // rules defined in the proto definition for this message. If any rules are // violated, an error is returned. -func (m *ZeroableFrequencyValue) ValidateFields(paths ...string) error { +func (m *MACCommand_LinkCheckAns) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = ZeroableFrequencyValueFieldPathsNested + paths = MACCommand_LinkCheckAnsFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "value": + case "margin": - if val := m.GetValue(); val > 0 && val < 100000 { - return ZeroableFrequencyValueValidationError{ - field: "value", - reason: "value must be outside range (0, 100000)", + if m.GetMargin() > 254 { + return MACCommand_LinkCheckAnsValidationError{ + field: "margin", + reason: "value must be less than or equal to 254", + } + } + + case "gateway_count": + + if m.GetGatewayCount() > 255 { + return MACCommand_LinkCheckAnsValidationError{ + field: "gateway_count", + reason: "value must be less than or equal to 255", } } default: - return ZeroableFrequencyValueValidationError{ + return MACCommand_LinkCheckAnsValidationError{ field: name, reason: "invalid field path", } @@ -3235,9 +5373,9 @@ func (m *ZeroableFrequencyValue) ValidateFields(paths ...string) error { return nil } -// ZeroableFrequencyValueValidationError is the validation error returned by -// ZeroableFrequencyValue.ValidateFields if the designated constraints aren't met. -type ZeroableFrequencyValueValidationError struct { +// MACCommand_LinkCheckAnsValidationError is the validation error returned by +// MACCommand_LinkCheckAns.ValidateFields if the designated constraints aren't met. +type MACCommand_LinkCheckAnsValidationError struct { field string reason string cause error @@ -3245,24 +5383,24 @@ type ZeroableFrequencyValueValidationError struct { } // Field function returns field value. -func (e ZeroableFrequencyValueValidationError) Field() string { return e.field } +func (e MACCommand_LinkCheckAnsValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e ZeroableFrequencyValueValidationError) Reason() string { return e.reason } +func (e MACCommand_LinkCheckAnsValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e ZeroableFrequencyValueValidationError) Cause() error { return e.cause } +func (e MACCommand_LinkCheckAnsValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e ZeroableFrequencyValueValidationError) Key() bool { return e.key } +func (e MACCommand_LinkCheckAnsValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e ZeroableFrequencyValueValidationError) ErrorName() string { - return "ZeroableFrequencyValueValidationError" +func (e MACCommand_LinkCheckAnsValidationError) ErrorName() string { + return "MACCommand_LinkCheckAnsValidationError" } // Error satisfies the builtin error interface -func (e ZeroableFrequencyValueValidationError) Error() string { +func (e MACCommand_LinkCheckAnsValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -3274,14 +5412,14 @@ func (e ZeroableFrequencyValueValidationError) Error() string { } return fmt.Sprintf( - "invalid %sZeroableFrequencyValue.%s: %s%s", + "invalid %sMACCommand_LinkCheckAns.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = ZeroableFrequencyValueValidationError{} +var _ error = MACCommand_LinkCheckAnsValidationError{} var _ interface { Field() string @@ -3289,34 +5427,70 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = ZeroableFrequencyValueValidationError{} +} = MACCommand_LinkCheckAnsValidationError{} -// ValidateFields checks the field values on DataRateOffsetValue with the rules -// defined in the proto definition for this message. If any rules are +// ValidateFields checks the field values on MACCommand_LinkADRReq with the +// rules defined in the proto definition for this message. If any rules are // violated, an error is returned. -func (m *DataRateOffsetValue) ValidateFields(paths ...string) error { +func (m *MACCommand_LinkADRReq) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = DataRateOffsetValueFieldPathsNested + paths = MACCommand_LinkADRReqFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "value": + case "data_rate_index": - if _, ok := DataRateOffset_name[int32(m.GetValue())]; !ok { - return DataRateOffsetValueValidationError{ - field: "value", + if _, ok := DataRateIndex_name[int32(m.GetDataRateIndex())]; !ok { + return MACCommand_LinkADRReqValidationError{ + field: "data_rate_index", reason: "value must be one of the defined enum values", } } + case "tx_power_index": + + if m.GetTxPowerIndex() > 15 { + return MACCommand_LinkADRReqValidationError{ + field: "tx_power_index", + reason: "value must be less than or equal to 15", + } + } + + case "channel_mask": + + if len(m.GetChannelMask()) > 16 { + return MACCommand_LinkADRReqValidationError{ + field: "channel_mask", + reason: "value must contain no more than 16 item(s)", + } + } + + case "channel_mask_control": + + if m.GetChannelMaskControl() > 7 { + return MACCommand_LinkADRReqValidationError{ + field: "channel_mask_control", + reason: "value must be less than or equal to 7", + } + } + + case "nb_trans": + + if m.GetNbTrans() > 15 { + return MACCommand_LinkADRReqValidationError{ + field: "nb_trans", + reason: "value must be less than or equal to 15", + } + } + default: - return DataRateOffsetValueValidationError{ + return MACCommand_LinkADRReqValidationError{ field: name, reason: "invalid field path", } @@ -3325,9 +5499,9 @@ func (m *DataRateOffsetValue) ValidateFields(paths ...string) error { return nil } -// DataRateOffsetValueValidationError is the validation error returned by -// DataRateOffsetValue.ValidateFields if the designated constraints aren't met. -type DataRateOffsetValueValidationError struct { +// MACCommand_LinkADRReqValidationError is the validation error returned by +// MACCommand_LinkADRReq.ValidateFields if the designated constraints aren't met. +type MACCommand_LinkADRReqValidationError struct { field string reason string cause error @@ -3335,24 +5509,24 @@ type DataRateOffsetValueValidationError struct { } // Field function returns field value. -func (e DataRateOffsetValueValidationError) Field() string { return e.field } +func (e MACCommand_LinkADRReqValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e DataRateOffsetValueValidationError) Reason() string { return e.reason } +func (e MACCommand_LinkADRReqValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e DataRateOffsetValueValidationError) Cause() error { return e.cause } +func (e MACCommand_LinkADRReqValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e DataRateOffsetValueValidationError) Key() bool { return e.key } +func (e MACCommand_LinkADRReqValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e DataRateOffsetValueValidationError) ErrorName() string { - return "DataRateOffsetValueValidationError" +func (e MACCommand_LinkADRReqValidationError) ErrorName() string { + return "MACCommand_LinkADRReqValidationError" } // Error satisfies the builtin error interface -func (e DataRateOffsetValueValidationError) Error() string { +func (e MACCommand_LinkADRReqValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -3364,14 +5538,14 @@ func (e DataRateOffsetValueValidationError) Error() string { } return fmt.Sprintf( - "invalid %sDataRateOffsetValue.%s: %s%s", + "invalid %sMACCommand_LinkADRReq.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = DataRateOffsetValueValidationError{} +var _ error = MACCommand_LinkADRReqValidationError{} var _ interface { Field() string @@ -3379,34 +5553,31 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = DataRateOffsetValueValidationError{} +} = MACCommand_LinkADRReqValidationError{} -// ValidateFields checks the field values on DataRateIndexValue with the rules -// defined in the proto definition for this message. If any rules are +// ValidateFields checks the field values on MACCommand_LinkADRAns with the +// rules defined in the proto definition for this message. If any rules are // violated, an error is returned. -func (m *DataRateIndexValue) ValidateFields(paths ...string) error { +func (m *MACCommand_LinkADRAns) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = DataRateIndexValueFieldPathsNested + paths = MACCommand_LinkADRAnsFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "value": - - if _, ok := DataRateIndex_name[int32(m.GetValue())]; !ok { - return DataRateIndexValueValidationError{ - field: "value", - reason: "value must be one of the defined enum values", - } - } - + case "channel_mask_ack": + // no validation rules for ChannelMaskAck + case "data_rate_index_ack": + // no validation rules for DataRateIndexAck + case "tx_power_index_ack": + // no validation rules for TxPowerIndexAck default: - return DataRateIndexValueValidationError{ + return MACCommand_LinkADRAnsValidationError{ field: name, reason: "invalid field path", } @@ -3415,9 +5586,9 @@ func (m *DataRateIndexValue) ValidateFields(paths ...string) error { return nil } -// DataRateIndexValueValidationError is the validation error returned by -// DataRateIndexValue.ValidateFields if the designated constraints aren't met. -type DataRateIndexValueValidationError struct { +// MACCommand_LinkADRAnsValidationError is the validation error returned by +// MACCommand_LinkADRAns.ValidateFields if the designated constraints aren't met. +type MACCommand_LinkADRAnsValidationError struct { field string reason string cause error @@ -3425,24 +5596,24 @@ type DataRateIndexValueValidationError struct { } // Field function returns field value. -func (e DataRateIndexValueValidationError) Field() string { return e.field } +func (e MACCommand_LinkADRAnsValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e DataRateIndexValueValidationError) Reason() string { return e.reason } +func (e MACCommand_LinkADRAnsValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e DataRateIndexValueValidationError) Cause() error { return e.cause } +func (e MACCommand_LinkADRAnsValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e DataRateIndexValueValidationError) Key() bool { return e.key } +func (e MACCommand_LinkADRAnsValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e DataRateIndexValueValidationError) ErrorName() string { - return "DataRateIndexValueValidationError" +func (e MACCommand_LinkADRAnsValidationError) ErrorName() string { + return "MACCommand_LinkADRAnsValidationError" } // Error satisfies the builtin error interface -func (e DataRateIndexValueValidationError) Error() string { +func (e MACCommand_LinkADRAnsValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -3454,14 +5625,14 @@ func (e DataRateIndexValueValidationError) Error() string { } return fmt.Sprintf( - "invalid %sDataRateIndexValue.%s: %s%s", + "invalid %sMACCommand_LinkADRAns.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = DataRateIndexValueValidationError{} +var _ error = MACCommand_LinkADRAnsValidationError{} var _ interface { Field() string @@ -3469,34 +5640,34 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = DataRateIndexValueValidationError{} +} = MACCommand_LinkADRAnsValidationError{} -// ValidateFields checks the field values on PingSlotPeriodValue with the rules -// defined in the proto definition for this message. If any rules are +// ValidateFields checks the field values on MACCommand_DutyCycleReq with the +// rules defined in the proto definition for this message. If any rules are // violated, an error is returned. -func (m *PingSlotPeriodValue) ValidateFields(paths ...string) error { +func (m *MACCommand_DutyCycleReq) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = PingSlotPeriodValueFieldPathsNested + paths = MACCommand_DutyCycleReqFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "value": + case "max_duty_cycle": - if _, ok := PingSlotPeriod_name[int32(m.GetValue())]; !ok { - return PingSlotPeriodValueValidationError{ - field: "value", + if _, ok := AggregatedDutyCycle_name[int32(m.GetMaxDutyCycle())]; !ok { + return MACCommand_DutyCycleReqValidationError{ + field: "max_duty_cycle", reason: "value must be one of the defined enum values", } } default: - return PingSlotPeriodValueValidationError{ + return MACCommand_DutyCycleReqValidationError{ field: name, reason: "invalid field path", } @@ -3505,9 +5676,9 @@ func (m *PingSlotPeriodValue) ValidateFields(paths ...string) error { return nil } -// PingSlotPeriodValueValidationError is the validation error returned by -// PingSlotPeriodValue.ValidateFields if the designated constraints aren't met. -type PingSlotPeriodValueValidationError struct { +// MACCommand_DutyCycleReqValidationError is the validation error returned by +// MACCommand_DutyCycleReq.ValidateFields if the designated constraints aren't met. +type MACCommand_DutyCycleReqValidationError struct { field string reason string cause error @@ -3515,24 +5686,24 @@ type PingSlotPeriodValueValidationError struct { } // Field function returns field value. -func (e PingSlotPeriodValueValidationError) Field() string { return e.field } +func (e MACCommand_DutyCycleReqValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e PingSlotPeriodValueValidationError) Reason() string { return e.reason } +func (e MACCommand_DutyCycleReqValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e PingSlotPeriodValueValidationError) Cause() error { return e.cause } +func (e MACCommand_DutyCycleReqValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e PingSlotPeriodValueValidationError) Key() bool { return e.key } +func (e MACCommand_DutyCycleReqValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e PingSlotPeriodValueValidationError) ErrorName() string { - return "PingSlotPeriodValueValidationError" +func (e MACCommand_DutyCycleReqValidationError) ErrorName() string { + return "MACCommand_DutyCycleReqValidationError" } // Error satisfies the builtin error interface -func (e PingSlotPeriodValueValidationError) Error() string { +func (e MACCommand_DutyCycleReqValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -3544,14 +5715,14 @@ func (e PingSlotPeriodValueValidationError) Error() string { } return fmt.Sprintf( - "invalid %sPingSlotPeriodValue.%s: %s%s", + "invalid %sMACCommand_DutyCycleReq.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = PingSlotPeriodValueValidationError{} +var _ error = MACCommand_DutyCycleReqValidationError{} var _ interface { Field() string @@ -3559,34 +5730,52 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = PingSlotPeriodValueValidationError{} +} = MACCommand_DutyCycleReqValidationError{} -// ValidateFields checks the field values on AggregatedDutyCycleValue with the -// rules defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *AggregatedDutyCycleValue) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on MACCommand_RxParamSetupReq with +// the rules defined in the proto definition for this message. If any rules +// are violated, an error is returned. +func (m *MACCommand_RxParamSetupReq) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = AggregatedDutyCycleValueFieldPathsNested + paths = MACCommand_RxParamSetupReqFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "value": + case "rx2_data_rate_index": - if _, ok := AggregatedDutyCycle_name[int32(m.GetValue())]; !ok { - return AggregatedDutyCycleValueValidationError{ - field: "value", + if _, ok := DataRateIndex_name[int32(m.GetRx2DataRateIndex())]; !ok { + return MACCommand_RxParamSetupReqValidationError{ + field: "rx2_data_rate_index", + reason: "value must be one of the defined enum values", + } + } + + case "rx1_data_rate_offset": + + if _, ok := DataRateOffset_name[int32(m.GetRx1DataRateOffset())]; !ok { + return MACCommand_RxParamSetupReqValidationError{ + field: "rx1_data_rate_offset", reason: "value must be one of the defined enum values", } } + case "rx2_frequency": + + if m.GetRx2Frequency() < 100000 { + return MACCommand_RxParamSetupReqValidationError{ + field: "rx2_frequency", + reason: "value must be greater than or equal to 100000", + } + } + default: - return AggregatedDutyCycleValueValidationError{ + return MACCommand_RxParamSetupReqValidationError{ field: name, reason: "invalid field path", } @@ -3595,10 +5784,10 @@ func (m *AggregatedDutyCycleValue) ValidateFields(paths ...string) error { return nil } -// AggregatedDutyCycleValueValidationError is the validation error returned by -// AggregatedDutyCycleValue.ValidateFields if the designated constraints +// MACCommand_RxParamSetupReqValidationError is the validation error returned +// by MACCommand_RxParamSetupReq.ValidateFields if the designated constraints // aren't met. -type AggregatedDutyCycleValueValidationError struct { +type MACCommand_RxParamSetupReqValidationError struct { field string reason string cause error @@ -3606,24 +5795,24 @@ type AggregatedDutyCycleValueValidationError struct { } // Field function returns field value. -func (e AggregatedDutyCycleValueValidationError) Field() string { return e.field } +func (e MACCommand_RxParamSetupReqValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e AggregatedDutyCycleValueValidationError) Reason() string { return e.reason } +func (e MACCommand_RxParamSetupReqValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e AggregatedDutyCycleValueValidationError) Cause() error { return e.cause } +func (e MACCommand_RxParamSetupReqValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e AggregatedDutyCycleValueValidationError) Key() bool { return e.key } +func (e MACCommand_RxParamSetupReqValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e AggregatedDutyCycleValueValidationError) ErrorName() string { - return "AggregatedDutyCycleValueValidationError" +func (e MACCommand_RxParamSetupReqValidationError) ErrorName() string { + return "MACCommand_RxParamSetupReqValidationError" } // Error satisfies the builtin error interface -func (e AggregatedDutyCycleValueValidationError) Error() string { +func (e MACCommand_RxParamSetupReqValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -3635,14 +5824,14 @@ func (e AggregatedDutyCycleValueValidationError) Error() string { } return fmt.Sprintf( - "invalid %sAggregatedDutyCycleValue.%s: %s%s", + "invalid %sMACCommand_RxParamSetupReq.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = AggregatedDutyCycleValueValidationError{} +var _ error = MACCommand_RxParamSetupReqValidationError{} var _ interface { Field() string @@ -3650,34 +5839,31 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = AggregatedDutyCycleValueValidationError{} +} = MACCommand_RxParamSetupReqValidationError{} -// ValidateFields checks the field values on RxDelayValue with the rules -// defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *RxDelayValue) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on MACCommand_RxParamSetupAns with +// the rules defined in the proto definition for this message. If any rules +// are violated, an error is returned. +func (m *MACCommand_RxParamSetupAns) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = RxDelayValueFieldPathsNested + paths = MACCommand_RxParamSetupAnsFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "value": - - if _, ok := RxDelay_name[int32(m.GetValue())]; !ok { - return RxDelayValueValidationError{ - field: "value", - reason: "value must be one of the defined enum values", - } - } - + case "rx2_data_rate_index_ack": + // no validation rules for Rx2DataRateIndexAck + case "rx1_data_rate_offset_ack": + // no validation rules for Rx1DataRateOffsetAck + case "rx2_frequency_ack": + // no validation rules for Rx2FrequencyAck default: - return RxDelayValueValidationError{ + return MACCommand_RxParamSetupAnsValidationError{ field: name, reason: "invalid field path", } @@ -3686,9 +5872,10 @@ func (m *RxDelayValue) ValidateFields(paths ...string) error { return nil } -// RxDelayValueValidationError is the validation error returned by -// RxDelayValue.ValidateFields if the designated constraints aren't met. -type RxDelayValueValidationError struct { +// MACCommand_RxParamSetupAnsValidationError is the validation error returned +// by MACCommand_RxParamSetupAns.ValidateFields if the designated constraints +// aren't met. +type MACCommand_RxParamSetupAnsValidationError struct { field string reason string cause error @@ -3696,22 +5883,24 @@ type RxDelayValueValidationError struct { } // Field function returns field value. -func (e RxDelayValueValidationError) Field() string { return e.field } +func (e MACCommand_RxParamSetupAnsValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e RxDelayValueValidationError) Reason() string { return e.reason } +func (e MACCommand_RxParamSetupAnsValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e RxDelayValueValidationError) Cause() error { return e.cause } +func (e MACCommand_RxParamSetupAnsValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e RxDelayValueValidationError) Key() bool { return e.key } +func (e MACCommand_RxParamSetupAnsValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e RxDelayValueValidationError) ErrorName() string { return "RxDelayValueValidationError" } +func (e MACCommand_RxParamSetupAnsValidationError) ErrorName() string { + return "MACCommand_RxParamSetupAnsValidationError" +} // Error satisfies the builtin error interface -func (e RxDelayValueValidationError) Error() string { +func (e MACCommand_RxParamSetupAnsValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -3723,14 +5912,14 @@ func (e RxDelayValueValidationError) Error() string { } return fmt.Sprintf( - "invalid %sRxDelayValue.%s: %s%s", + "invalid %sMACCommand_RxParamSetupAns.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = RxDelayValueValidationError{} +var _ error = MACCommand_RxParamSetupAnsValidationError{} var _ interface { Field() string @@ -3738,34 +5927,43 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = RxDelayValueValidationError{} +} = MACCommand_RxParamSetupAnsValidationError{} -// ValidateFields checks the field values on ADRAckLimitExponentValue with the +// ValidateFields checks the field values on MACCommand_DevStatusAns with the // rules defined in the proto definition for this message. If any rules are // violated, an error is returned. -func (m *ADRAckLimitExponentValue) ValidateFields(paths ...string) error { +func (m *MACCommand_DevStatusAns) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = ADRAckLimitExponentValueFieldPathsNested + paths = MACCommand_DevStatusAnsFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "value": + case "battery": - if _, ok := ADRAckLimitExponent_name[int32(m.GetValue())]; !ok { - return ADRAckLimitExponentValueValidationError{ - field: "value", - reason: "value must be one of the defined enum values", + if m.GetBattery() > 255 { + return MACCommand_DevStatusAnsValidationError{ + field: "battery", + reason: "value must be less than or equal to 255", + } + } + + case "margin": + + if val := m.GetMargin(); val < -32 || val > 31 { + return MACCommand_DevStatusAnsValidationError{ + field: "margin", + reason: "value must be inside range [-32, 31]", } } default: - return ADRAckLimitExponentValueValidationError{ + return MACCommand_DevStatusAnsValidationError{ field: name, reason: "invalid field path", } @@ -3774,10 +5972,9 @@ func (m *ADRAckLimitExponentValue) ValidateFields(paths ...string) error { return nil } -// ADRAckLimitExponentValueValidationError is the validation error returned by -// ADRAckLimitExponentValue.ValidateFields if the designated constraints -// aren't met. -type ADRAckLimitExponentValueValidationError struct { +// MACCommand_DevStatusAnsValidationError is the validation error returned by +// MACCommand_DevStatusAns.ValidateFields if the designated constraints aren't met. +type MACCommand_DevStatusAnsValidationError struct { field string reason string cause error @@ -3785,24 +5982,24 @@ type ADRAckLimitExponentValueValidationError struct { } // Field function returns field value. -func (e ADRAckLimitExponentValueValidationError) Field() string { return e.field } +func (e MACCommand_DevStatusAnsValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e ADRAckLimitExponentValueValidationError) Reason() string { return e.reason } +func (e MACCommand_DevStatusAnsValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e ADRAckLimitExponentValueValidationError) Cause() error { return e.cause } +func (e MACCommand_DevStatusAnsValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e ADRAckLimitExponentValueValidationError) Key() bool { return e.key } +func (e MACCommand_DevStatusAnsValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e ADRAckLimitExponentValueValidationError) ErrorName() string { - return "ADRAckLimitExponentValueValidationError" +func (e MACCommand_DevStatusAnsValidationError) ErrorName() string { + return "MACCommand_DevStatusAnsValidationError" } // Error satisfies the builtin error interface -func (e ADRAckLimitExponentValueValidationError) Error() string { +func (e MACCommand_DevStatusAnsValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -3814,14 +6011,14 @@ func (e ADRAckLimitExponentValueValidationError) Error() string { } return fmt.Sprintf( - "invalid %sADRAckLimitExponentValue.%s: %s%s", + "invalid %sMACCommand_DevStatusAns.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = ADRAckLimitExponentValueValidationError{} +var _ error = MACCommand_DevStatusAnsValidationError{} var _ interface { Field() string @@ -3829,34 +6026,61 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = ADRAckLimitExponentValueValidationError{} +} = MACCommand_DevStatusAnsValidationError{} -// ValidateFields checks the field values on ADRAckDelayExponentValue with the +// ValidateFields checks the field values on MACCommand_NewChannelReq with the // rules defined in the proto definition for this message. If any rules are // violated, an error is returned. -func (m *ADRAckDelayExponentValue) ValidateFields(paths ...string) error { +func (m *MACCommand_NewChannelReq) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = ADRAckDelayExponentValueFieldPathsNested + paths = MACCommand_NewChannelReqFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "value": + case "channel_index": + + if m.GetChannelIndex() > 255 { + return MACCommand_NewChannelReqValidationError{ + field: "channel_index", + reason: "value must be less than or equal to 255", + } + } + + case "frequency": + + if val := m.GetFrequency(); val > 0 && val < 100000 { + return MACCommand_NewChannelReqValidationError{ + field: "frequency", + reason: "value must be outside range (0, 100000)", + } + } + + case "min_data_rate_index": + + if _, ok := DataRateIndex_name[int32(m.GetMinDataRateIndex())]; !ok { + return MACCommand_NewChannelReqValidationError{ + field: "min_data_rate_index", + reason: "value must be one of the defined enum values", + } + } - if _, ok := ADRAckDelayExponent_name[int32(m.GetValue())]; !ok { - return ADRAckDelayExponentValueValidationError{ - field: "value", + case "max_data_rate_index": + + if _, ok := DataRateIndex_name[int32(m.GetMaxDataRateIndex())]; !ok { + return MACCommand_NewChannelReqValidationError{ + field: "max_data_rate_index", reason: "value must be one of the defined enum values", } } default: - return ADRAckDelayExponentValueValidationError{ + return MACCommand_NewChannelReqValidationError{ field: name, reason: "invalid field path", } @@ -3865,10 +6089,10 @@ func (m *ADRAckDelayExponentValue) ValidateFields(paths ...string) error { return nil } -// ADRAckDelayExponentValueValidationError is the validation error returned by -// ADRAckDelayExponentValue.ValidateFields if the designated constraints +// MACCommand_NewChannelReqValidationError is the validation error returned by +// MACCommand_NewChannelReq.ValidateFields if the designated constraints // aren't met. -type ADRAckDelayExponentValueValidationError struct { +type MACCommand_NewChannelReqValidationError struct { field string reason string cause error @@ -3876,24 +6100,24 @@ type ADRAckDelayExponentValueValidationError struct { } // Field function returns field value. -func (e ADRAckDelayExponentValueValidationError) Field() string { return e.field } +func (e MACCommand_NewChannelReqValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e ADRAckDelayExponentValueValidationError) Reason() string { return e.reason } +func (e MACCommand_NewChannelReqValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e ADRAckDelayExponentValueValidationError) Cause() error { return e.cause } +func (e MACCommand_NewChannelReqValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e ADRAckDelayExponentValueValidationError) Key() bool { return e.key } +func (e MACCommand_NewChannelReqValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e ADRAckDelayExponentValueValidationError) ErrorName() string { - return "ADRAckDelayExponentValueValidationError" +func (e MACCommand_NewChannelReqValidationError) ErrorName() string { + return "MACCommand_NewChannelReqValidationError" } // Error satisfies the builtin error interface -func (e ADRAckDelayExponentValueValidationError) Error() string { +func (e MACCommand_NewChannelReqValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -3905,14 +6129,14 @@ func (e ADRAckDelayExponentValueValidationError) Error() string { } return fmt.Sprintf( - "invalid %sADRAckDelayExponentValue.%s: %s%s", + "invalid %sMACCommand_NewChannelReq.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = ADRAckDelayExponentValueValidationError{} +var _ error = MACCommand_NewChannelReqValidationError{} var _ interface { Field() string @@ -3920,34 +6144,29 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = ADRAckDelayExponentValueValidationError{} +} = MACCommand_NewChannelReqValidationError{} -// ValidateFields checks the field values on DeviceEIRPValue with the rules -// defined in the proto definition for this message. If any rules are +// ValidateFields checks the field values on MACCommand_NewChannelAns with the +// rules defined in the proto definition for this message. If any rules are // violated, an error is returned. -func (m *DeviceEIRPValue) ValidateFields(paths ...string) error { +func (m *MACCommand_NewChannelAns) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = DeviceEIRPValueFieldPathsNested + paths = MACCommand_NewChannelAnsFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "value": - - if _, ok := DeviceEIRP_name[int32(m.GetValue())]; !ok { - return DeviceEIRPValueValidationError{ - field: "value", - reason: "value must be one of the defined enum values", - } - } - + case "frequency_ack": + // no validation rules for FrequencyAck + case "data_rate_ack": + // no validation rules for DataRateAck default: - return DeviceEIRPValueValidationError{ + return MACCommand_NewChannelAnsValidationError{ field: name, reason: "invalid field path", } @@ -3956,9 +6175,10 @@ func (m *DeviceEIRPValue) ValidateFields(paths ...string) error { return nil } -// DeviceEIRPValueValidationError is the validation error returned by -// DeviceEIRPValue.ValidateFields if the designated constraints aren't met. -type DeviceEIRPValueValidationError struct { +// MACCommand_NewChannelAnsValidationError is the validation error returned by +// MACCommand_NewChannelAns.ValidateFields if the designated constraints +// aren't met. +type MACCommand_NewChannelAnsValidationError struct { field string reason string cause error @@ -3966,22 +6186,24 @@ type DeviceEIRPValueValidationError struct { } // Field function returns field value. -func (e DeviceEIRPValueValidationError) Field() string { return e.field } +func (e MACCommand_NewChannelAnsValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e DeviceEIRPValueValidationError) Reason() string { return e.reason } +func (e MACCommand_NewChannelAnsValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e DeviceEIRPValueValidationError) Cause() error { return e.cause } +func (e MACCommand_NewChannelAnsValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e DeviceEIRPValueValidationError) Key() bool { return e.key } +func (e MACCommand_NewChannelAnsValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e DeviceEIRPValueValidationError) ErrorName() string { return "DeviceEIRPValueValidationError" } +func (e MACCommand_NewChannelAnsValidationError) ErrorName() string { + return "MACCommand_NewChannelAnsValidationError" +} // Error satisfies the builtin error interface -func (e DeviceEIRPValueValidationError) Error() string { +func (e MACCommand_NewChannelAnsValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -3993,14 +6215,14 @@ func (e DeviceEIRPValueValidationError) Error() string { } return fmt.Sprintf( - "invalid %sDeviceEIRPValue.%s: %s%s", + "invalid %sMACCommand_NewChannelAns.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = DeviceEIRPValueValidationError{} +var _ error = MACCommand_NewChannelAnsValidationError{} var _ interface { Field() string @@ -4008,31 +6230,43 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = DeviceEIRPValueValidationError{} +} = MACCommand_NewChannelAnsValidationError{} -// ValidateFields checks the field values on TxSettings_Downlink with the rules -// defined in the proto definition for this message. If any rules are +// ValidateFields checks the field values on MACCommand_DLChannelReq with the +// rules defined in the proto definition for this message. If any rules are // violated, an error is returned. -func (m *TxSettings_Downlink) ValidateFields(paths ...string) error { +func (m *MACCommand_DLChannelReq) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = TxSettings_DownlinkFieldPathsNested + paths = MACCommand_DLChannelReqFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "antenna_index": - // no validation rules for AntennaIndex - case "tx_power": - // no validation rules for TxPower - case "invert_polarization": - // no validation rules for InvertPolarization + case "channel_index": + + if m.GetChannelIndex() > 255 { + return MACCommand_DLChannelReqValidationError{ + field: "channel_index", + reason: "value must be less than or equal to 255", + } + } + + case "frequency": + + if m.GetFrequency() < 100000 { + return MACCommand_DLChannelReqValidationError{ + field: "frequency", + reason: "value must be greater than or equal to 100000", + } + } + default: - return TxSettings_DownlinkValidationError{ + return MACCommand_DLChannelReqValidationError{ field: name, reason: "invalid field path", } @@ -4041,9 +6275,9 @@ func (m *TxSettings_Downlink) ValidateFields(paths ...string) error { return nil } -// TxSettings_DownlinkValidationError is the validation error returned by -// TxSettings_Downlink.ValidateFields if the designated constraints aren't met. -type TxSettings_DownlinkValidationError struct { +// MACCommand_DLChannelReqValidationError is the validation error returned by +// MACCommand_DLChannelReq.ValidateFields if the designated constraints aren't met. +type MACCommand_DLChannelReqValidationError struct { field string reason string cause error @@ -4051,24 +6285,24 @@ type TxSettings_DownlinkValidationError struct { } // Field function returns field value. -func (e TxSettings_DownlinkValidationError) Field() string { return e.field } +func (e MACCommand_DLChannelReqValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e TxSettings_DownlinkValidationError) Reason() string { return e.reason } +func (e MACCommand_DLChannelReqValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e TxSettings_DownlinkValidationError) Cause() error { return e.cause } +func (e MACCommand_DLChannelReqValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e TxSettings_DownlinkValidationError) Key() bool { return e.key } +func (e MACCommand_DLChannelReqValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e TxSettings_DownlinkValidationError) ErrorName() string { - return "TxSettings_DownlinkValidationError" +func (e MACCommand_DLChannelReqValidationError) ErrorName() string { + return "MACCommand_DLChannelReqValidationError" } // Error satisfies the builtin error interface -func (e TxSettings_DownlinkValidationError) Error() string { +func (e MACCommand_DLChannelReqValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -4080,14 +6314,14 @@ func (e TxSettings_DownlinkValidationError) Error() string { } return fmt.Sprintf( - "invalid %sTxSettings_Downlink.%s: %s%s", + "invalid %sMACCommand_DLChannelReq.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = TxSettings_DownlinkValidationError{} +var _ error = MACCommand_DLChannelReqValidationError{} var _ interface { Field() string @@ -4095,41 +6329,29 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = TxSettings_DownlinkValidationError{} +} = MACCommand_DLChannelReqValidationError{} -// ValidateFields checks the field values on MACCommand_ResetInd with the rules -// defined in the proto definition for this message. If any rules are +// ValidateFields checks the field values on MACCommand_DLChannelAns with the +// rules defined in the proto definition for this message. If any rules are // violated, an error is returned. -func (m *MACCommand_ResetInd) ValidateFields(paths ...string) error { +func (m *MACCommand_DLChannelAns) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_ResetIndFieldPathsNested + paths = MACCommand_DLChannelAnsFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "minor_version": - - if _, ok := _MACCommand_ResetInd_MinorVersion_InLookup[m.GetMinorVersion()]; !ok { - return MACCommand_ResetIndValidationError{ - field: "minor_version", - reason: "value must be in list [1]", - } - } - - if _, ok := Minor_name[int32(m.GetMinorVersion())]; !ok { - return MACCommand_ResetIndValidationError{ - field: "minor_version", - reason: "value must be one of the defined enum values", - } - } - + case "channel_index_ack": + // no validation rules for ChannelIndexAck + case "frequency_ack": + // no validation rules for FrequencyAck default: - return MACCommand_ResetIndValidationError{ + return MACCommand_DLChannelAnsValidationError{ field: name, reason: "invalid field path", } @@ -4138,9 +6360,9 @@ func (m *MACCommand_ResetInd) ValidateFields(paths ...string) error { return nil } -// MACCommand_ResetIndValidationError is the validation error returned by -// MACCommand_ResetInd.ValidateFields if the designated constraints aren't met. -type MACCommand_ResetIndValidationError struct { +// MACCommand_DLChannelAnsValidationError is the validation error returned by +// MACCommand_DLChannelAns.ValidateFields if the designated constraints aren't met. +type MACCommand_DLChannelAnsValidationError struct { field string reason string cause error @@ -4148,24 +6370,24 @@ type MACCommand_ResetIndValidationError struct { } // Field function returns field value. -func (e MACCommand_ResetIndValidationError) Field() string { return e.field } +func (e MACCommand_DLChannelAnsValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_ResetIndValidationError) Reason() string { return e.reason } +func (e MACCommand_DLChannelAnsValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_ResetIndValidationError) Cause() error { return e.cause } +func (e MACCommand_DLChannelAnsValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_ResetIndValidationError) Key() bool { return e.key } +func (e MACCommand_DLChannelAnsValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_ResetIndValidationError) ErrorName() string { - return "MACCommand_ResetIndValidationError" +func (e MACCommand_DLChannelAnsValidationError) ErrorName() string { + return "MACCommand_DLChannelAnsValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_ResetIndValidationError) Error() string { +func (e MACCommand_DLChannelAnsValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -4177,14 +6399,14 @@ func (e MACCommand_ResetIndValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_ResetInd.%s: %s%s", + "invalid %sMACCommand_DLChannelAns.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_ResetIndValidationError{} +var _ error = MACCommand_DLChannelAnsValidationError{} var _ interface { Field() string @@ -4192,45 +6414,34 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_ResetIndValidationError{} - -var _MACCommand_ResetInd_MinorVersion_InLookup = map[Minor]struct{}{ - 1: {}, -} +} = MACCommand_DLChannelAnsValidationError{} -// ValidateFields checks the field values on MACCommand_ResetConf with the -// rules defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *MACCommand_ResetConf) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on MACCommand_RxTimingSetupReq with +// the rules defined in the proto definition for this message. If any rules +// are violated, an error is returned. +func (m *MACCommand_RxTimingSetupReq) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_ResetConfFieldPathsNested + paths = MACCommand_RxTimingSetupReqFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "minor_version": - - if _, ok := _MACCommand_ResetConf_MinorVersion_InLookup[m.GetMinorVersion()]; !ok { - return MACCommand_ResetConfValidationError{ - field: "minor_version", - reason: "value must be in list [1]", - } - } + case "delay": - if _, ok := Minor_name[int32(m.GetMinorVersion())]; !ok { - return MACCommand_ResetConfValidationError{ - field: "minor_version", + if _, ok := RxDelay_name[int32(m.GetDelay())]; !ok { + return MACCommand_RxTimingSetupReqValidationError{ + field: "delay", reason: "value must be one of the defined enum values", } } default: - return MACCommand_ResetConfValidationError{ + return MACCommand_RxTimingSetupReqValidationError{ field: name, reason: "invalid field path", } @@ -4239,9 +6450,10 @@ func (m *MACCommand_ResetConf) ValidateFields(paths ...string) error { return nil } -// MACCommand_ResetConfValidationError is the validation error returned by -// MACCommand_ResetConf.ValidateFields if the designated constraints aren't met. -type MACCommand_ResetConfValidationError struct { +// MACCommand_RxTimingSetupReqValidationError is the validation error returned +// by MACCommand_RxTimingSetupReq.ValidateFields if the designated constraints +// aren't met. +type MACCommand_RxTimingSetupReqValidationError struct { field string reason string cause error @@ -4249,24 +6461,24 @@ type MACCommand_ResetConfValidationError struct { } // Field function returns field value. -func (e MACCommand_ResetConfValidationError) Field() string { return e.field } +func (e MACCommand_RxTimingSetupReqValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_ResetConfValidationError) Reason() string { return e.reason } +func (e MACCommand_RxTimingSetupReqValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_ResetConfValidationError) Cause() error { return e.cause } +func (e MACCommand_RxTimingSetupReqValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_ResetConfValidationError) Key() bool { return e.key } +func (e MACCommand_RxTimingSetupReqValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_ResetConfValidationError) ErrorName() string { - return "MACCommand_ResetConfValidationError" +func (e MACCommand_RxTimingSetupReqValidationError) ErrorName() string { + return "MACCommand_RxTimingSetupReqValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_ResetConfValidationError) Error() string { +func (e MACCommand_RxTimingSetupReqValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -4278,14 +6490,14 @@ func (e MACCommand_ResetConfValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_ResetConf.%s: %s%s", + "invalid %sMACCommand_RxTimingSetupReq.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_ResetConfValidationError{} +var _ error = MACCommand_RxTimingSetupReqValidationError{} var _ interface { Field() string @@ -4293,47 +6505,38 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_ResetConfValidationError{} - -var _MACCommand_ResetConf_MinorVersion_InLookup = map[Minor]struct{}{ - 1: {}, -} +} = MACCommand_RxTimingSetupReqValidationError{} -// ValidateFields checks the field values on MACCommand_LinkCheckAns with the -// rules defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *MACCommand_LinkCheckAns) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on MACCommand_TxParamSetupReq with +// the rules defined in the proto definition for this message. If any rules +// are violated, an error is returned. +func (m *MACCommand_TxParamSetupReq) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_LinkCheckAnsFieldPathsNested + paths = MACCommand_TxParamSetupReqFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "margin": - - if m.GetMargin() > 254 { - return MACCommand_LinkCheckAnsValidationError{ - field: "margin", - reason: "value must be less than or equal to 254", - } - } - - case "gateway_count": + case "max_eirp_index": - if m.GetGatewayCount() > 255 { - return MACCommand_LinkCheckAnsValidationError{ - field: "gateway_count", - reason: "value must be less than or equal to 255", + if _, ok := DeviceEIRP_name[int32(m.GetMaxEirpIndex())]; !ok { + return MACCommand_TxParamSetupReqValidationError{ + field: "max_eirp_index", + reason: "value must be one of the defined enum values", } } + case "uplink_dwell_time": + // no validation rules for UplinkDwellTime + case "downlink_dwell_time": + // no validation rules for DownlinkDwellTime default: - return MACCommand_LinkCheckAnsValidationError{ + return MACCommand_TxParamSetupReqValidationError{ field: name, reason: "invalid field path", } @@ -4342,9 +6545,10 @@ func (m *MACCommand_LinkCheckAns) ValidateFields(paths ...string) error { return nil } -// MACCommand_LinkCheckAnsValidationError is the validation error returned by -// MACCommand_LinkCheckAns.ValidateFields if the designated constraints aren't met. -type MACCommand_LinkCheckAnsValidationError struct { +// MACCommand_TxParamSetupReqValidationError is the validation error returned +// by MACCommand_TxParamSetupReq.ValidateFields if the designated constraints +// aren't met. +type MACCommand_TxParamSetupReqValidationError struct { field string reason string cause error @@ -4352,24 +6556,24 @@ type MACCommand_LinkCheckAnsValidationError struct { } // Field function returns field value. -func (e MACCommand_LinkCheckAnsValidationError) Field() string { return e.field } +func (e MACCommand_TxParamSetupReqValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_LinkCheckAnsValidationError) Reason() string { return e.reason } +func (e MACCommand_TxParamSetupReqValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_LinkCheckAnsValidationError) Cause() error { return e.cause } +func (e MACCommand_TxParamSetupReqValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_LinkCheckAnsValidationError) Key() bool { return e.key } +func (e MACCommand_TxParamSetupReqValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_LinkCheckAnsValidationError) ErrorName() string { - return "MACCommand_LinkCheckAnsValidationError" +func (e MACCommand_TxParamSetupReqValidationError) ErrorName() string { + return "MACCommand_TxParamSetupReqValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_LinkCheckAnsValidationError) Error() string { +func (e MACCommand_TxParamSetupReqValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -4381,14 +6585,14 @@ func (e MACCommand_LinkCheckAnsValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_LinkCheckAns.%s: %s%s", + "invalid %sMACCommand_TxParamSetupReq.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_LinkCheckAnsValidationError{} +var _ error = MACCommand_TxParamSetupReqValidationError{} var _ interface { Field() string @@ -4396,70 +6600,34 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_LinkCheckAnsValidationError{} +} = MACCommand_TxParamSetupReqValidationError{} -// ValidateFields checks the field values on MACCommand_LinkADRReq with the -// rules defined in the proto definition for this message. If any rules are +// ValidateFields checks the field values on MACCommand_RekeyInd with the rules +// defined in the proto definition for this message. If any rules are // violated, an error is returned. -func (m *MACCommand_LinkADRReq) ValidateFields(paths ...string) error { +func (m *MACCommand_RekeyInd) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_LinkADRReqFieldPathsNested + paths = MACCommand_RekeyIndFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "data_rate_index": + case "minor_version": - if _, ok := DataRateIndex_name[int32(m.GetDataRateIndex())]; !ok { - return MACCommand_LinkADRReqValidationError{ - field: "data_rate_index", + if _, ok := Minor_name[int32(m.GetMinorVersion())]; !ok { + return MACCommand_RekeyIndValidationError{ + field: "minor_version", reason: "value must be one of the defined enum values", } } - case "tx_power_index": - - if m.GetTxPowerIndex() > 15 { - return MACCommand_LinkADRReqValidationError{ - field: "tx_power_index", - reason: "value must be less than or equal to 15", - } - } - - case "channel_mask": - - if len(m.GetChannelMask()) > 16 { - return MACCommand_LinkADRReqValidationError{ - field: "channel_mask", - reason: "value must contain no more than 16 item(s)", - } - } - - case "channel_mask_control": - - if m.GetChannelMaskControl() > 7 { - return MACCommand_LinkADRReqValidationError{ - field: "channel_mask_control", - reason: "value must be less than or equal to 7", - } - } - - case "nb_trans": - - if m.GetNbTrans() > 15 { - return MACCommand_LinkADRReqValidationError{ - field: "nb_trans", - reason: "value must be less than or equal to 15", - } - } - default: - return MACCommand_LinkADRReqValidationError{ + return MACCommand_RekeyIndValidationError{ field: name, reason: "invalid field path", } @@ -4468,9 +6636,9 @@ func (m *MACCommand_LinkADRReq) ValidateFields(paths ...string) error { return nil } -// MACCommand_LinkADRReqValidationError is the validation error returned by -// MACCommand_LinkADRReq.ValidateFields if the designated constraints aren't met. -type MACCommand_LinkADRReqValidationError struct { +// MACCommand_RekeyIndValidationError is the validation error returned by +// MACCommand_RekeyInd.ValidateFields if the designated constraints aren't met. +type MACCommand_RekeyIndValidationError struct { field string reason string cause error @@ -4478,24 +6646,24 @@ type MACCommand_LinkADRReqValidationError struct { } // Field function returns field value. -func (e MACCommand_LinkADRReqValidationError) Field() string { return e.field } +func (e MACCommand_RekeyIndValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_LinkADRReqValidationError) Reason() string { return e.reason } +func (e MACCommand_RekeyIndValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_LinkADRReqValidationError) Cause() error { return e.cause } +func (e MACCommand_RekeyIndValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_LinkADRReqValidationError) Key() bool { return e.key } +func (e MACCommand_RekeyIndValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_LinkADRReqValidationError) ErrorName() string { - return "MACCommand_LinkADRReqValidationError" +func (e MACCommand_RekeyIndValidationError) ErrorName() string { + return "MACCommand_RekeyIndValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_LinkADRReqValidationError) Error() string { +func (e MACCommand_RekeyIndValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -4507,14 +6675,14 @@ func (e MACCommand_LinkADRReqValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_LinkADRReq.%s: %s%s", + "invalid %sMACCommand_RekeyInd.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_LinkADRReqValidationError{} +var _ error = MACCommand_RekeyIndValidationError{} var _ interface { Field() string @@ -4522,31 +6690,34 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_LinkADRReqValidationError{} +} = MACCommand_RekeyIndValidationError{} -// ValidateFields checks the field values on MACCommand_LinkADRAns with the +// ValidateFields checks the field values on MACCommand_RekeyConf with the // rules defined in the proto definition for this message. If any rules are // violated, an error is returned. -func (m *MACCommand_LinkADRAns) ValidateFields(paths ...string) error { +func (m *MACCommand_RekeyConf) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_LinkADRAnsFieldPathsNested + paths = MACCommand_RekeyConfFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "channel_mask_ack": - // no validation rules for ChannelMaskAck - case "data_rate_index_ack": - // no validation rules for DataRateIndexAck - case "tx_power_index_ack": - // no validation rules for TxPowerIndexAck + case "minor_version": + + if _, ok := Minor_name[int32(m.GetMinorVersion())]; !ok { + return MACCommand_RekeyConfValidationError{ + field: "minor_version", + reason: "value must be one of the defined enum values", + } + } + default: - return MACCommand_LinkADRAnsValidationError{ + return MACCommand_RekeyConfValidationError{ field: name, reason: "invalid field path", } @@ -4555,9 +6726,9 @@ func (m *MACCommand_LinkADRAns) ValidateFields(paths ...string) error { return nil } -// MACCommand_LinkADRAnsValidationError is the validation error returned by -// MACCommand_LinkADRAns.ValidateFields if the designated constraints aren't met. -type MACCommand_LinkADRAnsValidationError struct { +// MACCommand_RekeyConfValidationError is the validation error returned by +// MACCommand_RekeyConf.ValidateFields if the designated constraints aren't met. +type MACCommand_RekeyConfValidationError struct { field string reason string cause error @@ -4565,24 +6736,24 @@ type MACCommand_LinkADRAnsValidationError struct { } // Field function returns field value. -func (e MACCommand_LinkADRAnsValidationError) Field() string { return e.field } +func (e MACCommand_RekeyConfValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_LinkADRAnsValidationError) Reason() string { return e.reason } +func (e MACCommand_RekeyConfValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_LinkADRAnsValidationError) Cause() error { return e.cause } +func (e MACCommand_RekeyConfValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_LinkADRAnsValidationError) Key() bool { return e.key } +func (e MACCommand_RekeyConfValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_LinkADRAnsValidationError) ErrorName() string { - return "MACCommand_LinkADRAnsValidationError" +func (e MACCommand_RekeyConfValidationError) ErrorName() string { + return "MACCommand_RekeyConfValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_LinkADRAnsValidationError) Error() string { +func (e MACCommand_RekeyConfValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -4594,14 +6765,14 @@ func (e MACCommand_LinkADRAnsValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_LinkADRAns.%s: %s%s", + "invalid %sMACCommand_RekeyConf.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_LinkADRAnsValidationError{} +var _ error = MACCommand_RekeyConfValidationError{} var _ interface { Field() string @@ -4609,34 +6780,43 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_LinkADRAnsValidationError{} +} = MACCommand_RekeyConfValidationError{} -// ValidateFields checks the field values on MACCommand_DutyCycleReq with the -// rules defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *MACCommand_DutyCycleReq) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on MACCommand_ADRParamSetupReq with +// the rules defined in the proto definition for this message. If any rules +// are violated, an error is returned. +func (m *MACCommand_ADRParamSetupReq) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_DutyCycleReqFieldPathsNested + paths = MACCommand_ADRParamSetupReqFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "max_duty_cycle": + case "adr_ack_limit_exponent": - if _, ok := AggregatedDutyCycle_name[int32(m.GetMaxDutyCycle())]; !ok { - return MACCommand_DutyCycleReqValidationError{ - field: "max_duty_cycle", + if _, ok := ADRAckLimitExponent_name[int32(m.GetAdrAckLimitExponent())]; !ok { + return MACCommand_ADRParamSetupReqValidationError{ + field: "adr_ack_limit_exponent", + reason: "value must be one of the defined enum values", + } + } + + case "adr_ack_delay_exponent": + + if _, ok := ADRAckDelayExponent_name[int32(m.GetAdrAckDelayExponent())]; !ok { + return MACCommand_ADRParamSetupReqValidationError{ + field: "adr_ack_delay_exponent", reason: "value must be one of the defined enum values", } } default: - return MACCommand_DutyCycleReqValidationError{ + return MACCommand_ADRParamSetupReqValidationError{ field: name, reason: "invalid field path", } @@ -4645,9 +6825,10 @@ func (m *MACCommand_DutyCycleReq) ValidateFields(paths ...string) error { return nil } -// MACCommand_DutyCycleReqValidationError is the validation error returned by -// MACCommand_DutyCycleReq.ValidateFields if the designated constraints aren't met. -type MACCommand_DutyCycleReqValidationError struct { +// MACCommand_ADRParamSetupReqValidationError is the validation error returned +// by MACCommand_ADRParamSetupReq.ValidateFields if the designated constraints +// aren't met. +type MACCommand_ADRParamSetupReqValidationError struct { field string reason string cause error @@ -4655,24 +6836,24 @@ type MACCommand_DutyCycleReqValidationError struct { } // Field function returns field value. -func (e MACCommand_DutyCycleReqValidationError) Field() string { return e.field } +func (e MACCommand_ADRParamSetupReqValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_DutyCycleReqValidationError) Reason() string { return e.reason } +func (e MACCommand_ADRParamSetupReqValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_DutyCycleReqValidationError) Cause() error { return e.cause } +func (e MACCommand_ADRParamSetupReqValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_DutyCycleReqValidationError) Key() bool { return e.key } +func (e MACCommand_ADRParamSetupReqValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_DutyCycleReqValidationError) ErrorName() string { - return "MACCommand_DutyCycleReqValidationError" +func (e MACCommand_ADRParamSetupReqValidationError) ErrorName() string { + return "MACCommand_ADRParamSetupReqValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_DutyCycleReqValidationError) Error() string { +func (e MACCommand_ADRParamSetupReqValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -4684,14 +6865,14 @@ func (e MACCommand_DutyCycleReqValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_DutyCycleReq.%s: %s%s", + "invalid %sMACCommand_ADRParamSetupReq.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_DutyCycleReqValidationError{} +var _ error = MACCommand_ADRParamSetupReqValidationError{} var _ interface { Field() string @@ -4699,52 +6880,34 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_DutyCycleReqValidationError{} +} = MACCommand_ADRParamSetupReqValidationError{} -// ValidateFields checks the field values on MACCommand_RxParamSetupReq with -// the rules defined in the proto definition for this message. If any rules -// are violated, an error is returned. -func (m *MACCommand_RxParamSetupReq) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on MACCommand_DeviceTimeAns with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *MACCommand_DeviceTimeAns) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_RxParamSetupReqFieldPathsNested + paths = MACCommand_DeviceTimeAnsFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "rx2_data_rate_index": - - if _, ok := DataRateIndex_name[int32(m.GetRx2DataRateIndex())]; !ok { - return MACCommand_RxParamSetupReqValidationError{ - field: "rx2_data_rate_index", - reason: "value must be one of the defined enum values", - } - } - - case "rx1_data_rate_offset": - - if _, ok := DataRateOffset_name[int32(m.GetRx1DataRateOffset())]; !ok { - return MACCommand_RxParamSetupReqValidationError{ - field: "rx1_data_rate_offset", - reason: "value must be one of the defined enum values", - } - } - - case "rx2_frequency": + case "time": - if m.GetRx2Frequency() < 100000 { - return MACCommand_RxParamSetupReqValidationError{ - field: "rx2_frequency", - reason: "value must be greater than or equal to 100000", + if m.GetTime() == nil { + return MACCommand_DeviceTimeAnsValidationError{ + field: "time", + reason: "value is required", } } default: - return MACCommand_RxParamSetupReqValidationError{ + return MACCommand_DeviceTimeAnsValidationError{ field: name, reason: "invalid field path", } @@ -4753,10 +6916,10 @@ func (m *MACCommand_RxParamSetupReq) ValidateFields(paths ...string) error { return nil } -// MACCommand_RxParamSetupReqValidationError is the validation error returned -// by MACCommand_RxParamSetupReq.ValidateFields if the designated constraints +// MACCommand_DeviceTimeAnsValidationError is the validation error returned by +// MACCommand_DeviceTimeAns.ValidateFields if the designated constraints // aren't met. -type MACCommand_RxParamSetupReqValidationError struct { +type MACCommand_DeviceTimeAnsValidationError struct { field string reason string cause error @@ -4764,24 +6927,24 @@ type MACCommand_RxParamSetupReqValidationError struct { } // Field function returns field value. -func (e MACCommand_RxParamSetupReqValidationError) Field() string { return e.field } +func (e MACCommand_DeviceTimeAnsValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_RxParamSetupReqValidationError) Reason() string { return e.reason } +func (e MACCommand_DeviceTimeAnsValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_RxParamSetupReqValidationError) Cause() error { return e.cause } +func (e MACCommand_DeviceTimeAnsValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_RxParamSetupReqValidationError) Key() bool { return e.key } +func (e MACCommand_DeviceTimeAnsValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_RxParamSetupReqValidationError) ErrorName() string { - return "MACCommand_RxParamSetupReqValidationError" +func (e MACCommand_DeviceTimeAnsValidationError) ErrorName() string { + return "MACCommand_DeviceTimeAnsValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_RxParamSetupReqValidationError) Error() string { +func (e MACCommand_DeviceTimeAnsValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -4793,14 +6956,14 @@ func (e MACCommand_RxParamSetupReqValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_RxParamSetupReq.%s: %s%s", + "invalid %sMACCommand_DeviceTimeAns.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_RxParamSetupReqValidationError{} +var _ error = MACCommand_DeviceTimeAnsValidationError{} var _ interface { Field() string @@ -4808,31 +6971,61 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_RxParamSetupReqValidationError{} +} = MACCommand_DeviceTimeAnsValidationError{} -// ValidateFields checks the field values on MACCommand_RxParamSetupAns with -// the rules defined in the proto definition for this message. If any rules -// are violated, an error is returned. -func (m *MACCommand_RxParamSetupAns) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on MACCommand_ForceRejoinReq with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *MACCommand_ForceRejoinReq) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_RxParamSetupAnsFieldPathsNested + paths = MACCommand_ForceRejoinReqFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "rx2_data_rate_index_ack": - // no validation rules for Rx2DataRateIndexAck - case "rx1_data_rate_offset_ack": - // no validation rules for Rx1DataRateOffsetAck - case "rx2_frequency_ack": - // no validation rules for Rx2FrequencyAck + case "rejoin_type": + + if _, ok := RejoinRequestType_name[int32(m.GetRejoinType())]; !ok { + return MACCommand_ForceRejoinReqValidationError{ + field: "rejoin_type", + reason: "value must be one of the defined enum values", + } + } + + case "data_rate_index": + + if _, ok := DataRateIndex_name[int32(m.GetDataRateIndex())]; !ok { + return MACCommand_ForceRejoinReqValidationError{ + field: "data_rate_index", + reason: "value must be one of the defined enum values", + } + } + + case "max_retries": + + if m.GetMaxRetries() > 7 { + return MACCommand_ForceRejoinReqValidationError{ + field: "max_retries", + reason: "value must be less than or equal to 7", + } + } + + case "period_exponent": + + if _, ok := RejoinPeriodExponent_name[int32(m.GetPeriodExponent())]; !ok { + return MACCommand_ForceRejoinReqValidationError{ + field: "period_exponent", + reason: "value must be one of the defined enum values", + } + } + default: - return MACCommand_RxParamSetupAnsValidationError{ + return MACCommand_ForceRejoinReqValidationError{ field: name, reason: "invalid field path", } @@ -4841,10 +7034,10 @@ func (m *MACCommand_RxParamSetupAns) ValidateFields(paths ...string) error { return nil } -// MACCommand_RxParamSetupAnsValidationError is the validation error returned -// by MACCommand_RxParamSetupAns.ValidateFields if the designated constraints +// MACCommand_ForceRejoinReqValidationError is the validation error returned by +// MACCommand_ForceRejoinReq.ValidateFields if the designated constraints // aren't met. -type MACCommand_RxParamSetupAnsValidationError struct { +type MACCommand_ForceRejoinReqValidationError struct { field string reason string cause error @@ -4852,24 +7045,24 @@ type MACCommand_RxParamSetupAnsValidationError struct { } // Field function returns field value. -func (e MACCommand_RxParamSetupAnsValidationError) Field() string { return e.field } +func (e MACCommand_ForceRejoinReqValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_RxParamSetupAnsValidationError) Reason() string { return e.reason } +func (e MACCommand_ForceRejoinReqValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_RxParamSetupAnsValidationError) Cause() error { return e.cause } +func (e MACCommand_ForceRejoinReqValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_RxParamSetupAnsValidationError) Key() bool { return e.key } +func (e MACCommand_ForceRejoinReqValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_RxParamSetupAnsValidationError) ErrorName() string { - return "MACCommand_RxParamSetupAnsValidationError" +func (e MACCommand_ForceRejoinReqValidationError) ErrorName() string { + return "MACCommand_ForceRejoinReqValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_RxParamSetupAnsValidationError) Error() string { +func (e MACCommand_ForceRejoinReqValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -4881,14 +7074,14 @@ func (e MACCommand_RxParamSetupAnsValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_RxParamSetupAns.%s: %s%s", + "invalid %sMACCommand_ForceRejoinReq.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_RxParamSetupAnsValidationError{} +var _ error = MACCommand_ForceRejoinReqValidationError{} var _ interface { Field() string @@ -4896,43 +7089,43 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_RxParamSetupAnsValidationError{} +} = MACCommand_ForceRejoinReqValidationError{} -// ValidateFields checks the field values on MACCommand_DevStatusAns with the -// rules defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *MACCommand_DevStatusAns) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on MACCommand_RejoinParamSetupReq +// with the rules defined in the proto definition for this message. If any +// rules are violated, an error is returned. +func (m *MACCommand_RejoinParamSetupReq) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_DevStatusAnsFieldPathsNested + paths = MACCommand_RejoinParamSetupReqFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "battery": + case "max_count_exponent": - if m.GetBattery() > 255 { - return MACCommand_DevStatusAnsValidationError{ - field: "battery", - reason: "value must be less than or equal to 255", + if _, ok := RejoinCountExponent_name[int32(m.GetMaxCountExponent())]; !ok { + return MACCommand_RejoinParamSetupReqValidationError{ + field: "max_count_exponent", + reason: "value must be one of the defined enum values", } } - case "margin": + case "max_time_exponent": - if val := m.GetMargin(); val < -32 || val > 31 { - return MACCommand_DevStatusAnsValidationError{ - field: "margin", - reason: "value must be inside range [-32, 31]", + if _, ok := RejoinTimeExponent_name[int32(m.GetMaxTimeExponent())]; !ok { + return MACCommand_RejoinParamSetupReqValidationError{ + field: "max_time_exponent", + reason: "value must be one of the defined enum values", } } default: - return MACCommand_DevStatusAnsValidationError{ + return MACCommand_RejoinParamSetupReqValidationError{ field: name, reason: "invalid field path", } @@ -4941,9 +7134,10 @@ func (m *MACCommand_DevStatusAns) ValidateFields(paths ...string) error { return nil } -// MACCommand_DevStatusAnsValidationError is the validation error returned by -// MACCommand_DevStatusAns.ValidateFields if the designated constraints aren't met. -type MACCommand_DevStatusAnsValidationError struct { +// MACCommand_RejoinParamSetupReqValidationError is the validation error +// returned by MACCommand_RejoinParamSetupReq.ValidateFields if the designated +// constraints aren't met. +type MACCommand_RejoinParamSetupReqValidationError struct { field string reason string cause error @@ -4951,24 +7145,24 @@ type MACCommand_DevStatusAnsValidationError struct { } // Field function returns field value. -func (e MACCommand_DevStatusAnsValidationError) Field() string { return e.field } +func (e MACCommand_RejoinParamSetupReqValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_DevStatusAnsValidationError) Reason() string { return e.reason } +func (e MACCommand_RejoinParamSetupReqValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_DevStatusAnsValidationError) Cause() error { return e.cause } +func (e MACCommand_RejoinParamSetupReqValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_DevStatusAnsValidationError) Key() bool { return e.key } +func (e MACCommand_RejoinParamSetupReqValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_DevStatusAnsValidationError) ErrorName() string { - return "MACCommand_DevStatusAnsValidationError" +func (e MACCommand_RejoinParamSetupReqValidationError) ErrorName() string { + return "MACCommand_RejoinParamSetupReqValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_DevStatusAnsValidationError) Error() string { +func (e MACCommand_RejoinParamSetupReqValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -4980,14 +7174,14 @@ func (e MACCommand_DevStatusAnsValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_DevStatusAns.%s: %s%s", + "invalid %sMACCommand_RejoinParamSetupReq.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_DevStatusAnsValidationError{} +var _ error = MACCommand_RejoinParamSetupReqValidationError{} var _ interface { Field() string @@ -4995,61 +7189,27 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_DevStatusAnsValidationError{} +} = MACCommand_RejoinParamSetupReqValidationError{} -// ValidateFields checks the field values on MACCommand_NewChannelReq with the -// rules defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *MACCommand_NewChannelReq) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on MACCommand_RejoinParamSetupAns +// with the rules defined in the proto definition for this message. If any +// rules are violated, an error is returned. +func (m *MACCommand_RejoinParamSetupAns) ValidateFields(paths ...string) error { if m == nil { return nil } - if len(paths) == 0 { - paths = MACCommand_NewChannelReqFieldPathsNested - } - - for name, subs := range _processPaths(append(paths[:0:0], paths...)) { - _ = subs - switch name { - case "channel_index": - - if m.GetChannelIndex() > 255 { - return MACCommand_NewChannelReqValidationError{ - field: "channel_index", - reason: "value must be less than or equal to 255", - } - } - - case "frequency": - - if val := m.GetFrequency(); val > 0 && val < 100000 { - return MACCommand_NewChannelReqValidationError{ - field: "frequency", - reason: "value must be outside range (0, 100000)", - } - } - - case "min_data_rate_index": - - if _, ok := DataRateIndex_name[int32(m.GetMinDataRateIndex())]; !ok { - return MACCommand_NewChannelReqValidationError{ - field: "min_data_rate_index", - reason: "value must be one of the defined enum values", - } - } - - case "max_data_rate_index": - - if _, ok := DataRateIndex_name[int32(m.GetMaxDataRateIndex())]; !ok { - return MACCommand_NewChannelReqValidationError{ - field: "max_data_rate_index", - reason: "value must be one of the defined enum values", - } - } + if len(paths) == 0 { + paths = MACCommand_RejoinParamSetupAnsFieldPathsNested + } + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "max_time_exponent_ack": + // no validation rules for MaxTimeExponentAck default: - return MACCommand_NewChannelReqValidationError{ + return MACCommand_RejoinParamSetupAnsValidationError{ field: name, reason: "invalid field path", } @@ -5058,10 +7218,10 @@ func (m *MACCommand_NewChannelReq) ValidateFields(paths ...string) error { return nil } -// MACCommand_NewChannelReqValidationError is the validation error returned by -// MACCommand_NewChannelReq.ValidateFields if the designated constraints -// aren't met. -type MACCommand_NewChannelReqValidationError struct { +// MACCommand_RejoinParamSetupAnsValidationError is the validation error +// returned by MACCommand_RejoinParamSetupAns.ValidateFields if the designated +// constraints aren't met. +type MACCommand_RejoinParamSetupAnsValidationError struct { field string reason string cause error @@ -5069,24 +7229,24 @@ type MACCommand_NewChannelReqValidationError struct { } // Field function returns field value. -func (e MACCommand_NewChannelReqValidationError) Field() string { return e.field } +func (e MACCommand_RejoinParamSetupAnsValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_NewChannelReqValidationError) Reason() string { return e.reason } +func (e MACCommand_RejoinParamSetupAnsValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_NewChannelReqValidationError) Cause() error { return e.cause } +func (e MACCommand_RejoinParamSetupAnsValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_NewChannelReqValidationError) Key() bool { return e.key } +func (e MACCommand_RejoinParamSetupAnsValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_NewChannelReqValidationError) ErrorName() string { - return "MACCommand_NewChannelReqValidationError" +func (e MACCommand_RejoinParamSetupAnsValidationError) ErrorName() string { + return "MACCommand_RejoinParamSetupAnsValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_NewChannelReqValidationError) Error() string { +func (e MACCommand_RejoinParamSetupAnsValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -5098,14 +7258,14 @@ func (e MACCommand_NewChannelReqValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_NewChannelReq.%s: %s%s", + "invalid %sMACCommand_RejoinParamSetupAns.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_NewChannelReqValidationError{} +var _ error = MACCommand_RejoinParamSetupAnsValidationError{} var _ interface { Field() string @@ -5113,29 +7273,34 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_NewChannelReqValidationError{} +} = MACCommand_RejoinParamSetupAnsValidationError{} -// ValidateFields checks the field values on MACCommand_NewChannelAns with the -// rules defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *MACCommand_NewChannelAns) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on MACCommand_PingSlotInfoReq with +// the rules defined in the proto definition for this message. If any rules +// are violated, an error is returned. +func (m *MACCommand_PingSlotInfoReq) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_NewChannelAnsFieldPathsNested + paths = MACCommand_PingSlotInfoReqFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "frequency_ack": - // no validation rules for FrequencyAck - case "data_rate_ack": - // no validation rules for DataRateAck + case "period": + + if _, ok := PingSlotPeriod_name[int32(m.GetPeriod())]; !ok { + return MACCommand_PingSlotInfoReqValidationError{ + field: "period", + reason: "value must be one of the defined enum values", + } + } + default: - return MACCommand_NewChannelAnsValidationError{ + return MACCommand_PingSlotInfoReqValidationError{ field: name, reason: "invalid field path", } @@ -5144,10 +7309,10 @@ func (m *MACCommand_NewChannelAns) ValidateFields(paths ...string) error { return nil } -// MACCommand_NewChannelAnsValidationError is the validation error returned by -// MACCommand_NewChannelAns.ValidateFields if the designated constraints +// MACCommand_PingSlotInfoReqValidationError is the validation error returned +// by MACCommand_PingSlotInfoReq.ValidateFields if the designated constraints // aren't met. -type MACCommand_NewChannelAnsValidationError struct { +type MACCommand_PingSlotInfoReqValidationError struct { field string reason string cause error @@ -5155,24 +7320,24 @@ type MACCommand_NewChannelAnsValidationError struct { } // Field function returns field value. -func (e MACCommand_NewChannelAnsValidationError) Field() string { return e.field } +func (e MACCommand_PingSlotInfoReqValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_NewChannelAnsValidationError) Reason() string { return e.reason } +func (e MACCommand_PingSlotInfoReqValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_NewChannelAnsValidationError) Cause() error { return e.cause } +func (e MACCommand_PingSlotInfoReqValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_NewChannelAnsValidationError) Key() bool { return e.key } +func (e MACCommand_PingSlotInfoReqValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_NewChannelAnsValidationError) ErrorName() string { - return "MACCommand_NewChannelAnsValidationError" +func (e MACCommand_PingSlotInfoReqValidationError) ErrorName() string { + return "MACCommand_PingSlotInfoReqValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_NewChannelAnsValidationError) Error() string { +func (e MACCommand_PingSlotInfoReqValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -5184,14 +7349,14 @@ func (e MACCommand_NewChannelAnsValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_NewChannelAns.%s: %s%s", + "invalid %sMACCommand_PingSlotInfoReq.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_NewChannelAnsValidationError{} +var _ error = MACCommand_PingSlotInfoReqValidationError{} var _ interface { Field() string @@ -5199,43 +7364,43 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_NewChannelAnsValidationError{} +} = MACCommand_PingSlotInfoReqValidationError{} -// ValidateFields checks the field values on MACCommand_DLChannelReq with the -// rules defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *MACCommand_DLChannelReq) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on MACCommand_PingSlotChannelReq with +// the rules defined in the proto definition for this message. If any rules +// are violated, an error is returned. +func (m *MACCommand_PingSlotChannelReq) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_DLChannelReqFieldPathsNested + paths = MACCommand_PingSlotChannelReqFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "channel_index": + case "frequency": - if m.GetChannelIndex() > 255 { - return MACCommand_DLChannelReqValidationError{ - field: "channel_index", - reason: "value must be less than or equal to 255", + if val := m.GetFrequency(); val > 0 && val < 100000 { + return MACCommand_PingSlotChannelReqValidationError{ + field: "frequency", + reason: "value must be outside range (0, 100000)", } } - case "frequency": + case "data_rate_index": - if m.GetFrequency() < 100000 { - return MACCommand_DLChannelReqValidationError{ - field: "frequency", - reason: "value must be greater than or equal to 100000", + if _, ok := DataRateIndex_name[int32(m.GetDataRateIndex())]; !ok { + return MACCommand_PingSlotChannelReqValidationError{ + field: "data_rate_index", + reason: "value must be one of the defined enum values", } } default: - return MACCommand_DLChannelReqValidationError{ + return MACCommand_PingSlotChannelReqValidationError{ field: name, reason: "invalid field path", } @@ -5244,9 +7409,10 @@ func (m *MACCommand_DLChannelReq) ValidateFields(paths ...string) error { return nil } -// MACCommand_DLChannelReqValidationError is the validation error returned by -// MACCommand_DLChannelReq.ValidateFields if the designated constraints aren't met. -type MACCommand_DLChannelReqValidationError struct { +// MACCommand_PingSlotChannelReqValidationError is the validation error +// returned by MACCommand_PingSlotChannelReq.ValidateFields if the designated +// constraints aren't met. +type MACCommand_PingSlotChannelReqValidationError struct { field string reason string cause error @@ -5254,24 +7420,24 @@ type MACCommand_DLChannelReqValidationError struct { } // Field function returns field value. -func (e MACCommand_DLChannelReqValidationError) Field() string { return e.field } +func (e MACCommand_PingSlotChannelReqValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_DLChannelReqValidationError) Reason() string { return e.reason } +func (e MACCommand_PingSlotChannelReqValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_DLChannelReqValidationError) Cause() error { return e.cause } +func (e MACCommand_PingSlotChannelReqValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_DLChannelReqValidationError) Key() bool { return e.key } +func (e MACCommand_PingSlotChannelReqValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_DLChannelReqValidationError) ErrorName() string { - return "MACCommand_DLChannelReqValidationError" +func (e MACCommand_PingSlotChannelReqValidationError) ErrorName() string { + return "MACCommand_PingSlotChannelReqValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_DLChannelReqValidationError) Error() string { +func (e MACCommand_PingSlotChannelReqValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -5283,14 +7449,14 @@ func (e MACCommand_DLChannelReqValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_DLChannelReq.%s: %s%s", + "invalid %sMACCommand_PingSlotChannelReq.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_DLChannelReqValidationError{} +var _ error = MACCommand_PingSlotChannelReqValidationError{} var _ interface { Field() string @@ -5298,29 +7464,29 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_DLChannelReqValidationError{} +} = MACCommand_PingSlotChannelReqValidationError{} -// ValidateFields checks the field values on MACCommand_DLChannelAns with the -// rules defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *MACCommand_DLChannelAns) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on MACCommand_PingSlotChannelAns with +// the rules defined in the proto definition for this message. If any rules +// are violated, an error is returned. +func (m *MACCommand_PingSlotChannelAns) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_DLChannelAnsFieldPathsNested + paths = MACCommand_PingSlotChannelAnsFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "channel_index_ack": - // no validation rules for ChannelIndexAck case "frequency_ack": // no validation rules for FrequencyAck + case "data_rate_index_ack": + // no validation rules for DataRateIndexAck default: - return MACCommand_DLChannelAnsValidationError{ + return MACCommand_PingSlotChannelAnsValidationError{ field: name, reason: "invalid field path", } @@ -5329,9 +7495,10 @@ func (m *MACCommand_DLChannelAns) ValidateFields(paths ...string) error { return nil } -// MACCommand_DLChannelAnsValidationError is the validation error returned by -// MACCommand_DLChannelAns.ValidateFields if the designated constraints aren't met. -type MACCommand_DLChannelAnsValidationError struct { +// MACCommand_PingSlotChannelAnsValidationError is the validation error +// returned by MACCommand_PingSlotChannelAns.ValidateFields if the designated +// constraints aren't met. +type MACCommand_PingSlotChannelAnsValidationError struct { field string reason string cause error @@ -5339,24 +7506,24 @@ type MACCommand_DLChannelAnsValidationError struct { } // Field function returns field value. -func (e MACCommand_DLChannelAnsValidationError) Field() string { return e.field } +func (e MACCommand_PingSlotChannelAnsValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_DLChannelAnsValidationError) Reason() string { return e.reason } +func (e MACCommand_PingSlotChannelAnsValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_DLChannelAnsValidationError) Cause() error { return e.cause } +func (e MACCommand_PingSlotChannelAnsValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_DLChannelAnsValidationError) Key() bool { return e.key } +func (e MACCommand_PingSlotChannelAnsValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_DLChannelAnsValidationError) ErrorName() string { - return "MACCommand_DLChannelAnsValidationError" +func (e MACCommand_PingSlotChannelAnsValidationError) ErrorName() string { + return "MACCommand_PingSlotChannelAnsValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_DLChannelAnsValidationError) Error() string { +func (e MACCommand_PingSlotChannelAnsValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -5368,14 +7535,14 @@ func (e MACCommand_DLChannelAnsValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_DLChannelAns.%s: %s%s", + "invalid %sMACCommand_PingSlotChannelAns.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_DLChannelAnsValidationError{} +var _ error = MACCommand_PingSlotChannelAnsValidationError{} var _ interface { Field() string @@ -5383,18 +7550,18 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_DLChannelAnsValidationError{} +} = MACCommand_PingSlotChannelAnsValidationError{} -// ValidateFields checks the field values on MACCommand_RxTimingSetupReq with +// ValidateFields checks the field values on MACCommand_BeaconTimingAns with // the rules defined in the proto definition for this message. If any rules // are violated, an error is returned. -func (m *MACCommand_RxTimingSetupReq) ValidateFields(paths ...string) error { +func (m *MACCommand_BeaconTimingAns) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_RxTimingSetupReqFieldPathsNested + paths = MACCommand_BeaconTimingAnsFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { @@ -5402,15 +7569,24 @@ func (m *MACCommand_RxTimingSetupReq) ValidateFields(paths ...string) error { switch name { case "delay": - if _, ok := RxDelay_name[int32(m.GetDelay())]; !ok { - return MACCommand_RxTimingSetupReqValidationError{ + if m.GetDelay() > 65535 { + return MACCommand_BeaconTimingAnsValidationError{ field: "delay", - reason: "value must be one of the defined enum values", + reason: "value must be less than or equal to 65535", + } + } + + case "channel_index": + + if m.GetChannelIndex() > 255 { + return MACCommand_BeaconTimingAnsValidationError{ + field: "channel_index", + reason: "value must be less than or equal to 255", } } default: - return MACCommand_RxTimingSetupReqValidationError{ + return MACCommand_BeaconTimingAnsValidationError{ field: name, reason: "invalid field path", } @@ -5419,10 +7595,10 @@ func (m *MACCommand_RxTimingSetupReq) ValidateFields(paths ...string) error { return nil } -// MACCommand_RxTimingSetupReqValidationError is the validation error returned -// by MACCommand_RxTimingSetupReq.ValidateFields if the designated constraints +// MACCommand_BeaconTimingAnsValidationError is the validation error returned +// by MACCommand_BeaconTimingAns.ValidateFields if the designated constraints // aren't met. -type MACCommand_RxTimingSetupReqValidationError struct { +type MACCommand_BeaconTimingAnsValidationError struct { field string reason string cause error @@ -5430,24 +7606,24 @@ type MACCommand_RxTimingSetupReqValidationError struct { } // Field function returns field value. -func (e MACCommand_RxTimingSetupReqValidationError) Field() string { return e.field } +func (e MACCommand_BeaconTimingAnsValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_RxTimingSetupReqValidationError) Reason() string { return e.reason } +func (e MACCommand_BeaconTimingAnsValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_RxTimingSetupReqValidationError) Cause() error { return e.cause } +func (e MACCommand_BeaconTimingAnsValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_RxTimingSetupReqValidationError) Key() bool { return e.key } +func (e MACCommand_BeaconTimingAnsValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_RxTimingSetupReqValidationError) ErrorName() string { - return "MACCommand_RxTimingSetupReqValidationError" +func (e MACCommand_BeaconTimingAnsValidationError) ErrorName() string { + return "MACCommand_BeaconTimingAnsValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_RxTimingSetupReqValidationError) Error() string { +func (e MACCommand_BeaconTimingAnsValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -5459,14 +7635,14 @@ func (e MACCommand_RxTimingSetupReqValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_RxTimingSetupReq.%s: %s%s", + "invalid %sMACCommand_BeaconTimingAns.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_RxTimingSetupReqValidationError{} +var _ error = MACCommand_BeaconTimingAnsValidationError{} var _ interface { Field() string @@ -5474,38 +7650,34 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_RxTimingSetupReqValidationError{} +} = MACCommand_BeaconTimingAnsValidationError{} -// ValidateFields checks the field values on MACCommand_TxParamSetupReq with -// the rules defined in the proto definition for this message. If any rules -// are violated, an error is returned. -func (m *MACCommand_TxParamSetupReq) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on MACCommand_BeaconFreqReq with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *MACCommand_BeaconFreqReq) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_TxParamSetupReqFieldPathsNested + paths = MACCommand_BeaconFreqReqFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "max_eirp_index": + case "frequency": - if _, ok := DeviceEIRP_name[int32(m.GetMaxEirpIndex())]; !ok { - return MACCommand_TxParamSetupReqValidationError{ - field: "max_eirp_index", - reason: "value must be one of the defined enum values", + if val := m.GetFrequency(); val > 0 && val < 100000 { + return MACCommand_BeaconFreqReqValidationError{ + field: "frequency", + reason: "value must be outside range (0, 100000)", } } - case "uplink_dwell_time": - // no validation rules for UplinkDwellTime - case "downlink_dwell_time": - // no validation rules for DownlinkDwellTime default: - return MACCommand_TxParamSetupReqValidationError{ + return MACCommand_BeaconFreqReqValidationError{ field: name, reason: "invalid field path", } @@ -5514,10 +7686,10 @@ func (m *MACCommand_TxParamSetupReq) ValidateFields(paths ...string) error { return nil } -// MACCommand_TxParamSetupReqValidationError is the validation error returned -// by MACCommand_TxParamSetupReq.ValidateFields if the designated constraints +// MACCommand_BeaconFreqReqValidationError is the validation error returned by +// MACCommand_BeaconFreqReq.ValidateFields if the designated constraints // aren't met. -type MACCommand_TxParamSetupReqValidationError struct { +type MACCommand_BeaconFreqReqValidationError struct { field string reason string cause error @@ -5525,24 +7697,24 @@ type MACCommand_TxParamSetupReqValidationError struct { } // Field function returns field value. -func (e MACCommand_TxParamSetupReqValidationError) Field() string { return e.field } +func (e MACCommand_BeaconFreqReqValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_TxParamSetupReqValidationError) Reason() string { return e.reason } +func (e MACCommand_BeaconFreqReqValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_TxParamSetupReqValidationError) Cause() error { return e.cause } +func (e MACCommand_BeaconFreqReqValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_TxParamSetupReqValidationError) Key() bool { return e.key } +func (e MACCommand_BeaconFreqReqValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_TxParamSetupReqValidationError) ErrorName() string { - return "MACCommand_TxParamSetupReqValidationError" +func (e MACCommand_BeaconFreqReqValidationError) ErrorName() string { + return "MACCommand_BeaconFreqReqValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_TxParamSetupReqValidationError) Error() string { +func (e MACCommand_BeaconFreqReqValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -5554,14 +7726,14 @@ func (e MACCommand_TxParamSetupReqValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_TxParamSetupReq.%s: %s%s", + "invalid %sMACCommand_BeaconFreqReq.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_TxParamSetupReqValidationError{} +var _ error = MACCommand_BeaconFreqReqValidationError{} var _ interface { Field() string @@ -5569,34 +7741,27 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_TxParamSetupReqValidationError{} +} = MACCommand_BeaconFreqReqValidationError{} -// ValidateFields checks the field values on MACCommand_RekeyInd with the rules -// defined in the proto definition for this message. If any rules are +// ValidateFields checks the field values on MACCommand_BeaconFreqAns with the +// rules defined in the proto definition for this message. If any rules are // violated, an error is returned. -func (m *MACCommand_RekeyInd) ValidateFields(paths ...string) error { +func (m *MACCommand_BeaconFreqAns) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_RekeyIndFieldPathsNested + paths = MACCommand_BeaconFreqAnsFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "minor_version": - - if _, ok := Minor_name[int32(m.GetMinorVersion())]; !ok { - return MACCommand_RekeyIndValidationError{ - field: "minor_version", - reason: "value must be one of the defined enum values", - } - } - + case "frequency_ack": + // no validation rules for FrequencyAck default: - return MACCommand_RekeyIndValidationError{ + return MACCommand_BeaconFreqAnsValidationError{ field: name, reason: "invalid field path", } @@ -5605,9 +7770,10 @@ func (m *MACCommand_RekeyInd) ValidateFields(paths ...string) error { return nil } -// MACCommand_RekeyIndValidationError is the validation error returned by -// MACCommand_RekeyInd.ValidateFields if the designated constraints aren't met. -type MACCommand_RekeyIndValidationError struct { +// MACCommand_BeaconFreqAnsValidationError is the validation error returned by +// MACCommand_BeaconFreqAns.ValidateFields if the designated constraints +// aren't met. +type MACCommand_BeaconFreqAnsValidationError struct { field string reason string cause error @@ -5615,24 +7781,24 @@ type MACCommand_RekeyIndValidationError struct { } // Field function returns field value. -func (e MACCommand_RekeyIndValidationError) Field() string { return e.field } +func (e MACCommand_BeaconFreqAnsValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_RekeyIndValidationError) Reason() string { return e.reason } +func (e MACCommand_BeaconFreqAnsValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_RekeyIndValidationError) Cause() error { return e.cause } +func (e MACCommand_BeaconFreqAnsValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_RekeyIndValidationError) Key() bool { return e.key } +func (e MACCommand_BeaconFreqAnsValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_RekeyIndValidationError) ErrorName() string { - return "MACCommand_RekeyIndValidationError" +func (e MACCommand_BeaconFreqAnsValidationError) ErrorName() string { + return "MACCommand_BeaconFreqAnsValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_RekeyIndValidationError) Error() string { +func (e MACCommand_BeaconFreqAnsValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -5644,14 +7810,14 @@ func (e MACCommand_RekeyIndValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_RekeyInd.%s: %s%s", + "invalid %sMACCommand_BeaconFreqAns.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_RekeyIndValidationError{} +var _ error = MACCommand_BeaconFreqAnsValidationError{} var _ interface { Field() string @@ -5659,34 +7825,34 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_RekeyIndValidationError{} +} = MACCommand_BeaconFreqAnsValidationError{} -// ValidateFields checks the field values on MACCommand_RekeyConf with the +// ValidateFields checks the field values on MACCommand_DeviceModeInd with the // rules defined in the proto definition for this message. If any rules are // violated, an error is returned. -func (m *MACCommand_RekeyConf) ValidateFields(paths ...string) error { +func (m *MACCommand_DeviceModeInd) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_RekeyConfFieldPathsNested + paths = MACCommand_DeviceModeIndFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "minor_version": + case "class": - if _, ok := Minor_name[int32(m.GetMinorVersion())]; !ok { - return MACCommand_RekeyConfValidationError{ - field: "minor_version", + if _, ok := Class_name[int32(m.GetClass())]; !ok { + return MACCommand_DeviceModeIndValidationError{ + field: "class", reason: "value must be one of the defined enum values", } } default: - return MACCommand_RekeyConfValidationError{ + return MACCommand_DeviceModeIndValidationError{ field: name, reason: "invalid field path", } @@ -5695,9 +7861,10 @@ func (m *MACCommand_RekeyConf) ValidateFields(paths ...string) error { return nil } -// MACCommand_RekeyConfValidationError is the validation error returned by -// MACCommand_RekeyConf.ValidateFields if the designated constraints aren't met. -type MACCommand_RekeyConfValidationError struct { +// MACCommand_DeviceModeIndValidationError is the validation error returned by +// MACCommand_DeviceModeInd.ValidateFields if the designated constraints +// aren't met. +type MACCommand_DeviceModeIndValidationError struct { field string reason string cause error @@ -5705,24 +7872,24 @@ type MACCommand_RekeyConfValidationError struct { } // Field function returns field value. -func (e MACCommand_RekeyConfValidationError) Field() string { return e.field } +func (e MACCommand_DeviceModeIndValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_RekeyConfValidationError) Reason() string { return e.reason } +func (e MACCommand_DeviceModeIndValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_RekeyConfValidationError) Cause() error { return e.cause } +func (e MACCommand_DeviceModeIndValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_RekeyConfValidationError) Key() bool { return e.key } +func (e MACCommand_DeviceModeIndValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_RekeyConfValidationError) ErrorName() string { - return "MACCommand_RekeyConfValidationError" +func (e MACCommand_DeviceModeIndValidationError) ErrorName() string { + return "MACCommand_DeviceModeIndValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_RekeyConfValidationError) Error() string { +func (e MACCommand_DeviceModeIndValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -5734,14 +7901,14 @@ func (e MACCommand_RekeyConfValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_RekeyConf.%s: %s%s", + "invalid %sMACCommand_DeviceModeInd.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_RekeyConfValidationError{} +var _ error = MACCommand_DeviceModeIndValidationError{} var _ interface { Field() string @@ -5749,43 +7916,34 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_RekeyConfValidationError{} +} = MACCommand_DeviceModeIndValidationError{} -// ValidateFields checks the field values on MACCommand_ADRParamSetupReq with -// the rules defined in the proto definition for this message. If any rules -// are violated, an error is returned. -func (m *MACCommand_ADRParamSetupReq) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on MACCommand_DeviceModeConf with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *MACCommand_DeviceModeConf) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_ADRParamSetupReqFieldPathsNested + paths = MACCommand_DeviceModeConfFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "adr_ack_limit_exponent": - - if _, ok := ADRAckLimitExponent_name[int32(m.GetAdrAckLimitExponent())]; !ok { - return MACCommand_ADRParamSetupReqValidationError{ - field: "adr_ack_limit_exponent", - reason: "value must be one of the defined enum values", - } - } - - case "adr_ack_delay_exponent": + case "class": - if _, ok := ADRAckDelayExponent_name[int32(m.GetAdrAckDelayExponent())]; !ok { - return MACCommand_ADRParamSetupReqValidationError{ - field: "adr_ack_delay_exponent", + if _, ok := Class_name[int32(m.GetClass())]; !ok { + return MACCommand_DeviceModeConfValidationError{ + field: "class", reason: "value must be one of the defined enum values", } } default: - return MACCommand_ADRParamSetupReqValidationError{ + return MACCommand_DeviceModeConfValidationError{ field: name, reason: "invalid field path", } @@ -5794,10 +7952,10 @@ func (m *MACCommand_ADRParamSetupReq) ValidateFields(paths ...string) error { return nil } -// MACCommand_ADRParamSetupReqValidationError is the validation error returned -// by MACCommand_ADRParamSetupReq.ValidateFields if the designated constraints +// MACCommand_DeviceModeConfValidationError is the validation error returned by +// MACCommand_DeviceModeConf.ValidateFields if the designated constraints // aren't met. -type MACCommand_ADRParamSetupReqValidationError struct { +type MACCommand_DeviceModeConfValidationError struct { field string reason string cause error @@ -5805,24 +7963,24 @@ type MACCommand_ADRParamSetupReqValidationError struct { } // Field function returns field value. -func (e MACCommand_ADRParamSetupReqValidationError) Field() string { return e.field } +func (e MACCommand_DeviceModeConfValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_ADRParamSetupReqValidationError) Reason() string { return e.reason } +func (e MACCommand_DeviceModeConfValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_ADRParamSetupReqValidationError) Cause() error { return e.cause } +func (e MACCommand_DeviceModeConfValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_ADRParamSetupReqValidationError) Key() bool { return e.key } +func (e MACCommand_DeviceModeConfValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_ADRParamSetupReqValidationError) ErrorName() string { - return "MACCommand_ADRParamSetupReqValidationError" +func (e MACCommand_DeviceModeConfValidationError) ErrorName() string { + return "MACCommand_DeviceModeConfValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_ADRParamSetupReqValidationError) Error() string { +func (e MACCommand_DeviceModeConfValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -5834,14 +7992,14 @@ func (e MACCommand_ADRParamSetupReqValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_ADRParamSetupReq.%s: %s%s", + "invalid %sMACCommand_DeviceModeConf.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_ADRParamSetupReqValidationError{} +var _ error = MACCommand_DeviceModeConfValidationError{} var _ interface { Field() string @@ -5849,34 +8007,37 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_ADRParamSetupReqValidationError{} +} = MACCommand_DeviceModeConfValidationError{} -// ValidateFields checks the field values on MACCommand_DeviceTimeAns with the +// ValidateFields checks the field values on MACCommand_RelayConfReq with the // rules defined in the proto definition for this message. If any rules are // violated, an error is returned. -func (m *MACCommand_DeviceTimeAns) ValidateFields(paths ...string) error { +func (m *MACCommand_RelayConfReq) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_DeviceTimeAnsFieldPathsNested + paths = MACCommand_RelayConfReqFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "time": + case "configuration": - if m.GetTime() == nil { - return MACCommand_DeviceTimeAnsValidationError{ - field: "time", - reason: "value is required", + if v, ok := interface{}(m.GetConfiguration()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommand_RelayConfReqValidationError{ + field: "configuration", + reason: "embedded message failed validation", + cause: err, + } } } default: - return MACCommand_DeviceTimeAnsValidationError{ + return MACCommand_RelayConfReqValidationError{ field: name, reason: "invalid field path", } @@ -5885,10 +8046,9 @@ func (m *MACCommand_DeviceTimeAns) ValidateFields(paths ...string) error { return nil } -// MACCommand_DeviceTimeAnsValidationError is the validation error returned by -// MACCommand_DeviceTimeAns.ValidateFields if the designated constraints -// aren't met. -type MACCommand_DeviceTimeAnsValidationError struct { +// MACCommand_RelayConfReqValidationError is the validation error returned by +// MACCommand_RelayConfReq.ValidateFields if the designated constraints aren't met. +type MACCommand_RelayConfReqValidationError struct { field string reason string cause error @@ -5896,24 +8056,24 @@ type MACCommand_DeviceTimeAnsValidationError struct { } // Field function returns field value. -func (e MACCommand_DeviceTimeAnsValidationError) Field() string { return e.field } +func (e MACCommand_RelayConfReqValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_DeviceTimeAnsValidationError) Reason() string { return e.reason } +func (e MACCommand_RelayConfReqValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_DeviceTimeAnsValidationError) Cause() error { return e.cause } +func (e MACCommand_RelayConfReqValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_DeviceTimeAnsValidationError) Key() bool { return e.key } +func (e MACCommand_RelayConfReqValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_DeviceTimeAnsValidationError) ErrorName() string { - return "MACCommand_DeviceTimeAnsValidationError" +func (e MACCommand_RelayConfReqValidationError) ErrorName() string { + return "MACCommand_RelayConfReqValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_DeviceTimeAnsValidationError) Error() string { +func (e MACCommand_RelayConfReqValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -5925,14 +8085,14 @@ func (e MACCommand_DeviceTimeAnsValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_DeviceTimeAns.%s: %s%s", + "invalid %sMACCommand_RelayConfReq.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_DeviceTimeAnsValidationError{} +var _ error = MACCommand_RelayConfReqValidationError{} var _ interface { Field() string @@ -5940,73 +8100,48 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_DeviceTimeAnsValidationError{} +} = MACCommand_RelayConfReqValidationError{} -// ValidateFields checks the field values on MACCommand_ForceRejoinReq with the +// ValidateFields checks the field values on MACCommand_RelayConfAns with the // rules defined in the proto definition for this message. If any rules are // violated, an error is returned. -func (m *MACCommand_ForceRejoinReq) ValidateFields(paths ...string) error { +func (m *MACCommand_RelayConfAns) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_ForceRejoinReqFieldPathsNested + paths = MACCommand_RelayConfAnsFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "rejoin_type": - - if _, ok := RejoinRequestType_name[int32(m.GetRejoinType())]; !ok { - return MACCommand_ForceRejoinReqValidationError{ - field: "rejoin_type", - reason: "value must be one of the defined enum values", - } - } - - case "data_rate_index": - - if _, ok := DataRateIndex_name[int32(m.GetDataRateIndex())]; !ok { - return MACCommand_ForceRejoinReqValidationError{ - field: "data_rate_index", - reason: "value must be one of the defined enum values", - } - } - - case "max_retries": - - if m.GetMaxRetries() > 7 { - return MACCommand_ForceRejoinReqValidationError{ - field: "max_retries", - reason: "value must be less than or equal to 7", - } - } - - case "period_exponent": - - if _, ok := RejoinPeriodExponent_name[int32(m.GetPeriodExponent())]; !ok { - return MACCommand_ForceRejoinReqValidationError{ - field: "period_exponent", - reason: "value must be one of the defined enum values", - } - } - + case "second_channel_frequency_ack": + // no validation rules for SecondChannelFrequencyAck + case "second_channel_ack_offset_ack": + // no validation rules for SecondChannelAckOffsetAck + case "second_channel_data_rate_index_ack": + // no validation rules for SecondChannelDataRateIndexAck + case "second_channel_index_ack": + // no validation rules for SecondChannelIndexAck + case "default_channel_index_ack": + // no validation rules for DefaultChannelIndexAck + case "cad_periodicity_ack": + // no validation rules for CadPeriodicityAck default: - return MACCommand_ForceRejoinReqValidationError{ + return MACCommand_RelayConfAnsValidationError{ field: name, reason: "invalid field path", } } } - return nil -} - -// MACCommand_ForceRejoinReqValidationError is the validation error returned by -// MACCommand_ForceRejoinReq.ValidateFields if the designated constraints -// aren't met. -type MACCommand_ForceRejoinReqValidationError struct { + return nil +} + +// MACCommand_RelayConfAnsValidationError is the validation error returned by +// MACCommand_RelayConfAns.ValidateFields if the designated constraints aren't met. +type MACCommand_RelayConfAnsValidationError struct { field string reason string cause error @@ -6014,24 +8149,24 @@ type MACCommand_ForceRejoinReqValidationError struct { } // Field function returns field value. -func (e MACCommand_ForceRejoinReqValidationError) Field() string { return e.field } +func (e MACCommand_RelayConfAnsValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_ForceRejoinReqValidationError) Reason() string { return e.reason } +func (e MACCommand_RelayConfAnsValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_ForceRejoinReqValidationError) Cause() error { return e.cause } +func (e MACCommand_RelayConfAnsValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_ForceRejoinReqValidationError) Key() bool { return e.key } +func (e MACCommand_RelayConfAnsValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_ForceRejoinReqValidationError) ErrorName() string { - return "MACCommand_ForceRejoinReqValidationError" +func (e MACCommand_RelayConfAnsValidationError) ErrorName() string { + return "MACCommand_RelayConfAnsValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_ForceRejoinReqValidationError) Error() string { +func (e MACCommand_RelayConfAnsValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -6043,14 +8178,14 @@ func (e MACCommand_ForceRejoinReqValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_ForceRejoinReq.%s: %s%s", + "invalid %sMACCommand_RelayConfAns.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_ForceRejoinReqValidationError{} +var _ error = MACCommand_RelayConfAnsValidationError{} var _ interface { Field() string @@ -6058,43 +8193,37 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_ForceRejoinReqValidationError{} +} = MACCommand_RelayConfAnsValidationError{} -// ValidateFields checks the field values on MACCommand_RejoinParamSetupReq +// ValidateFields checks the field values on MACCommand_RelayEndDeviceConfReq // with the rules defined in the proto definition for this message. If any // rules are violated, an error is returned. -func (m *MACCommand_RejoinParamSetupReq) ValidateFields(paths ...string) error { +func (m *MACCommand_RelayEndDeviceConfReq) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_RejoinParamSetupReqFieldPathsNested + paths = MACCommand_RelayEndDeviceConfReqFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "max_count_exponent": - - if _, ok := RejoinCountExponent_name[int32(m.GetMaxCountExponent())]; !ok { - return MACCommand_RejoinParamSetupReqValidationError{ - field: "max_count_exponent", - reason: "value must be one of the defined enum values", - } - } + case "configuration": - case "max_time_exponent": - - if _, ok := RejoinTimeExponent_name[int32(m.GetMaxTimeExponent())]; !ok { - return MACCommand_RejoinParamSetupReqValidationError{ - field: "max_time_exponent", - reason: "value must be one of the defined enum values", + if v, ok := interface{}(m.GetConfiguration()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommand_RelayEndDeviceConfReqValidationError{ + field: "configuration", + reason: "embedded message failed validation", + cause: err, + } } } default: - return MACCommand_RejoinParamSetupReqValidationError{ + return MACCommand_RelayEndDeviceConfReqValidationError{ field: name, reason: "invalid field path", } @@ -6103,10 +8232,10 @@ func (m *MACCommand_RejoinParamSetupReq) ValidateFields(paths ...string) error { return nil } -// MACCommand_RejoinParamSetupReqValidationError is the validation error -// returned by MACCommand_RejoinParamSetupReq.ValidateFields if the designated -// constraints aren't met. -type MACCommand_RejoinParamSetupReqValidationError struct { +// MACCommand_RelayEndDeviceConfReqValidationError is the validation error +// returned by MACCommand_RelayEndDeviceConfReq.ValidateFields if the +// designated constraints aren't met. +type MACCommand_RelayEndDeviceConfReqValidationError struct { field string reason string cause error @@ -6114,24 +8243,24 @@ type MACCommand_RejoinParamSetupReqValidationError struct { } // Field function returns field value. -func (e MACCommand_RejoinParamSetupReqValidationError) Field() string { return e.field } +func (e MACCommand_RelayEndDeviceConfReqValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_RejoinParamSetupReqValidationError) Reason() string { return e.reason } +func (e MACCommand_RelayEndDeviceConfReqValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_RejoinParamSetupReqValidationError) Cause() error { return e.cause } +func (e MACCommand_RelayEndDeviceConfReqValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_RejoinParamSetupReqValidationError) Key() bool { return e.key } +func (e MACCommand_RelayEndDeviceConfReqValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_RejoinParamSetupReqValidationError) ErrorName() string { - return "MACCommand_RejoinParamSetupReqValidationError" +func (e MACCommand_RelayEndDeviceConfReqValidationError) ErrorName() string { + return "MACCommand_RelayEndDeviceConfReqValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_RejoinParamSetupReqValidationError) Error() string { +func (e MACCommand_RelayEndDeviceConfReqValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -6143,14 +8272,14 @@ func (e MACCommand_RejoinParamSetupReqValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_RejoinParamSetupReq.%s: %s%s", + "invalid %sMACCommand_RelayEndDeviceConfReq.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_RejoinParamSetupReqValidationError{} +var _ error = MACCommand_RelayEndDeviceConfReqValidationError{} var _ interface { Field() string @@ -6158,27 +8287,33 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_RejoinParamSetupReqValidationError{} +} = MACCommand_RelayEndDeviceConfReqValidationError{} -// ValidateFields checks the field values on MACCommand_RejoinParamSetupAns +// ValidateFields checks the field values on MACCommand_RelayEndDeviceConfAns // with the rules defined in the proto definition for this message. If any // rules are violated, an error is returned. -func (m *MACCommand_RejoinParamSetupAns) ValidateFields(paths ...string) error { +func (m *MACCommand_RelayEndDeviceConfAns) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_RejoinParamSetupAnsFieldPathsNested + paths = MACCommand_RelayEndDeviceConfAnsFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "max_time_exponent_ack": - // no validation rules for MaxTimeExponentAck + case "second_channel_frequency_ack": + // no validation rules for SecondChannelFrequencyAck + case "second_channel_data_rate_index_ack": + // no validation rules for SecondChannelDataRateIndexAck + case "second_channel_index_ack": + // no validation rules for SecondChannelIndexAck + case "backoff_ack": + // no validation rules for BackoffAck default: - return MACCommand_RejoinParamSetupAnsValidationError{ + return MACCommand_RelayEndDeviceConfAnsValidationError{ field: name, reason: "invalid field path", } @@ -6187,10 +8322,10 @@ func (m *MACCommand_RejoinParamSetupAns) ValidateFields(paths ...string) error { return nil } -// MACCommand_RejoinParamSetupAnsValidationError is the validation error -// returned by MACCommand_RejoinParamSetupAns.ValidateFields if the designated -// constraints aren't met. -type MACCommand_RejoinParamSetupAnsValidationError struct { +// MACCommand_RelayEndDeviceConfAnsValidationError is the validation error +// returned by MACCommand_RelayEndDeviceConfAns.ValidateFields if the +// designated constraints aren't met. +type MACCommand_RelayEndDeviceConfAnsValidationError struct { field string reason string cause error @@ -6198,24 +8333,24 @@ type MACCommand_RejoinParamSetupAnsValidationError struct { } // Field function returns field value. -func (e MACCommand_RejoinParamSetupAnsValidationError) Field() string { return e.field } +func (e MACCommand_RelayEndDeviceConfAnsValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_RejoinParamSetupAnsValidationError) Reason() string { return e.reason } +func (e MACCommand_RelayEndDeviceConfAnsValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_RejoinParamSetupAnsValidationError) Cause() error { return e.cause } +func (e MACCommand_RelayEndDeviceConfAnsValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_RejoinParamSetupAnsValidationError) Key() bool { return e.key } +func (e MACCommand_RelayEndDeviceConfAnsValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_RejoinParamSetupAnsValidationError) ErrorName() string { - return "MACCommand_RejoinParamSetupAnsValidationError" +func (e MACCommand_RelayEndDeviceConfAnsValidationError) ErrorName() string { + return "MACCommand_RelayEndDeviceConfAnsValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_RejoinParamSetupAnsValidationError) Error() string { +func (e MACCommand_RelayEndDeviceConfAnsValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -6227,14 +8362,14 @@ func (e MACCommand_RejoinParamSetupAnsValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_RejoinParamSetupAns.%s: %s%s", + "invalid %sMACCommand_RelayEndDeviceConfAns.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_RejoinParamSetupAnsValidationError{} +var _ error = MACCommand_RelayEndDeviceConfAnsValidationError{} var _ interface { Field() string @@ -6242,34 +8377,92 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_RejoinParamSetupAnsValidationError{} +} = MACCommand_RelayEndDeviceConfAnsValidationError{} -// ValidateFields checks the field values on MACCommand_PingSlotInfoReq with -// the rules defined in the proto definition for this message. If any rules -// are violated, an error is returned. -func (m *MACCommand_PingSlotInfoReq) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on +// MACCommand_RelayUpdateUplinkListReq with the rules defined in the proto +// definition for this message. If any rules are violated, an error is returned. +func (m *MACCommand_RelayUpdateUplinkListReq) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_PingSlotInfoReqFieldPathsNested + paths = MACCommand_RelayUpdateUplinkListReqFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "period": + case "rule_index": - if _, ok := PingSlotPeriod_name[int32(m.GetPeriod())]; !ok { - return MACCommand_PingSlotInfoReqValidationError{ - field: "period", - reason: "value must be one of the defined enum values", + if m.GetRuleIndex() > 15 { + return MACCommand_RelayUpdateUplinkListReqValidationError{ + field: "rule_index", + reason: "value must be less than or equal to 15", + } + } + + case "forward_limits": + + if v, ok := interface{}(m.GetForwardLimits()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommand_RelayUpdateUplinkListReqValidationError{ + field: "forward_limits", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "dev_addr": + + if len(m.GetDevAddr()) > 0 { + + if len(m.GetDevAddr()) != 4 { + return MACCommand_RelayUpdateUplinkListReqValidationError{ + field: "dev_addr", + reason: "value length must be 4 bytes", + } + } + + } + + case "w_f_cnt": + // no validation rules for WFCnt + case "root_wor_s_key": + + if len(m.GetRootWorSKey()) > 0 { + + if len(m.GetRootWorSKey()) != 16 { + return MACCommand_RelayUpdateUplinkListReqValidationError{ + field: "root_wor_s_key", + reason: "value length must be 16 bytes", + } + } + + } + + case "device_id": + + if utf8.RuneCountInString(m.GetDeviceId()) > 36 { + return MACCommand_RelayUpdateUplinkListReqValidationError{ + field: "device_id", + reason: "value length must be at most 36 runes", + } + } + + if !_MACCommand_RelayUpdateUplinkListReq_DeviceId_Pattern.MatchString(m.GetDeviceId()) { + return MACCommand_RelayUpdateUplinkListReqValidationError{ + field: "device_id", + reason: "value does not match regex pattern \"^[a-z0-9](?:[-]?[a-z0-9]){2,}$\"", } } + case "session_key_id": + // no validation rules for SessionKeyId default: - return MACCommand_PingSlotInfoReqValidationError{ + return MACCommand_RelayUpdateUplinkListReqValidationError{ field: name, reason: "invalid field path", } @@ -6278,10 +8471,10 @@ func (m *MACCommand_PingSlotInfoReq) ValidateFields(paths ...string) error { return nil } -// MACCommand_PingSlotInfoReqValidationError is the validation error returned -// by MACCommand_PingSlotInfoReq.ValidateFields if the designated constraints -// aren't met. -type MACCommand_PingSlotInfoReqValidationError struct { +// MACCommand_RelayUpdateUplinkListReqValidationError is the validation error +// returned by MACCommand_RelayUpdateUplinkListReq.ValidateFields if the +// designated constraints aren't met. +type MACCommand_RelayUpdateUplinkListReqValidationError struct { field string reason string cause error @@ -6289,24 +8482,24 @@ type MACCommand_PingSlotInfoReqValidationError struct { } // Field function returns field value. -func (e MACCommand_PingSlotInfoReqValidationError) Field() string { return e.field } +func (e MACCommand_RelayUpdateUplinkListReqValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_PingSlotInfoReqValidationError) Reason() string { return e.reason } +func (e MACCommand_RelayUpdateUplinkListReqValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_PingSlotInfoReqValidationError) Cause() error { return e.cause } +func (e MACCommand_RelayUpdateUplinkListReqValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_PingSlotInfoReqValidationError) Key() bool { return e.key } +func (e MACCommand_RelayUpdateUplinkListReqValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_PingSlotInfoReqValidationError) ErrorName() string { - return "MACCommand_PingSlotInfoReqValidationError" +func (e MACCommand_RelayUpdateUplinkListReqValidationError) ErrorName() string { + return "MACCommand_RelayUpdateUplinkListReqValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_PingSlotInfoReqValidationError) Error() string { +func (e MACCommand_RelayUpdateUplinkListReqValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -6318,14 +8511,14 @@ func (e MACCommand_PingSlotInfoReqValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_PingSlotInfoReq.%s: %s%s", + "invalid %sMACCommand_RelayUpdateUplinkListReq.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_PingSlotInfoReqValidationError{} +var _ error = MACCommand_RelayUpdateUplinkListReqValidationError{} var _ interface { Field() string @@ -6333,43 +8526,105 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_PingSlotInfoReqValidationError{} +} = MACCommand_RelayUpdateUplinkListReqValidationError{} -// ValidateFields checks the field values on MACCommand_PingSlotChannelReq with -// the rules defined in the proto definition for this message. If any rules -// are violated, an error is returned. -func (m *MACCommand_PingSlotChannelReq) ValidateFields(paths ...string) error { +var _MACCommand_RelayUpdateUplinkListReq_DeviceId_Pattern = regexp.MustCompile("^[a-z0-9](?:[-]?[a-z0-9]){2,}$") + +// ValidateFields checks the field values on +// MACCommand_RelayUpdateUplinkListAns with the rules defined in the proto +// definition for this message. If any rules are violated, an error is returned. +func (m *MACCommand_RelayUpdateUplinkListAns) ValidateFields(paths ...string) error { + if len(paths) > 0 { + return fmt.Errorf("message MACCommand_RelayUpdateUplinkListAns has no fields, but paths %s were specified", paths) + } + return nil +} + +// MACCommand_RelayUpdateUplinkListAnsValidationError is the validation error +// returned by MACCommand_RelayUpdateUplinkListAns.ValidateFields if the +// designated constraints aren't met. +type MACCommand_RelayUpdateUplinkListAnsValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e MACCommand_RelayUpdateUplinkListAnsValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e MACCommand_RelayUpdateUplinkListAnsValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e MACCommand_RelayUpdateUplinkListAnsValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e MACCommand_RelayUpdateUplinkListAnsValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e MACCommand_RelayUpdateUplinkListAnsValidationError) ErrorName() string { + return "MACCommand_RelayUpdateUplinkListAnsValidationError" +} + +// Error satisfies the builtin error interface +func (e MACCommand_RelayUpdateUplinkListAnsValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sMACCommand_RelayUpdateUplinkListAns.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = MACCommand_RelayUpdateUplinkListAnsValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = MACCommand_RelayUpdateUplinkListAnsValidationError{} + +// ValidateFields checks the field values on MACCommand_RelayCtrlUplinkListReq +// with the rules defined in the proto definition for this message. If any +// rules are violated, an error is returned. +func (m *MACCommand_RelayCtrlUplinkListReq) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_PingSlotChannelReqFieldPathsNested + paths = MACCommand_RelayCtrlUplinkListReqFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "frequency": - - if val := m.GetFrequency(); val > 0 && val < 100000 { - return MACCommand_PingSlotChannelReqValidationError{ - field: "frequency", - reason: "value must be outside range (0, 100000)", - } - } + case "rule_index": - case "data_rate_index": - - if _, ok := DataRateIndex_name[int32(m.GetDataRateIndex())]; !ok { - return MACCommand_PingSlotChannelReqValidationError{ - field: "data_rate_index", - reason: "value must be one of the defined enum values", + if m.GetRuleIndex() > 15 { + return MACCommand_RelayCtrlUplinkListReqValidationError{ + field: "rule_index", + reason: "value must be less than or equal to 15", } } + case "action": + // no validation rules for Action default: - return MACCommand_PingSlotChannelReqValidationError{ + return MACCommand_RelayCtrlUplinkListReqValidationError{ field: name, reason: "invalid field path", } @@ -6378,10 +8633,10 @@ func (m *MACCommand_PingSlotChannelReq) ValidateFields(paths ...string) error { return nil } -// MACCommand_PingSlotChannelReqValidationError is the validation error -// returned by MACCommand_PingSlotChannelReq.ValidateFields if the designated -// constraints aren't met. -type MACCommand_PingSlotChannelReqValidationError struct { +// MACCommand_RelayCtrlUplinkListReqValidationError is the validation error +// returned by MACCommand_RelayCtrlUplinkListReq.ValidateFields if the +// designated constraints aren't met. +type MACCommand_RelayCtrlUplinkListReqValidationError struct { field string reason string cause error @@ -6389,24 +8644,24 @@ type MACCommand_PingSlotChannelReqValidationError struct { } // Field function returns field value. -func (e MACCommand_PingSlotChannelReqValidationError) Field() string { return e.field } +func (e MACCommand_RelayCtrlUplinkListReqValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_PingSlotChannelReqValidationError) Reason() string { return e.reason } +func (e MACCommand_RelayCtrlUplinkListReqValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_PingSlotChannelReqValidationError) Cause() error { return e.cause } +func (e MACCommand_RelayCtrlUplinkListReqValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_PingSlotChannelReqValidationError) Key() bool { return e.key } +func (e MACCommand_RelayCtrlUplinkListReqValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_PingSlotChannelReqValidationError) ErrorName() string { - return "MACCommand_PingSlotChannelReqValidationError" +func (e MACCommand_RelayCtrlUplinkListReqValidationError) ErrorName() string { + return "MACCommand_RelayCtrlUplinkListReqValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_PingSlotChannelReqValidationError) Error() string { +func (e MACCommand_RelayCtrlUplinkListReqValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -6418,14 +8673,14 @@ func (e MACCommand_PingSlotChannelReqValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_PingSlotChannelReq.%s: %s%s", + "invalid %sMACCommand_RelayCtrlUplinkListReq.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_PingSlotChannelReqValidationError{} +var _ error = MACCommand_RelayCtrlUplinkListReqValidationError{} var _ interface { Field() string @@ -6433,29 +8688,29 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_PingSlotChannelReqValidationError{} +} = MACCommand_RelayCtrlUplinkListReqValidationError{} -// ValidateFields checks the field values on MACCommand_PingSlotChannelAns with -// the rules defined in the proto definition for this message. If any rules -// are violated, an error is returned. -func (m *MACCommand_PingSlotChannelAns) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on MACCommand_RelayCtrlUplinkListAns +// with the rules defined in the proto definition for this message. If any +// rules are violated, an error is returned. +func (m *MACCommand_RelayCtrlUplinkListAns) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_PingSlotChannelAnsFieldPathsNested + paths = MACCommand_RelayCtrlUplinkListAnsFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "frequency_ack": - // no validation rules for FrequencyAck - case "data_rate_index_ack": - // no validation rules for DataRateIndexAck + case "rule_index_ack": + // no validation rules for RuleIndexAck + case "w_f_cnt": + // no validation rules for WFCnt default: - return MACCommand_PingSlotChannelAnsValidationError{ + return MACCommand_RelayCtrlUplinkListAnsValidationError{ field: name, reason: "invalid field path", } @@ -6464,10 +8719,10 @@ func (m *MACCommand_PingSlotChannelAns) ValidateFields(paths ...string) error { return nil } -// MACCommand_PingSlotChannelAnsValidationError is the validation error -// returned by MACCommand_PingSlotChannelAns.ValidateFields if the designated -// constraints aren't met. -type MACCommand_PingSlotChannelAnsValidationError struct { +// MACCommand_RelayCtrlUplinkListAnsValidationError is the validation error +// returned by MACCommand_RelayCtrlUplinkListAns.ValidateFields if the +// designated constraints aren't met. +type MACCommand_RelayCtrlUplinkListAnsValidationError struct { field string reason string cause error @@ -6475,24 +8730,24 @@ type MACCommand_PingSlotChannelAnsValidationError struct { } // Field function returns field value. -func (e MACCommand_PingSlotChannelAnsValidationError) Field() string { return e.field } +func (e MACCommand_RelayCtrlUplinkListAnsValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_PingSlotChannelAnsValidationError) Reason() string { return e.reason } +func (e MACCommand_RelayCtrlUplinkListAnsValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_PingSlotChannelAnsValidationError) Cause() error { return e.cause } +func (e MACCommand_RelayCtrlUplinkListAnsValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_PingSlotChannelAnsValidationError) Key() bool { return e.key } +func (e MACCommand_RelayCtrlUplinkListAnsValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_PingSlotChannelAnsValidationError) ErrorName() string { - return "MACCommand_PingSlotChannelAnsValidationError" +func (e MACCommand_RelayCtrlUplinkListAnsValidationError) ErrorName() string { + return "MACCommand_RelayCtrlUplinkListAnsValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_PingSlotChannelAnsValidationError) Error() string { +func (e MACCommand_RelayCtrlUplinkListAnsValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -6504,14 +8759,14 @@ func (e MACCommand_PingSlotChannelAnsValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_PingSlotChannelAns.%s: %s%s", + "invalid %sMACCommand_RelayCtrlUplinkListAns.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_PingSlotChannelAnsValidationError{} +var _ error = MACCommand_RelayCtrlUplinkListAnsValidationError{} var _ interface { Field() string @@ -6519,43 +8774,75 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_PingSlotChannelAnsValidationError{} +} = MACCommand_RelayCtrlUplinkListAnsValidationError{} -// ValidateFields checks the field values on MACCommand_BeaconTimingAns with -// the rules defined in the proto definition for this message. If any rules -// are violated, an error is returned. -func (m *MACCommand_BeaconTimingAns) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on +// MACCommand_RelayConfigureFwdLimitReq with the rules defined in the proto +// definition for this message. If any rules are violated, an error is returned. +func (m *MACCommand_RelayConfigureFwdLimitReq) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_BeaconTimingAnsFieldPathsNested + paths = MACCommand_RelayConfigureFwdLimitReqFieldPathsNested } - for name, subs := range _processPaths(append(paths[:0:0], paths...)) { - _ = subs - switch name { - case "delay": + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "reset_limit_counter": + // no validation rules for ResetLimitCounter + case "join_request_limits": + + if v, ok := interface{}(m.GetJoinRequestLimits()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommand_RelayConfigureFwdLimitReqValidationError{ + field: "join_request_limits", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "notify_limits": - if m.GetDelay() > 65535 { - return MACCommand_BeaconTimingAnsValidationError{ - field: "delay", - reason: "value must be less than or equal to 65535", + if v, ok := interface{}(m.GetNotifyLimits()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommand_RelayConfigureFwdLimitReqValidationError{ + field: "notify_limits", + reason: "embedded message failed validation", + cause: err, + } } } - case "channel_index": + case "global_uplink_limits": - if m.GetChannelIndex() > 255 { - return MACCommand_BeaconTimingAnsValidationError{ - field: "channel_index", - reason: "value must be less than or equal to 255", + if v, ok := interface{}(m.GetGlobalUplinkLimits()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommand_RelayConfigureFwdLimitReqValidationError{ + field: "global_uplink_limits", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "overall_limits": + + if v, ok := interface{}(m.GetOverallLimits()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommand_RelayConfigureFwdLimitReqValidationError{ + field: "overall_limits", + reason: "embedded message failed validation", + cause: err, + } } } default: - return MACCommand_BeaconTimingAnsValidationError{ + return MACCommand_RelayConfigureFwdLimitReqValidationError{ field: name, reason: "invalid field path", } @@ -6564,10 +8851,10 @@ func (m *MACCommand_BeaconTimingAns) ValidateFields(paths ...string) error { return nil } -// MACCommand_BeaconTimingAnsValidationError is the validation error returned -// by MACCommand_BeaconTimingAns.ValidateFields if the designated constraints -// aren't met. -type MACCommand_BeaconTimingAnsValidationError struct { +// MACCommand_RelayConfigureFwdLimitReqValidationError is the validation error +// returned by MACCommand_RelayConfigureFwdLimitReq.ValidateFields if the +// designated constraints aren't met. +type MACCommand_RelayConfigureFwdLimitReqValidationError struct { field string reason string cause error @@ -6575,24 +8862,24 @@ type MACCommand_BeaconTimingAnsValidationError struct { } // Field function returns field value. -func (e MACCommand_BeaconTimingAnsValidationError) Field() string { return e.field } +func (e MACCommand_RelayConfigureFwdLimitReqValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_BeaconTimingAnsValidationError) Reason() string { return e.reason } +func (e MACCommand_RelayConfigureFwdLimitReqValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_BeaconTimingAnsValidationError) Cause() error { return e.cause } +func (e MACCommand_RelayConfigureFwdLimitReqValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_BeaconTimingAnsValidationError) Key() bool { return e.key } +func (e MACCommand_RelayConfigureFwdLimitReqValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_BeaconTimingAnsValidationError) ErrorName() string { - return "MACCommand_BeaconTimingAnsValidationError" +func (e MACCommand_RelayConfigureFwdLimitReqValidationError) ErrorName() string { + return "MACCommand_RelayConfigureFwdLimitReqValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_BeaconTimingAnsValidationError) Error() string { +func (e MACCommand_RelayConfigureFwdLimitReqValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -6604,14 +8891,14 @@ func (e MACCommand_BeaconTimingAnsValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_BeaconTimingAns.%s: %s%s", + "invalid %sMACCommand_RelayConfigureFwdLimitReq.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_BeaconTimingAnsValidationError{} +var _ error = MACCommand_RelayConfigureFwdLimitReqValidationError{} var _ interface { Field() string @@ -6619,46 +8906,22 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_BeaconTimingAnsValidationError{} - -// ValidateFields checks the field values on MACCommand_BeaconFreqReq with the -// rules defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *MACCommand_BeaconFreqReq) ValidateFields(paths ...string) error { - if m == nil { - return nil - } - - if len(paths) == 0 { - paths = MACCommand_BeaconFreqReqFieldPathsNested - } - - for name, subs := range _processPaths(append(paths[:0:0], paths...)) { - _ = subs - switch name { - case "frequency": - - if val := m.GetFrequency(); val > 0 && val < 100000 { - return MACCommand_BeaconFreqReqValidationError{ - field: "frequency", - reason: "value must be outside range (0, 100000)", - } - } +} = MACCommand_RelayConfigureFwdLimitReqValidationError{} - default: - return MACCommand_BeaconFreqReqValidationError{ - field: name, - reason: "invalid field path", - } - } +// ValidateFields checks the field values on +// MACCommand_RelayConfigureFwdLimitAns with the rules defined in the proto +// definition for this message. If any rules are violated, an error is returned. +func (m *MACCommand_RelayConfigureFwdLimitAns) ValidateFields(paths ...string) error { + if len(paths) > 0 { + return fmt.Errorf("message MACCommand_RelayConfigureFwdLimitAns has no fields, but paths %s were specified", paths) } return nil } -// MACCommand_BeaconFreqReqValidationError is the validation error returned by -// MACCommand_BeaconFreqReq.ValidateFields if the designated constraints -// aren't met. -type MACCommand_BeaconFreqReqValidationError struct { +// MACCommand_RelayConfigureFwdLimitAnsValidationError is the validation error +// returned by MACCommand_RelayConfigureFwdLimitAns.ValidateFields if the +// designated constraints aren't met. +type MACCommand_RelayConfigureFwdLimitAnsValidationError struct { field string reason string cause error @@ -6666,24 +8929,24 @@ type MACCommand_BeaconFreqReqValidationError struct { } // Field function returns field value. -func (e MACCommand_BeaconFreqReqValidationError) Field() string { return e.field } +func (e MACCommand_RelayConfigureFwdLimitAnsValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_BeaconFreqReqValidationError) Reason() string { return e.reason } +func (e MACCommand_RelayConfigureFwdLimitAnsValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_BeaconFreqReqValidationError) Cause() error { return e.cause } +func (e MACCommand_RelayConfigureFwdLimitAnsValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_BeaconFreqReqValidationError) Key() bool { return e.key } +func (e MACCommand_RelayConfigureFwdLimitAnsValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_BeaconFreqReqValidationError) ErrorName() string { - return "MACCommand_BeaconFreqReqValidationError" +func (e MACCommand_RelayConfigureFwdLimitAnsValidationError) ErrorName() string { + return "MACCommand_RelayConfigureFwdLimitAnsValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_BeaconFreqReqValidationError) Error() string { +func (e MACCommand_RelayConfigureFwdLimitAnsValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -6695,14 +8958,14 @@ func (e MACCommand_BeaconFreqReqValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_BeaconFreqReq.%s: %s%s", + "invalid %sMACCommand_RelayConfigureFwdLimitAns.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_BeaconFreqReqValidationError{} +var _ error = MACCommand_RelayConfigureFwdLimitAnsValidationError{} var _ interface { Field() string @@ -6710,27 +8973,56 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_BeaconFreqReqValidationError{} +} = MACCommand_RelayConfigureFwdLimitAnsValidationError{} -// ValidateFields checks the field values on MACCommand_BeaconFreqAns with the -// rules defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *MACCommand_BeaconFreqAns) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on +// MACCommand_RelayNotifyNewEndDeviceReq with the rules defined in the proto +// definition for this message. If any rules are violated, an error is returned. +func (m *MACCommand_RelayNotifyNewEndDeviceReq) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_BeaconFreqAnsFieldPathsNested + paths = MACCommand_RelayNotifyNewEndDeviceReqFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "frequency_ack": - // no validation rules for FrequencyAck + case "dev_addr": + + if len(m.GetDevAddr()) > 0 { + + if len(m.GetDevAddr()) != 4 { + return MACCommand_RelayNotifyNewEndDeviceReqValidationError{ + field: "dev_addr", + reason: "value length must be 4 bytes", + } + } + + } + + case "snr": + + if val := m.GetSnr(); val < -20 || val > 11 { + return MACCommand_RelayNotifyNewEndDeviceReqValidationError{ + field: "snr", + reason: "value must be inside range [-20, 11]", + } + } + + case "rssi": + + if val := m.GetRssi(); val < -142 || val > -15 { + return MACCommand_RelayNotifyNewEndDeviceReqValidationError{ + field: "rssi", + reason: "value must be inside range [-142, -15]", + } + } + default: - return MACCommand_BeaconFreqAnsValidationError{ + return MACCommand_RelayNotifyNewEndDeviceReqValidationError{ field: name, reason: "invalid field path", } @@ -6739,10 +9031,10 @@ func (m *MACCommand_BeaconFreqAns) ValidateFields(paths ...string) error { return nil } -// MACCommand_BeaconFreqAnsValidationError is the validation error returned by -// MACCommand_BeaconFreqAns.ValidateFields if the designated constraints -// aren't met. -type MACCommand_BeaconFreqAnsValidationError struct { +// MACCommand_RelayNotifyNewEndDeviceReqValidationError is the validation error +// returned by MACCommand_RelayNotifyNewEndDeviceReq.ValidateFields if the +// designated constraints aren't met. +type MACCommand_RelayNotifyNewEndDeviceReqValidationError struct { field string reason string cause error @@ -6750,24 +9042,24 @@ type MACCommand_BeaconFreqAnsValidationError struct { } // Field function returns field value. -func (e MACCommand_BeaconFreqAnsValidationError) Field() string { return e.field } +func (e MACCommand_RelayNotifyNewEndDeviceReqValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_BeaconFreqAnsValidationError) Reason() string { return e.reason } +func (e MACCommand_RelayNotifyNewEndDeviceReqValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_BeaconFreqAnsValidationError) Cause() error { return e.cause } +func (e MACCommand_RelayNotifyNewEndDeviceReqValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_BeaconFreqAnsValidationError) Key() bool { return e.key } +func (e MACCommand_RelayNotifyNewEndDeviceReqValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_BeaconFreqAnsValidationError) ErrorName() string { - return "MACCommand_BeaconFreqAnsValidationError" +func (e MACCommand_RelayNotifyNewEndDeviceReqValidationError) ErrorName() string { + return "MACCommand_RelayNotifyNewEndDeviceReqValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_BeaconFreqAnsValidationError) Error() string { +func (e MACCommand_RelayNotifyNewEndDeviceReqValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -6779,14 +9071,14 @@ func (e MACCommand_BeaconFreqAnsValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_BeaconFreqAns.%s: %s%s", + "invalid %sMACCommand_RelayNotifyNewEndDeviceReq.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_BeaconFreqAnsValidationError{} +var _ error = MACCommand_RelayNotifyNewEndDeviceReqValidationError{} var _ interface { Field() string @@ -6794,34 +9086,55 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_BeaconFreqAnsValidationError{} +} = MACCommand_RelayNotifyNewEndDeviceReqValidationError{} -// ValidateFields checks the field values on MACCommand_DeviceModeInd with the -// rules defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *MACCommand_DeviceModeInd) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on +// MACCommand_RelayConfReq_Configuration with the rules defined in the proto +// definition for this message. If any rules are violated, an error is returned. +func (m *MACCommand_RelayConfReq_Configuration) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_DeviceModeIndFieldPathsNested + paths = MACCommand_RelayConfReq_ConfigurationFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "class": + case "second_channel": - if _, ok := Class_name[int32(m.GetClass())]; !ok { - return MACCommand_DeviceModeIndValidationError{ - field: "class", + if v, ok := interface{}(m.GetSecondChannel()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommand_RelayConfReq_ConfigurationValidationError{ + field: "second_channel", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "default_channel_index": + + if m.GetDefaultChannelIndex() > 255 { + return MACCommand_RelayConfReq_ConfigurationValidationError{ + field: "default_channel_index", + reason: "value must be less than or equal to 255", + } + } + + case "cad_periodicity": + + if _, ok := RelayCADPeriodicity_name[int32(m.GetCadPeriodicity())]; !ok { + return MACCommand_RelayConfReq_ConfigurationValidationError{ + field: "cad_periodicity", reason: "value must be one of the defined enum values", } } default: - return MACCommand_DeviceModeIndValidationError{ + return MACCommand_RelayConfReq_ConfigurationValidationError{ field: name, reason: "invalid field path", } @@ -6830,10 +9143,10 @@ func (m *MACCommand_DeviceModeInd) ValidateFields(paths ...string) error { return nil } -// MACCommand_DeviceModeIndValidationError is the validation error returned by -// MACCommand_DeviceModeInd.ValidateFields if the designated constraints -// aren't met. -type MACCommand_DeviceModeIndValidationError struct { +// MACCommand_RelayConfReq_ConfigurationValidationError is the validation error +// returned by MACCommand_RelayConfReq_Configuration.ValidateFields if the +// designated constraints aren't met. +type MACCommand_RelayConfReq_ConfigurationValidationError struct { field string reason string cause error @@ -6841,24 +9154,24 @@ type MACCommand_DeviceModeIndValidationError struct { } // Field function returns field value. -func (e MACCommand_DeviceModeIndValidationError) Field() string { return e.field } +func (e MACCommand_RelayConfReq_ConfigurationValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_DeviceModeIndValidationError) Reason() string { return e.reason } +func (e MACCommand_RelayConfReq_ConfigurationValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e MACCommand_DeviceModeIndValidationError) Cause() error { return e.cause } +func (e MACCommand_RelayConfReq_ConfigurationValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_DeviceModeIndValidationError) Key() bool { return e.key } +func (e MACCommand_RelayConfReq_ConfigurationValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_DeviceModeIndValidationError) ErrorName() string { - return "MACCommand_DeviceModeIndValidationError" +func (e MACCommand_RelayConfReq_ConfigurationValidationError) ErrorName() string { + return "MACCommand_RelayConfReq_ConfigurationValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_DeviceModeIndValidationError) Error() string { +func (e MACCommand_RelayConfReq_ConfigurationValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -6870,14 +9183,14 @@ func (e MACCommand_DeviceModeIndValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_DeviceModeInd.%s: %s%s", + "invalid %sMACCommand_RelayConfReq_Configuration.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_DeviceModeIndValidationError{} +var _ error = MACCommand_RelayConfReq_ConfigurationValidationError{} var _ interface { Field() string @@ -6885,34 +9198,128 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_DeviceModeIndValidationError{} +} = MACCommand_RelayConfReq_ConfigurationValidationError{} -// ValidateFields checks the field values on MACCommand_DeviceModeConf with the -// rules defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *MACCommand_DeviceModeConf) ValidateFields(paths ...string) error { +// ValidateFields checks the field values on +// MACCommand_RelayEndDeviceConfReq_Configuration with the rules defined in +// the proto definition for this message. If any rules are violated, an error +// is returned. +func (m *MACCommand_RelayEndDeviceConfReq_Configuration) ValidateFields(paths ...string) error { if m == nil { return nil } if len(paths) == 0 { - paths = MACCommand_DeviceModeConfFieldPathsNested + paths = MACCommand_RelayEndDeviceConfReq_ConfigurationFieldPathsNested } for name, subs := range _processPaths(append(paths[:0:0], paths...)) { _ = subs switch name { - case "class": + case "backoff": - if _, ok := Class_name[int32(m.GetClass())]; !ok { - return MACCommand_DeviceModeConfValidationError{ - field: "class", - reason: "value must be one of the defined enum values", + if m.GetBackoff() > 63 { + return MACCommand_RelayEndDeviceConfReq_ConfigurationValidationError{ + field: "backoff", + reason: "value must be less than or equal to 63", + } + } + + case "second_channel": + + if v, ok := interface{}(m.GetSecondChannel()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommand_RelayEndDeviceConfReq_ConfigurationValidationError{ + field: "second_channel", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "serving_device_id": + + if utf8.RuneCountInString(m.GetServingDeviceId()) > 36 { + return MACCommand_RelayEndDeviceConfReq_ConfigurationValidationError{ + field: "serving_device_id", + reason: "value length must be at most 36 runes", + } + } + + if !_MACCommand_RelayEndDeviceConfReq_Configuration_ServingDeviceId_Pattern.MatchString(m.GetServingDeviceId()) { + return MACCommand_RelayEndDeviceConfReq_ConfigurationValidationError{ + field: "serving_device_id", + reason: "value does not match regex pattern \"^[a-z0-9](?:[-]?[a-z0-9]){2,}$\"", + } + } + + case "mode": + if m.Mode == nil { + return MACCommand_RelayEndDeviceConfReq_ConfigurationValidationError{ + field: "mode", + reason: "value is required", + } + } + if len(subs) == 0 { + subs = []string{ + "always", "dynamic", "end_device_controlled", } } + for name, subs := range _processPaths(subs) { + _ = subs + switch name { + case "always": + w, ok := m.Mode.(*MACCommand_RelayEndDeviceConfReq_Configuration_Always) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetAlways()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommand_RelayEndDeviceConfReq_ConfigurationValidationError{ + field: "always", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "dynamic": + w, ok := m.Mode.(*MACCommand_RelayEndDeviceConfReq_Configuration_Dynamic) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetDynamic()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommand_RelayEndDeviceConfReq_ConfigurationValidationError{ + field: "dynamic", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "end_device_controlled": + w, ok := m.Mode.(*MACCommand_RelayEndDeviceConfReq_Configuration_EndDeviceControlled) + if !ok || w == nil { + continue + } + + if v, ok := interface{}(m.GetEndDeviceControlled()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return MACCommand_RelayEndDeviceConfReq_ConfigurationValidationError{ + field: "end_device_controlled", + reason: "embedded message failed validation", + cause: err, + } + } + } + } + } default: - return MACCommand_DeviceModeConfValidationError{ + return MACCommand_RelayEndDeviceConfReq_ConfigurationValidationError{ field: name, reason: "invalid field path", } @@ -6921,10 +9328,11 @@ func (m *MACCommand_DeviceModeConf) ValidateFields(paths ...string) error { return nil } -// MACCommand_DeviceModeConfValidationError is the validation error returned by -// MACCommand_DeviceModeConf.ValidateFields if the designated constraints -// aren't met. -type MACCommand_DeviceModeConfValidationError struct { +// MACCommand_RelayEndDeviceConfReq_ConfigurationValidationError is the +// validation error returned by +// MACCommand_RelayEndDeviceConfReq_Configuration.ValidateFields if the +// designated constraints aren't met. +type MACCommand_RelayEndDeviceConfReq_ConfigurationValidationError struct { field string reason string cause error @@ -6932,24 +9340,26 @@ type MACCommand_DeviceModeConfValidationError struct { } // Field function returns field value. -func (e MACCommand_DeviceModeConfValidationError) Field() string { return e.field } +func (e MACCommand_RelayEndDeviceConfReq_ConfigurationValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e MACCommand_DeviceModeConfValidationError) Reason() string { return e.reason } +func (e MACCommand_RelayEndDeviceConfReq_ConfigurationValidationError) Reason() string { + return e.reason +} // Cause function returns cause value. -func (e MACCommand_DeviceModeConfValidationError) Cause() error { return e.cause } +func (e MACCommand_RelayEndDeviceConfReq_ConfigurationValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e MACCommand_DeviceModeConfValidationError) Key() bool { return e.key } +func (e MACCommand_RelayEndDeviceConfReq_ConfigurationValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e MACCommand_DeviceModeConfValidationError) ErrorName() string { - return "MACCommand_DeviceModeConfValidationError" +func (e MACCommand_RelayEndDeviceConfReq_ConfigurationValidationError) ErrorName() string { + return "MACCommand_RelayEndDeviceConfReq_ConfigurationValidationError" } // Error satisfies the builtin error interface -func (e MACCommand_DeviceModeConfValidationError) Error() string { +func (e MACCommand_RelayEndDeviceConfReq_ConfigurationValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -6961,14 +9371,14 @@ func (e MACCommand_DeviceModeConfValidationError) Error() string { } return fmt.Sprintf( - "invalid %sMACCommand_DeviceModeConf.%s: %s%s", + "invalid %sMACCommand_RelayEndDeviceConfReq_Configuration.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = MACCommand_DeviceModeConfValidationError{} +var _ error = MACCommand_RelayEndDeviceConfReq_ConfigurationValidationError{} var _ interface { Field() string @@ -6976,4 +9386,6 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = MACCommand_DeviceModeConfValidationError{} +} = MACCommand_RelayEndDeviceConfReq_ConfigurationValidationError{} + +var _MACCommand_RelayEndDeviceConfReq_Configuration_ServingDeviceId_Pattern = regexp.MustCompile("^[a-z0-9](?:[-]?[a-z0-9]){2,}$") diff --git a/pkg/ttnpb/lorawan_flags.pb.go b/pkg/ttnpb/lorawan_flags.pb.go index 79d29f75fc..ab460b1687 100644 --- a/pkg/ttnpb/lorawan_flags.pb.go +++ b/pkg/ttnpb/lorawan_flags.pb.go @@ -907,6 +907,414 @@ func (m *TxSettings) SetFromFlags(flags *pflag.FlagSet, prefix string) (paths [] return paths, nil } +// AddSelectFlagsForRelaySecondChannel adds flags to select fields in RelaySecondChannel. +func AddSelectFlagsForRelaySecondChannel(flags *pflag.FlagSet, prefix string, hidden bool) { + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("ack-offset", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("ack-offset", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("data-rate-index", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("data-rate-index", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("frequency", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("frequency", prefix), false), flagsplugin.WithHidden(hidden))) +} + +// SelectFromFlags outputs the fieldmask paths forRelaySecondChannel message from select flags. +func PathsFromSelectFlagsForRelaySecondChannel(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("ack_offset", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("ack_offset", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("data_rate_index", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("data_rate_index", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("frequency", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("frequency", prefix)) + } + return paths, nil +} + +// AddSetFlagsForRelaySecondChannel adds flags to select fields in RelaySecondChannel. +func AddSetFlagsForRelaySecondChannel(flags *pflag.FlagSet, prefix string, hidden bool) { + flags.AddFlag(flagsplugin.NewStringFlag(flagsplugin.Prefix("ack-offset", prefix), flagsplugin.EnumValueDesc(RelaySecondChAckOffset_value), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewStringFlag(flagsplugin.Prefix("data-rate-index", prefix), flagsplugin.EnumValueDesc(DataRateIndex_value, DataRateIndex_customvalue), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewUint64Flag(flagsplugin.Prefix("frequency", prefix), "", flagsplugin.WithHidden(hidden))) +} + +// SetFromFlags sets the RelaySecondChannel message from flags. +func (m *RelaySecondChannel) SetFromFlags(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if val, changed, err := flagsplugin.GetString(flags, flagsplugin.Prefix("ack_offset", prefix)); err != nil { + return nil, err + } else if changed { + enumValue, err := flagsplugin.SetEnumString(val, RelaySecondChAckOffset_value) + if err != nil { + return nil, err + } + m.AckOffset = RelaySecondChAckOffset(enumValue) + paths = append(paths, flagsplugin.Prefix("ack_offset", prefix)) + } + if val, changed, err := flagsplugin.GetString(flags, flagsplugin.Prefix("data_rate_index", prefix)); err != nil { + return nil, err + } else if changed { + enumValue, err := flagsplugin.SetEnumString(val, DataRateIndex_value, DataRateIndex_customvalue) + if err != nil { + return nil, err + } + m.DataRateIndex = DataRateIndex(enumValue) + paths = append(paths, flagsplugin.Prefix("data_rate_index", prefix)) + } + if val, changed, err := flagsplugin.GetUint64(flags, flagsplugin.Prefix("frequency", prefix)); err != nil { + return nil, err + } else if changed { + m.Frequency = val + paths = append(paths, flagsplugin.Prefix("frequency", prefix)) + } + return paths, nil +} + +// AddSelectFlagsForRelayUplinkForwardLimits adds flags to select fields in RelayUplinkForwardLimits. +func AddSelectFlagsForRelayUplinkForwardLimits(flags *pflag.FlagSet, prefix string, hidden bool) { + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("bucket-size", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("bucket-size", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("reload-rate", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("reload-rate", prefix), false), flagsplugin.WithHidden(hidden))) +} + +// SelectFromFlags outputs the fieldmask paths forRelayUplinkForwardLimits message from select flags. +func PathsFromSelectFlagsForRelayUplinkForwardLimits(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("bucket_size", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("bucket_size", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("reload_rate", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("reload_rate", prefix)) + } + return paths, nil +} + +// AddSetFlagsForRelayUplinkForwardLimits adds flags to select fields in RelayUplinkForwardLimits. +func AddSetFlagsForRelayUplinkForwardLimits(flags *pflag.FlagSet, prefix string, hidden bool) { + flags.AddFlag(flagsplugin.NewStringFlag(flagsplugin.Prefix("bucket-size", prefix), flagsplugin.EnumValueDesc(RelayLimitBucketSize_value), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewUint32Flag(flagsplugin.Prefix("reload-rate", prefix), "", flagsplugin.WithHidden(hidden))) +} + +// SetFromFlags sets the RelayUplinkForwardLimits message from flags. +func (m *RelayUplinkForwardLimits) SetFromFlags(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if val, changed, err := flagsplugin.GetString(flags, flagsplugin.Prefix("bucket_size", prefix)); err != nil { + return nil, err + } else if changed { + enumValue, err := flagsplugin.SetEnumString(val, RelayLimitBucketSize_value) + if err != nil { + return nil, err + } + m.BucketSize = RelayLimitBucketSize(enumValue) + paths = append(paths, flagsplugin.Prefix("bucket_size", prefix)) + } + if val, changed, err := flagsplugin.GetUint32(flags, flagsplugin.Prefix("reload_rate", prefix)); err != nil { + return nil, err + } else if changed { + m.ReloadRate = val + paths = append(paths, flagsplugin.Prefix("reload_rate", prefix)) + } + return paths, nil +} + +// AddSelectFlagsForRelayForwardLimits adds flags to select fields in RelayForwardLimits. +func AddSelectFlagsForRelayForwardLimits(flags *pflag.FlagSet, prefix string, hidden bool) { + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("bucket-size", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("bucket-size", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("reload-rate", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("reload-rate", prefix), false), flagsplugin.WithHidden(hidden))) +} + +// SelectFromFlags outputs the fieldmask paths forRelayForwardLimits message from select flags. +func PathsFromSelectFlagsForRelayForwardLimits(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("bucket_size", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("bucket_size", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("reload_rate", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("reload_rate", prefix)) + } + return paths, nil +} + +// AddSetFlagsForRelayForwardLimits adds flags to select fields in RelayForwardLimits. +func AddSetFlagsForRelayForwardLimits(flags *pflag.FlagSet, prefix string, hidden bool) { + flags.AddFlag(flagsplugin.NewStringFlag(flagsplugin.Prefix("bucket-size", prefix), flagsplugin.EnumValueDesc(RelayLimitBucketSize_value), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewUint32Flag(flagsplugin.Prefix("reload-rate", prefix), "", flagsplugin.WithHidden(hidden))) +} + +// SetFromFlags sets the RelayForwardLimits message from flags. +func (m *RelayForwardLimits) SetFromFlags(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if val, changed, err := flagsplugin.GetString(flags, flagsplugin.Prefix("bucket_size", prefix)); err != nil { + return nil, err + } else if changed { + enumValue, err := flagsplugin.SetEnumString(val, RelayLimitBucketSize_value) + if err != nil { + return nil, err + } + m.BucketSize = RelayLimitBucketSize(enumValue) + paths = append(paths, flagsplugin.Prefix("bucket_size", prefix)) + } + if val, changed, err := flagsplugin.GetUint32(flags, flagsplugin.Prefix("reload_rate", prefix)); err != nil { + return nil, err + } else if changed { + m.ReloadRate = val + paths = append(paths, flagsplugin.Prefix("reload_rate", prefix)) + } + return paths, nil +} + +// AddSelectFlagsForRelayEndDeviceAlwaysMode adds flags to select fields in RelayEndDeviceAlwaysMode. +func AddSelectFlagsForRelayEndDeviceAlwaysMode(flags *pflag.FlagSet, prefix string, hidden bool) { +} + +// SelectFromFlags outputs the fieldmask paths forRelayEndDeviceAlwaysMode message from select flags. +func PathsFromSelectFlagsForRelayEndDeviceAlwaysMode(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + return paths, nil +} + +// AddSetFlagsForRelayEndDeviceAlwaysMode adds flags to select fields in RelayEndDeviceAlwaysMode. +func AddSetFlagsForRelayEndDeviceAlwaysMode(flags *pflag.FlagSet, prefix string, hidden bool) { +} + +// SetFromFlags sets the RelayEndDeviceAlwaysMode message from flags. +func (m *RelayEndDeviceAlwaysMode) SetFromFlags(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + return paths, nil +} + +// AddSelectFlagsForRelayEndDeviceDynamicMode adds flags to select fields in RelayEndDeviceDynamicMode. +func AddSelectFlagsForRelayEndDeviceDynamicMode(flags *pflag.FlagSet, prefix string, hidden bool) { + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("smart-enable-level", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("smart-enable-level", prefix), false), flagsplugin.WithHidden(hidden))) +} + +// SelectFromFlags outputs the fieldmask paths forRelayEndDeviceDynamicMode message from select flags. +func PathsFromSelectFlagsForRelayEndDeviceDynamicMode(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("smart_enable_level", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("smart_enable_level", prefix)) + } + return paths, nil +} + +// AddSetFlagsForRelayEndDeviceDynamicMode adds flags to select fields in RelayEndDeviceDynamicMode. +func AddSetFlagsForRelayEndDeviceDynamicMode(flags *pflag.FlagSet, prefix string, hidden bool) { + flags.AddFlag(flagsplugin.NewStringFlag(flagsplugin.Prefix("smart-enable-level", prefix), flagsplugin.EnumValueDesc(RelaySmartEnableLevel_value), flagsplugin.WithHidden(hidden))) +} + +// SetFromFlags sets the RelayEndDeviceDynamicMode message from flags. +func (m *RelayEndDeviceDynamicMode) SetFromFlags(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if val, changed, err := flagsplugin.GetString(flags, flagsplugin.Prefix("smart_enable_level", prefix)); err != nil { + return nil, err + } else if changed { + enumValue, err := flagsplugin.SetEnumString(val, RelaySmartEnableLevel_value) + if err != nil { + return nil, err + } + m.SmartEnableLevel = RelaySmartEnableLevel(enumValue) + paths = append(paths, flagsplugin.Prefix("smart_enable_level", prefix)) + } + return paths, nil +} + +// AddSelectFlagsForRelayEndDeviceControlledMode adds flags to select fields in RelayEndDeviceControlledMode. +func AddSelectFlagsForRelayEndDeviceControlledMode(flags *pflag.FlagSet, prefix string, hidden bool) { +} + +// SelectFromFlags outputs the fieldmask paths forRelayEndDeviceControlledMode message from select flags. +func PathsFromSelectFlagsForRelayEndDeviceControlledMode(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + return paths, nil +} + +// AddSetFlagsForRelayEndDeviceControlledMode adds flags to select fields in RelayEndDeviceControlledMode. +func AddSetFlagsForRelayEndDeviceControlledMode(flags *pflag.FlagSet, prefix string, hidden bool) { +} + +// SetFromFlags sets the RelayEndDeviceControlledMode message from flags. +func (m *RelayEndDeviceControlledMode) SetFromFlags(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + return paths, nil +} + +// AddSelectFlagsForMACCommand_RelayUpdateUplinkListReq adds flags to select fields in MACCommand_RelayUpdateUplinkListReq. +func AddSelectFlagsForMACCommand_RelayUpdateUplinkListReq(flags *pflag.FlagSet, prefix string, hidden bool) { + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("rule-index", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("rule-index", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("forward-limits", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("forward-limits", prefix), true), flagsplugin.WithHidden(hidden))) + AddSelectFlagsForRelayUplinkForwardLimits(flags, flagsplugin.Prefix("forward-limits", prefix), hidden) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("dev-addr", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("dev-addr", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("w-f-cnt", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("w-f-cnt", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("root-wor-s-key", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("root-wor-s-key", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("device-id", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("device-id", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("session-key-id", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("session-key-id", prefix), false), flagsplugin.WithHidden(hidden))) +} + +// SelectFromFlags outputs the fieldmask paths forMACCommand_RelayUpdateUplinkListReq message from select flags. +func PathsFromSelectFlagsForMACCommand_RelayUpdateUplinkListReq(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("rule_index", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("rule_index", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("forward_limits", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("forward_limits", prefix)) + } + if selectPaths, err := PathsFromSelectFlagsForRelayUplinkForwardLimits(flags, flagsplugin.Prefix("forward_limits", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, selectPaths...) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("dev_addr", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("dev_addr", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("w_f_cnt", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("w_f_cnt", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("root_wor_s_key", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("root_wor_s_key", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("device_id", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("device_id", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("session_key_id", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("session_key_id", prefix)) + } + return paths, nil +} + +// AddSetFlagsForMACCommand_RelayUpdateUplinkListReq adds flags to select fields in MACCommand_RelayUpdateUplinkListReq. +func AddSetFlagsForMACCommand_RelayUpdateUplinkListReq(flags *pflag.FlagSet, prefix string, hidden bool) { + flags.AddFlag(flagsplugin.NewUint32Flag(flagsplugin.Prefix("rule-index", prefix), "", flagsplugin.WithHidden(hidden))) + AddSetFlagsForRelayUplinkForwardLimits(flags, flagsplugin.Prefix("forward-limits", prefix), hidden) + flags.AddFlag(customflags.New4BytesFlag(flagsplugin.Prefix("dev-addr", prefix), "", flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewUint32Flag(flagsplugin.Prefix("w-f-cnt", prefix), "", flagsplugin.WithHidden(hidden))) + flags.AddFlag(customflags.New16BytesFlag(flagsplugin.Prefix("root-wor-s-key", prefix), "", flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewStringFlag(flagsplugin.Prefix("device-id", prefix), "", flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBytesFlag(flagsplugin.Prefix("session-key-id", prefix), "", flagsplugin.WithHidden(hidden))) +} + +// SetFromFlags sets the MACCommand_RelayUpdateUplinkListReq message from flags. +func (m *MACCommand_RelayUpdateUplinkListReq) SetFromFlags(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if val, changed, err := flagsplugin.GetUint32(flags, flagsplugin.Prefix("rule_index", prefix)); err != nil { + return nil, err + } else if changed { + m.RuleIndex = val + paths = append(paths, flagsplugin.Prefix("rule_index", prefix)) + } + if changed := flagsplugin.IsAnyPrefixSet(flags, flagsplugin.Prefix("forward_limits", prefix)); changed { + if m.ForwardLimits == nil { + m.ForwardLimits = &RelayUplinkForwardLimits{} + } + if setPaths, err := m.ForwardLimits.SetFromFlags(flags, flagsplugin.Prefix("forward_limits", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, setPaths...) + } + } + if val, changed, err := customflags.GetExactBytes(flags, flagsplugin.Prefix("dev_addr", prefix)); err != nil { + return nil, err + } else if changed { + m.DevAddr = val + paths = append(paths, flagsplugin.Prefix("dev_addr", prefix)) + } + if val, changed, err := flagsplugin.GetUint32(flags, flagsplugin.Prefix("w_f_cnt", prefix)); err != nil { + return nil, err + } else if changed { + m.WFCnt = val + paths = append(paths, flagsplugin.Prefix("w_f_cnt", prefix)) + } + if val, changed, err := customflags.GetExactBytes(flags, flagsplugin.Prefix("root_wor_s_key", prefix)); err != nil { + return nil, err + } else if changed { + m.RootWorSKey = val + paths = append(paths, flagsplugin.Prefix("root_wor_s_key", prefix)) + } + if val, changed, err := flagsplugin.GetString(flags, flagsplugin.Prefix("device_id", prefix)); err != nil { + return nil, err + } else if changed { + m.DeviceId = val + paths = append(paths, flagsplugin.Prefix("device_id", prefix)) + } + if val, changed, err := flagsplugin.GetBytes(flags, flagsplugin.Prefix("session_key_id", prefix)); err != nil { + return nil, err + } else if changed { + m.SessionKeyId = val + paths = append(paths, flagsplugin.Prefix("session_key_id", prefix)) + } + return paths, nil +} + +// AddSelectFlagsForMACCommand_RelayNotifyNewEndDeviceReq adds flags to select fields in MACCommand_RelayNotifyNewEndDeviceReq. +func AddSelectFlagsForMACCommand_RelayNotifyNewEndDeviceReq(flags *pflag.FlagSet, prefix string, hidden bool) { + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("dev-addr", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("dev-addr", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("snr", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("snr", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("rssi", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("rssi", prefix), false), flagsplugin.WithHidden(hidden))) +} + +// SelectFromFlags outputs the fieldmask paths forMACCommand_RelayNotifyNewEndDeviceReq message from select flags. +func PathsFromSelectFlagsForMACCommand_RelayNotifyNewEndDeviceReq(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("dev_addr", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("dev_addr", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("snr", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("snr", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("rssi", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("rssi", prefix)) + } + return paths, nil +} + +// AddSetFlagsForMACCommand_RelayNotifyNewEndDeviceReq adds flags to select fields in MACCommand_RelayNotifyNewEndDeviceReq. +func AddSetFlagsForMACCommand_RelayNotifyNewEndDeviceReq(flags *pflag.FlagSet, prefix string, hidden bool) { + flags.AddFlag(customflags.New4BytesFlag(flagsplugin.Prefix("dev-addr", prefix), "", flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewInt32Flag(flagsplugin.Prefix("snr", prefix), "", flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewInt32Flag(flagsplugin.Prefix("rssi", prefix), "", flagsplugin.WithHidden(hidden))) +} + +// SetFromFlags sets the MACCommand_RelayNotifyNewEndDeviceReq message from flags. +func (m *MACCommand_RelayNotifyNewEndDeviceReq) SetFromFlags(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if val, changed, err := customflags.GetExactBytes(flags, flagsplugin.Prefix("dev_addr", prefix)); err != nil { + return nil, err + } else if changed { + m.DevAddr = val + paths = append(paths, flagsplugin.Prefix("dev_addr", prefix)) + } + if val, changed, err := flagsplugin.GetInt32(flags, flagsplugin.Prefix("snr", prefix)); err != nil { + return nil, err + } else if changed { + m.Snr = val + paths = append(paths, flagsplugin.Prefix("snr", prefix)) + } + if val, changed, err := flagsplugin.GetInt32(flags, flagsplugin.Prefix("rssi", prefix)); err != nil { + return nil, err + } else if changed { + m.Rssi = val + paths = append(paths, flagsplugin.Prefix("rssi", prefix)) + } + return paths, nil +} + // AddSelectFlagsForFrequencyValue adds flags to select fields in FrequencyValue. func AddSelectFlagsForFrequencyValue(flags *pflag.FlagSet, prefix string, hidden bool) { flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("value", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("value", prefix), false), flagsplugin.WithHidden(hidden))) @@ -1248,3 +1656,144 @@ func (m *DeviceEIRPValue) SetFromFlags(flags *pflag.FlagSet, prefix string) (pat } return paths, nil } + +// AddSelectFlagsForRelayForwardUplinkReq adds flags to select fields in RelayForwardUplinkReq. +func AddSelectFlagsForRelayForwardUplinkReq(flags *pflag.FlagSet, prefix string, hidden bool) { + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("data-rate", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("data-rate", prefix), true), flagsplugin.WithHidden(hidden))) + AddSelectFlagsForDataRate(flags, flagsplugin.Prefix("data-rate", prefix), hidden) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("snr", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("snr", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("rssi", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("rssi", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("wor-channel", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("wor-channel", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("frequency", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("frequency", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("raw-payload", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("raw-payload", prefix), false), flagsplugin.WithHidden(hidden))) +} + +// SelectFromFlags outputs the fieldmask paths forRelayForwardUplinkReq message from select flags. +func PathsFromSelectFlagsForRelayForwardUplinkReq(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("data_rate", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("data_rate", prefix)) + } + if selectPaths, err := PathsFromSelectFlagsForDataRate(flags, flagsplugin.Prefix("data_rate", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, selectPaths...) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("snr", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("snr", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("rssi", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("rssi", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("wor_channel", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("wor_channel", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("frequency", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("frequency", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("raw_payload", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("raw_payload", prefix)) + } + return paths, nil +} + +// AddSetFlagsForRelayForwardUplinkReq adds flags to select fields in RelayForwardUplinkReq. +func AddSetFlagsForRelayForwardUplinkReq(flags *pflag.FlagSet, prefix string, hidden bool) { + AddSetFlagsForDataRate(flags, flagsplugin.Prefix("data-rate", prefix), hidden) + flags.AddFlag(flagsplugin.NewInt32Flag(flagsplugin.Prefix("snr", prefix), "", flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewInt32Flag(flagsplugin.Prefix("rssi", prefix), "", flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewStringFlag(flagsplugin.Prefix("wor-channel", prefix), flagsplugin.EnumValueDesc(RelayWORChannel_value), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewUint64Flag(flagsplugin.Prefix("frequency", prefix), "", flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBytesFlag(flagsplugin.Prefix("raw-payload", prefix), "", flagsplugin.WithHidden(hidden))) +} + +// SetFromFlags sets the RelayForwardUplinkReq message from flags. +func (m *RelayForwardUplinkReq) SetFromFlags(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if changed := flagsplugin.IsAnyPrefixSet(flags, flagsplugin.Prefix("data_rate", prefix)); changed { + if m.DataRate == nil { + m.DataRate = &DataRate{} + } + if setPaths, err := m.DataRate.SetFromFlags(flags, flagsplugin.Prefix("data_rate", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, setPaths...) + } + } + if val, changed, err := flagsplugin.GetInt32(flags, flagsplugin.Prefix("snr", prefix)); err != nil { + return nil, err + } else if changed { + m.Snr = val + paths = append(paths, flagsplugin.Prefix("snr", prefix)) + } + if val, changed, err := flagsplugin.GetInt32(flags, flagsplugin.Prefix("rssi", prefix)); err != nil { + return nil, err + } else if changed { + m.Rssi = val + paths = append(paths, flagsplugin.Prefix("rssi", prefix)) + } + if val, changed, err := flagsplugin.GetString(flags, flagsplugin.Prefix("wor_channel", prefix)); err != nil { + return nil, err + } else if changed { + enumValue, err := flagsplugin.SetEnumString(val, RelayWORChannel_value) + if err != nil { + return nil, err + } + m.WorChannel = RelayWORChannel(enumValue) + paths = append(paths, flagsplugin.Prefix("wor_channel", prefix)) + } + if val, changed, err := flagsplugin.GetUint64(flags, flagsplugin.Prefix("frequency", prefix)); err != nil { + return nil, err + } else if changed { + m.Frequency = val + paths = append(paths, flagsplugin.Prefix("frequency", prefix)) + } + if val, changed, err := flagsplugin.GetBytes(flags, flagsplugin.Prefix("raw_payload", prefix)); err != nil { + return nil, err + } else if changed { + m.RawPayload = val + paths = append(paths, flagsplugin.Prefix("raw_payload", prefix)) + } + return paths, nil +} + +// AddSelectFlagsForRelayForwardDownlinkReq adds flags to select fields in RelayForwardDownlinkReq. +func AddSelectFlagsForRelayForwardDownlinkReq(flags *pflag.FlagSet, prefix string, hidden bool) { + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("raw-payload", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("raw-payload", prefix), false), flagsplugin.WithHidden(hidden))) +} + +// SelectFromFlags outputs the fieldmask paths forRelayForwardDownlinkReq message from select flags. +func PathsFromSelectFlagsForRelayForwardDownlinkReq(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("raw_payload", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("raw_payload", prefix)) + } + return paths, nil +} + +// AddSetFlagsForRelayForwardDownlinkReq adds flags to select fields in RelayForwardDownlinkReq. +func AddSetFlagsForRelayForwardDownlinkReq(flags *pflag.FlagSet, prefix string, hidden bool) { + flags.AddFlag(flagsplugin.NewBytesFlag(flagsplugin.Prefix("raw-payload", prefix), "", flagsplugin.WithHidden(hidden))) +} + +// SetFromFlags sets the RelayForwardDownlinkReq message from flags. +func (m *RelayForwardDownlinkReq) SetFromFlags(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if val, changed, err := flagsplugin.GetBytes(flags, flagsplugin.Prefix("raw_payload", prefix)); err != nil { + return nil, err + } else if changed { + m.RawPayload = val + paths = append(paths, flagsplugin.Prefix("raw_payload", prefix)) + } + return paths, nil +} diff --git a/pkg/ttnpb/lorawan_json.pb.go b/pkg/ttnpb/lorawan_json.pb.go index 62825a6d37..0423befb41 100644 --- a/pkg/ttnpb/lorawan_json.pb.go +++ b/pkg/ttnpb/lorawan_json.pb.go @@ -558,27 +558,34 @@ func (x MACCommandIdentifier) MarshalJSON() ([]byte, error) { // MACCommandIdentifier_customvalue contains custom string values that extend MACCommandIdentifier_value. var MACCommandIdentifier_customvalue = map[string]int32{ - "RFU_0": 0, - "RESET": 1, - "LINK_CHECK": 2, - "LINK_ADR": 3, - "DUTY_CYCLE": 4, - "RX_PARAM_SETUP": 5, - "DEV_STATUS": 6, - "NEW_CHANNEL": 7, - "RX_TIMING_SETUP": 8, - "TX_PARAM_SETUP": 9, - "DL_CHANNEL": 10, - "REKEY": 11, - "ADR_PARAM_SETUP": 12, - "DEVICE_TIME": 13, - "FORCE_REJOIN": 14, - "REJOIN_PARAM_SETUP": 15, - "PING_SLOT_INFO": 16, - "PING_SLOT_CHANNEL": 17, - "BEACON_TIMING": 18, - "BEACON_FREQ": 19, - "DEVICE_MODE": 32, + "RFU_0": 0, + "RESET": 1, + "LINK_CHECK": 2, + "LINK_ADR": 3, + "DUTY_CYCLE": 4, + "RX_PARAM_SETUP": 5, + "DEV_STATUS": 6, + "NEW_CHANNEL": 7, + "RX_TIMING_SETUP": 8, + "TX_PARAM_SETUP": 9, + "DL_CHANNEL": 10, + "REKEY": 11, + "ADR_PARAM_SETUP": 12, + "DEVICE_TIME": 13, + "FORCE_REJOIN": 14, + "REJOIN_PARAM_SETUP": 15, + "PING_SLOT_INFO": 16, + "PING_SLOT_CHANNEL": 17, + "BEACON_TIMING": 18, + "BEACON_FREQ": 19, + "DEVICE_MODE": 32, + "RELAY_CONF": 64, + "RELAY_END_DEVICE_CONF": 65, + "RELAY_FILTER_LIST": 66, + "RELAY_UPDATE_UPLINK_LIST": 67, + "RELAY_CTRL_UPLINK_LIST": 68, + "RELAY_CONFIGURE_FWD_LIMIT": 69, + "RELAY_NOTIFY_NEW_END_DEVICE": 70, } // UnmarshalProtoJSON unmarshals the MACCommandIdentifier from JSON. @@ -606,6 +613,342 @@ func (x *MACCommandIdentifier) UnmarshalJSON(b []byte) error { return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) } +// MarshalProtoJSON marshals the RelayCADPeriodicity to JSON. +func (x RelayCADPeriodicity) MarshalProtoJSON(s *jsonplugin.MarshalState) { + s.WriteEnumString(int32(x), RelayCADPeriodicity_name) +} + +// MarshalText marshals the RelayCADPeriodicity to text. +func (x RelayCADPeriodicity) MarshalText() ([]byte, error) { + return []byte(jsonplugin.GetEnumString(int32(x), RelayCADPeriodicity_name)), nil +} + +// MarshalJSON marshals the RelayCADPeriodicity to JSON. +func (x RelayCADPeriodicity) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// RelayCADPeriodicity_customvalue contains custom string values that extend RelayCADPeriodicity_value. +var RelayCADPeriodicity_customvalue = map[string]int32{ + "1_SECOND": 0, + "500_MILLISECONDS": 1, + "250_MILLISECONDS": 2, + "100_MILLISECONDS": 3, + "50_MILLISECONDS": 4, + "20_MILLISECONDS": 5, +} + +// UnmarshalProtoJSON unmarshals the RelayCADPeriodicity from JSON. +func (x *RelayCADPeriodicity) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + v := s.ReadEnum(RelayCADPeriodicity_value, RelayCADPeriodicity_customvalue) + if err := s.Err(); err != nil { + s.SetErrorf("could not read RelayCADPeriodicity enum: %v", err) + return + } + *x = RelayCADPeriodicity(v) +} + +// UnmarshalText unmarshals the RelayCADPeriodicity from text. +func (x *RelayCADPeriodicity) UnmarshalText(b []byte) error { + i, err := jsonplugin.ParseEnumString(string(b), RelayCADPeriodicity_customvalue, RelayCADPeriodicity_value) + if err != nil { + return err + } + *x = RelayCADPeriodicity(i) + return nil +} + +// UnmarshalJSON unmarshals the RelayCADPeriodicity from JSON. +func (x *RelayCADPeriodicity) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the RelaySecondChAckOffset to JSON. +func (x RelaySecondChAckOffset) MarshalProtoJSON(s *jsonplugin.MarshalState) { + s.WriteEnumString(int32(x), RelaySecondChAckOffset_name) +} + +// MarshalText marshals the RelaySecondChAckOffset to text. +func (x RelaySecondChAckOffset) MarshalText() ([]byte, error) { + return []byte(jsonplugin.GetEnumString(int32(x), RelaySecondChAckOffset_name)), nil +} + +// MarshalJSON marshals the RelaySecondChAckOffset to JSON. +func (x RelaySecondChAckOffset) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// RelaySecondChAckOffset_customvalue contains custom string values that extend RelaySecondChAckOffset_value. +var RelaySecondChAckOffset_customvalue = map[string]int32{ + "0": 0, + "200": 1, + "400": 2, + "800": 3, + "1600": 4, + "3200": 5, +} + +// UnmarshalProtoJSON unmarshals the RelaySecondChAckOffset from JSON. +func (x *RelaySecondChAckOffset) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + v := s.ReadEnum(RelaySecondChAckOffset_value, RelaySecondChAckOffset_customvalue) + if err := s.Err(); err != nil { + s.SetErrorf("could not read RelaySecondChAckOffset enum: %v", err) + return + } + *x = RelaySecondChAckOffset(v) +} + +// UnmarshalText unmarshals the RelaySecondChAckOffset from text. +func (x *RelaySecondChAckOffset) UnmarshalText(b []byte) error { + i, err := jsonplugin.ParseEnumString(string(b), RelaySecondChAckOffset_customvalue, RelaySecondChAckOffset_value) + if err != nil { + return err + } + *x = RelaySecondChAckOffset(i) + return nil +} + +// UnmarshalJSON unmarshals the RelaySecondChAckOffset from JSON. +func (x *RelaySecondChAckOffset) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the RelayLimitBucketSize to JSON. +func (x RelayLimitBucketSize) MarshalProtoJSON(s *jsonplugin.MarshalState) { + s.WriteEnumString(int32(x), RelayLimitBucketSize_name) +} + +// MarshalText marshals the RelayLimitBucketSize to text. +func (x RelayLimitBucketSize) MarshalText() ([]byte, error) { + return []byte(jsonplugin.GetEnumString(int32(x), RelayLimitBucketSize_name)), nil +} + +// MarshalJSON marshals the RelayLimitBucketSize to JSON. +func (x RelayLimitBucketSize) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// RelayLimitBucketSize_customvalue contains custom string values that extend RelayLimitBucketSize_value. +var RelayLimitBucketSize_customvalue = map[string]int32{ + "1": 0, + "2": 1, + "4": 2, + "12": 3, +} + +// UnmarshalProtoJSON unmarshals the RelayLimitBucketSize from JSON. +func (x *RelayLimitBucketSize) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + v := s.ReadEnum(RelayLimitBucketSize_value, RelayLimitBucketSize_customvalue) + if err := s.Err(); err != nil { + s.SetErrorf("could not read RelayLimitBucketSize enum: %v", err) + return + } + *x = RelayLimitBucketSize(v) +} + +// UnmarshalText unmarshals the RelayLimitBucketSize from text. +func (x *RelayLimitBucketSize) UnmarshalText(b []byte) error { + i, err := jsonplugin.ParseEnumString(string(b), RelayLimitBucketSize_customvalue, RelayLimitBucketSize_value) + if err != nil { + return err + } + *x = RelayLimitBucketSize(i) + return nil +} + +// UnmarshalJSON unmarshals the RelayLimitBucketSize from JSON. +func (x *RelayLimitBucketSize) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the RelaySmartEnableLevel to JSON. +func (x RelaySmartEnableLevel) MarshalProtoJSON(s *jsonplugin.MarshalState) { + s.WriteEnumString(int32(x), RelaySmartEnableLevel_name) +} + +// MarshalText marshals the RelaySmartEnableLevel to text. +func (x RelaySmartEnableLevel) MarshalText() ([]byte, error) { + return []byte(jsonplugin.GetEnumString(int32(x), RelaySmartEnableLevel_name)), nil +} + +// MarshalJSON marshals the RelaySmartEnableLevel to JSON. +func (x RelaySmartEnableLevel) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// RelaySmartEnableLevel_customvalue contains custom string values that extend RelaySmartEnableLevel_value. +var RelaySmartEnableLevel_customvalue = map[string]int32{ + "8": 0, + "16": 1, + "32": 2, + "64": 3, +} + +// UnmarshalProtoJSON unmarshals the RelaySmartEnableLevel from JSON. +func (x *RelaySmartEnableLevel) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + v := s.ReadEnum(RelaySmartEnableLevel_value, RelaySmartEnableLevel_customvalue) + if err := s.Err(); err != nil { + s.SetErrorf("could not read RelaySmartEnableLevel enum: %v", err) + return + } + *x = RelaySmartEnableLevel(v) +} + +// UnmarshalText unmarshals the RelaySmartEnableLevel from text. +func (x *RelaySmartEnableLevel) UnmarshalText(b []byte) error { + i, err := jsonplugin.ParseEnumString(string(b), RelaySmartEnableLevel_customvalue, RelaySmartEnableLevel_value) + if err != nil { + return err + } + *x = RelaySmartEnableLevel(i) + return nil +} + +// UnmarshalJSON unmarshals the RelaySmartEnableLevel from JSON. +func (x *RelaySmartEnableLevel) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the RelayWORChannel to JSON. +func (x RelayWORChannel) MarshalProtoJSON(s *jsonplugin.MarshalState) { + s.WriteEnumString(int32(x), RelayWORChannel_name) +} + +// MarshalText marshals the RelayWORChannel to text. +func (x RelayWORChannel) MarshalText() ([]byte, error) { + return []byte(jsonplugin.GetEnumString(int32(x), RelayWORChannel_name)), nil +} + +// MarshalJSON marshals the RelayWORChannel to JSON. +func (x RelayWORChannel) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// RelayWORChannel_customvalue contains custom string values that extend RelayWORChannel_value. +var RelayWORChannel_customvalue = map[string]int32{ + "DEFAULT": 0, + "SECONDARY": 1, +} + +// UnmarshalProtoJSON unmarshals the RelayWORChannel from JSON. +func (x *RelayWORChannel) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + v := s.ReadEnum(RelayWORChannel_value, RelayWORChannel_customvalue) + if err := s.Err(); err != nil { + s.SetErrorf("could not read RelayWORChannel enum: %v", err) + return + } + *x = RelayWORChannel(v) +} + +// UnmarshalText unmarshals the RelayWORChannel from text. +func (x *RelayWORChannel) UnmarshalText(b []byte) error { + i, err := jsonplugin.ParseEnumString(string(b), RelayWORChannel_customvalue, RelayWORChannel_value) + if err != nil { + return err + } + *x = RelayWORChannel(i) + return nil +} + +// UnmarshalJSON unmarshals the RelayWORChannel from JSON. +func (x *RelayWORChannel) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the RelayResetLimitCounter to JSON. +func (x RelayResetLimitCounter) MarshalProtoJSON(s *jsonplugin.MarshalState) { + s.WriteEnumString(int32(x), RelayResetLimitCounter_name) +} + +// MarshalText marshals the RelayResetLimitCounter to text. +func (x RelayResetLimitCounter) MarshalText() ([]byte, error) { + return []byte(jsonplugin.GetEnumString(int32(x), RelayResetLimitCounter_name)), nil +} + +// MarshalJSON marshals the RelayResetLimitCounter to JSON. +func (x RelayResetLimitCounter) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// RelayResetLimitCounter_customvalue contains custom string values that extend RelayResetLimitCounter_value. +var RelayResetLimitCounter_customvalue = map[string]int32{ + "ZERO": 0, + "RELOAD_RATE": 1, + "MAX_VALUE": 2, + "NO_RESET": 3, +} + +// UnmarshalProtoJSON unmarshals the RelayResetLimitCounter from JSON. +func (x *RelayResetLimitCounter) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + v := s.ReadEnum(RelayResetLimitCounter_value, RelayResetLimitCounter_customvalue) + if err := s.Err(); err != nil { + s.SetErrorf("could not read RelayResetLimitCounter enum: %v", err) + return + } + *x = RelayResetLimitCounter(v) +} + +// UnmarshalText unmarshals the RelayResetLimitCounter from text. +func (x *RelayResetLimitCounter) UnmarshalText(b []byte) error { + i, err := jsonplugin.ParseEnumString(string(b), RelayResetLimitCounter_customvalue, RelayResetLimitCounter_value) + if err != nil { + return err + } + *x = RelayResetLimitCounter(i) + return nil +} + +// UnmarshalJSON unmarshals the RelayResetLimitCounter from JSON. +func (x *RelayResetLimitCounter) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the RelayCtrlUplinkListAction to JSON. +func (x RelayCtrlUplinkListAction) MarshalProtoJSON(s *jsonplugin.MarshalState) { + s.WriteEnumString(int32(x), RelayCtrlUplinkListAction_name) +} + +// MarshalText marshals the RelayCtrlUplinkListAction to text. +func (x RelayCtrlUplinkListAction) MarshalText() ([]byte, error) { + return []byte(jsonplugin.GetEnumString(int32(x), RelayCtrlUplinkListAction_name)), nil +} + +// MarshalJSON marshals the RelayCtrlUplinkListAction to JSON. +func (x RelayCtrlUplinkListAction) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// RelayCtrlUplinkListAction_customvalue contains custom string values that extend RelayCtrlUplinkListAction_value. +var RelayCtrlUplinkListAction_customvalue = map[string]int32{ + "READ_W_F_CNT": 0, + "REMOVE_TRUSTED_END_DEVICE": 1, +} + +// UnmarshalProtoJSON unmarshals the RelayCtrlUplinkListAction from JSON. +func (x *RelayCtrlUplinkListAction) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + v := s.ReadEnum(RelayCtrlUplinkListAction_value, RelayCtrlUplinkListAction_customvalue) + if err := s.Err(); err != nil { + s.SetErrorf("could not read RelayCtrlUplinkListAction enum: %v", err) + return + } + *x = RelayCtrlUplinkListAction(v) +} + +// UnmarshalText unmarshals the RelayCtrlUplinkListAction from text. +func (x *RelayCtrlUplinkListAction) UnmarshalText(b []byte) error { + i, err := jsonplugin.ParseEnumString(string(b), RelayCtrlUplinkListAction_customvalue, RelayCtrlUplinkListAction_value) + if err != nil { + return err + } + *x = RelayCtrlUplinkListAction(i) + return nil +} + +// UnmarshalJSON unmarshals the RelayCtrlUplinkListAction from JSON. +func (x *RelayCtrlUplinkListAction) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + // MarshalProtoJSON marshals the AggregatedDutyCycle to JSON. func (x AggregatedDutyCycle) MarshalProtoJSON(s *jsonplugin.MarshalState) { s.WriteEnumString(int32(x), AggregatedDutyCycle_name) @@ -2329,29 +2672,39 @@ func (x *TxRequest) UnmarshalJSON(b []byte) error { return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) } -// MarshalProtoJSON marshals the MACCommand_ResetInd message to JSON. -func (x *MACCommand_ResetInd) MarshalProtoJSON(s *jsonplugin.MarshalState) { +// MarshalProtoJSON marshals the RelaySecondChannel message to JSON. +func (x *RelaySecondChannel) MarshalProtoJSON(s *jsonplugin.MarshalState) { if x == nil { s.WriteNil() return } s.WriteObjectStart() var wroteField bool - if x.MinorVersion != 0 || s.HasField("minor_version") { + if x.AckOffset != 0 || s.HasField("ack_offset") { s.WriteMoreIf(&wroteField) - s.WriteObjectField("minor_version") - x.MinorVersion.MarshalProtoJSON(s) + s.WriteObjectField("ack_offset") + x.AckOffset.MarshalProtoJSON(s) + } + if x.DataRateIndex != 0 || s.HasField("data_rate_index") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("data_rate_index") + x.DataRateIndex.MarshalProtoJSON(s) + } + if x.Frequency != 0 || s.HasField("frequency") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("frequency") + s.WriteUint64(x.Frequency) } s.WriteObjectEnd() } -// MarshalJSON marshals the MACCommand_ResetInd to JSON. -func (x *MACCommand_ResetInd) MarshalJSON() ([]byte, error) { +// MarshalJSON marshals the RelaySecondChannel to JSON. +func (x *RelaySecondChannel) MarshalJSON() ([]byte, error) { return jsonplugin.DefaultMarshalerConfig.Marshal(x) } -// UnmarshalProtoJSON unmarshals the MACCommand_ResetInd message from JSON. -func (x *MACCommand_ResetInd) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { +// UnmarshalProtoJSON unmarshals the RelaySecondChannel message from JSON. +func (x *RelaySecondChannel) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { if s.ReadNil() { return } @@ -2359,41 +2712,52 @@ func (x *MACCommand_ResetInd) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { switch key { default: s.ReadAny() // ignore unknown field - case "minor_version", "minorVersion": - s.AddField("minor_version") - x.MinorVersion.UnmarshalProtoJSON(s) + case "ack_offset", "ackOffset": + s.AddField("ack_offset") + x.AckOffset.UnmarshalProtoJSON(s) + case "data_rate_index", "dataRateIndex": + s.AddField("data_rate_index") + x.DataRateIndex.UnmarshalProtoJSON(s) + case "frequency": + s.AddField("frequency") + x.Frequency = s.ReadUint64() } }) } -// UnmarshalJSON unmarshals the MACCommand_ResetInd from JSON. -func (x *MACCommand_ResetInd) UnmarshalJSON(b []byte) error { +// UnmarshalJSON unmarshals the RelaySecondChannel from JSON. +func (x *RelaySecondChannel) UnmarshalJSON(b []byte) error { return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) } -// MarshalProtoJSON marshals the MACCommand_ResetConf message to JSON. -func (x *MACCommand_ResetConf) MarshalProtoJSON(s *jsonplugin.MarshalState) { +// MarshalProtoJSON marshals the RelayUplinkForwardLimits message to JSON. +func (x *RelayUplinkForwardLimits) MarshalProtoJSON(s *jsonplugin.MarshalState) { if x == nil { s.WriteNil() return } s.WriteObjectStart() var wroteField bool - if x.MinorVersion != 0 || s.HasField("minor_version") { + if x.BucketSize != 0 || s.HasField("bucket_size") { s.WriteMoreIf(&wroteField) - s.WriteObjectField("minor_version") - x.MinorVersion.MarshalProtoJSON(s) + s.WriteObjectField("bucket_size") + x.BucketSize.MarshalProtoJSON(s) + } + if x.ReloadRate != 0 || s.HasField("reload_rate") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("reload_rate") + s.WriteUint32(x.ReloadRate) } s.WriteObjectEnd() } -// MarshalJSON marshals the MACCommand_ResetConf to JSON. -func (x *MACCommand_ResetConf) MarshalJSON() ([]byte, error) { +// MarshalJSON marshals the RelayUplinkForwardLimits to JSON. +func (x *RelayUplinkForwardLimits) MarshalJSON() ([]byte, error) { return jsonplugin.DefaultMarshalerConfig.Marshal(x) } -// UnmarshalProtoJSON unmarshals the MACCommand_ResetConf message from JSON. -func (x *MACCommand_ResetConf) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { +// UnmarshalProtoJSON unmarshals the RelayUplinkForwardLimits message from JSON. +func (x *RelayUplinkForwardLimits) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { if s.ReadNil() { return } @@ -2401,61 +2765,49 @@ func (x *MACCommand_ResetConf) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) switch key { default: s.ReadAny() // ignore unknown field - case "minor_version", "minorVersion": - s.AddField("minor_version") - x.MinorVersion.UnmarshalProtoJSON(s) + case "bucket_size", "bucketSize": + s.AddField("bucket_size") + x.BucketSize.UnmarshalProtoJSON(s) + case "reload_rate", "reloadRate": + s.AddField("reload_rate") + x.ReloadRate = s.ReadUint32() } }) } -// UnmarshalJSON unmarshals the MACCommand_ResetConf from JSON. -func (x *MACCommand_ResetConf) UnmarshalJSON(b []byte) error { +// UnmarshalJSON unmarshals the RelayUplinkForwardLimits from JSON. +func (x *RelayUplinkForwardLimits) UnmarshalJSON(b []byte) error { return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) } -// MarshalProtoJSON marshals the MACCommand_LinkADRReq message to JSON. -func (x *MACCommand_LinkADRReq) MarshalProtoJSON(s *jsonplugin.MarshalState) { +// MarshalProtoJSON marshals the RelayForwardLimits message to JSON. +func (x *RelayForwardLimits) MarshalProtoJSON(s *jsonplugin.MarshalState) { if x == nil { s.WriteNil() return } s.WriteObjectStart() var wroteField bool - if x.DataRateIndex != 0 || s.HasField("data_rate_index") { - s.WriteMoreIf(&wroteField) - s.WriteObjectField("data_rate_index") - x.DataRateIndex.MarshalProtoJSON(s) - } - if x.TxPowerIndex != 0 || s.HasField("tx_power_index") { - s.WriteMoreIf(&wroteField) - s.WriteObjectField("tx_power_index") - s.WriteUint32(x.TxPowerIndex) - } - if len(x.ChannelMask) > 0 || s.HasField("channel_mask") { - s.WriteMoreIf(&wroteField) - s.WriteObjectField("channel_mask") - s.WriteBoolArray(x.ChannelMask) - } - if x.ChannelMaskControl != 0 || s.HasField("channel_mask_control") { + if x.BucketSize != 0 || s.HasField("bucket_size") { s.WriteMoreIf(&wroteField) - s.WriteObjectField("channel_mask_control") - s.WriteUint32(x.ChannelMaskControl) + s.WriteObjectField("bucket_size") + x.BucketSize.MarshalProtoJSON(s) } - if x.NbTrans != 0 || s.HasField("nb_trans") { + if x.ReloadRate != 0 || s.HasField("reload_rate") { s.WriteMoreIf(&wroteField) - s.WriteObjectField("nb_trans") - s.WriteUint32(x.NbTrans) + s.WriteObjectField("reload_rate") + s.WriteUint32(x.ReloadRate) } s.WriteObjectEnd() } -// MarshalJSON marshals the MACCommand_LinkADRReq to JSON. -func (x *MACCommand_LinkADRReq) MarshalJSON() ([]byte, error) { +// MarshalJSON marshals the RelayForwardLimits to JSON. +func (x *RelayForwardLimits) MarshalJSON() ([]byte, error) { return jsonplugin.DefaultMarshalerConfig.Marshal(x) } -// UnmarshalProtoJSON unmarshals the MACCommand_LinkADRReq message from JSON. -func (x *MACCommand_LinkADRReq) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { +// UnmarshalProtoJSON unmarshals the RelayForwardLimits message from JSON. +func (x *RelayForwardLimits) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { if s.ReadNil() { return } @@ -2463,31 +2815,222 @@ func (x *MACCommand_LinkADRReq) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) switch key { default: s.ReadAny() // ignore unknown field - case "data_rate_index", "dataRateIndex": - s.AddField("data_rate_index") - x.DataRateIndex.UnmarshalProtoJSON(s) - case "tx_power_index", "txPowerIndex": - s.AddField("tx_power_index") - x.TxPowerIndex = s.ReadUint32() - case "channel_mask", "channelMask": - s.AddField("channel_mask") - if s.ReadNil() { - x.ChannelMask = nil - return - } - x.ChannelMask = s.ReadBoolArray() - case "channel_mask_control", "channelMaskControl": - s.AddField("channel_mask_control") - x.ChannelMaskControl = s.ReadUint32() - case "nb_trans", "nbTrans": - s.AddField("nb_trans") - x.NbTrans = s.ReadUint32() + case "bucket_size", "bucketSize": + s.AddField("bucket_size") + x.BucketSize.UnmarshalProtoJSON(s) + case "reload_rate", "reloadRate": + s.AddField("reload_rate") + x.ReloadRate = s.ReadUint32() } }) } -// UnmarshalJSON unmarshals the MACCommand_LinkADRReq from JSON. -func (x *MACCommand_LinkADRReq) UnmarshalJSON(b []byte) error { +// UnmarshalJSON unmarshals the RelayForwardLimits from JSON. +func (x *RelayForwardLimits) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the RelayEndDeviceDynamicMode message to JSON. +func (x *RelayEndDeviceDynamicMode) MarshalProtoJSON(s *jsonplugin.MarshalState) { + if x == nil { + s.WriteNil() + return + } + s.WriteObjectStart() + var wroteField bool + if x.SmartEnableLevel != 0 || s.HasField("smart_enable_level") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("smart_enable_level") + x.SmartEnableLevel.MarshalProtoJSON(s) + } + s.WriteObjectEnd() +} + +// MarshalJSON marshals the RelayEndDeviceDynamicMode to JSON. +func (x *RelayEndDeviceDynamicMode) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// UnmarshalProtoJSON unmarshals the RelayEndDeviceDynamicMode message from JSON. +func (x *RelayEndDeviceDynamicMode) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + if s.ReadNil() { + return + } + s.ReadObject(func(key string) { + switch key { + default: + s.ReadAny() // ignore unknown field + case "smart_enable_level", "smartEnableLevel": + s.AddField("smart_enable_level") + x.SmartEnableLevel.UnmarshalProtoJSON(s) + } + }) +} + +// UnmarshalJSON unmarshals the RelayEndDeviceDynamicMode from JSON. +func (x *RelayEndDeviceDynamicMode) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the MACCommand_ResetInd message to JSON. +func (x *MACCommand_ResetInd) MarshalProtoJSON(s *jsonplugin.MarshalState) { + if x == nil { + s.WriteNil() + return + } + s.WriteObjectStart() + var wroteField bool + if x.MinorVersion != 0 || s.HasField("minor_version") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("minor_version") + x.MinorVersion.MarshalProtoJSON(s) + } + s.WriteObjectEnd() +} + +// MarshalJSON marshals the MACCommand_ResetInd to JSON. +func (x *MACCommand_ResetInd) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// UnmarshalProtoJSON unmarshals the MACCommand_ResetInd message from JSON. +func (x *MACCommand_ResetInd) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + if s.ReadNil() { + return + } + s.ReadObject(func(key string) { + switch key { + default: + s.ReadAny() // ignore unknown field + case "minor_version", "minorVersion": + s.AddField("minor_version") + x.MinorVersion.UnmarshalProtoJSON(s) + } + }) +} + +// UnmarshalJSON unmarshals the MACCommand_ResetInd from JSON. +func (x *MACCommand_ResetInd) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the MACCommand_ResetConf message to JSON. +func (x *MACCommand_ResetConf) MarshalProtoJSON(s *jsonplugin.MarshalState) { + if x == nil { + s.WriteNil() + return + } + s.WriteObjectStart() + var wroteField bool + if x.MinorVersion != 0 || s.HasField("minor_version") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("minor_version") + x.MinorVersion.MarshalProtoJSON(s) + } + s.WriteObjectEnd() +} + +// MarshalJSON marshals the MACCommand_ResetConf to JSON. +func (x *MACCommand_ResetConf) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// UnmarshalProtoJSON unmarshals the MACCommand_ResetConf message from JSON. +func (x *MACCommand_ResetConf) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + if s.ReadNil() { + return + } + s.ReadObject(func(key string) { + switch key { + default: + s.ReadAny() // ignore unknown field + case "minor_version", "minorVersion": + s.AddField("minor_version") + x.MinorVersion.UnmarshalProtoJSON(s) + } + }) +} + +// UnmarshalJSON unmarshals the MACCommand_ResetConf from JSON. +func (x *MACCommand_ResetConf) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the MACCommand_LinkADRReq message to JSON. +func (x *MACCommand_LinkADRReq) MarshalProtoJSON(s *jsonplugin.MarshalState) { + if x == nil { + s.WriteNil() + return + } + s.WriteObjectStart() + var wroteField bool + if x.DataRateIndex != 0 || s.HasField("data_rate_index") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("data_rate_index") + x.DataRateIndex.MarshalProtoJSON(s) + } + if x.TxPowerIndex != 0 || s.HasField("tx_power_index") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("tx_power_index") + s.WriteUint32(x.TxPowerIndex) + } + if len(x.ChannelMask) > 0 || s.HasField("channel_mask") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("channel_mask") + s.WriteBoolArray(x.ChannelMask) + } + if x.ChannelMaskControl != 0 || s.HasField("channel_mask_control") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("channel_mask_control") + s.WriteUint32(x.ChannelMaskControl) + } + if x.NbTrans != 0 || s.HasField("nb_trans") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("nb_trans") + s.WriteUint32(x.NbTrans) + } + s.WriteObjectEnd() +} + +// MarshalJSON marshals the MACCommand_LinkADRReq to JSON. +func (x *MACCommand_LinkADRReq) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// UnmarshalProtoJSON unmarshals the MACCommand_LinkADRReq message from JSON. +func (x *MACCommand_LinkADRReq) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + if s.ReadNil() { + return + } + s.ReadObject(func(key string) { + switch key { + default: + s.ReadAny() // ignore unknown field + case "data_rate_index", "dataRateIndex": + s.AddField("data_rate_index") + x.DataRateIndex.UnmarshalProtoJSON(s) + case "tx_power_index", "txPowerIndex": + s.AddField("tx_power_index") + x.TxPowerIndex = s.ReadUint32() + case "channel_mask", "channelMask": + s.AddField("channel_mask") + if s.ReadNil() { + x.ChannelMask = nil + return + } + x.ChannelMask = s.ReadBoolArray() + case "channel_mask_control", "channelMaskControl": + s.AddField("channel_mask_control") + x.ChannelMaskControl = s.ReadUint32() + case "nb_trans", "nbTrans": + s.AddField("nb_trans") + x.NbTrans = s.ReadUint32() + } + }) +} + +// UnmarshalJSON unmarshals the MACCommand_LinkADRReq from JSON. +func (x *MACCommand_LinkADRReq) UnmarshalJSON(b []byte) error { return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) } @@ -3017,19 +3560,492 @@ func (x *MACCommand_PingSlotInfoReq) MarshalProtoJSON(s *jsonplugin.MarshalState var wroteField bool if x.Period != 0 || s.HasField("period") { s.WriteMoreIf(&wroteField) - s.WriteObjectField("period") - x.Period.MarshalProtoJSON(s) + s.WriteObjectField("period") + x.Period.MarshalProtoJSON(s) + } + s.WriteObjectEnd() +} + +// MarshalJSON marshals the MACCommand_PingSlotInfoReq to JSON. +func (x *MACCommand_PingSlotInfoReq) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// UnmarshalProtoJSON unmarshals the MACCommand_PingSlotInfoReq message from JSON. +func (x *MACCommand_PingSlotInfoReq) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + if s.ReadNil() { + return + } + s.ReadObject(func(key string) { + switch key { + default: + s.ReadAny() // ignore unknown field + case "period": + s.AddField("period") + x.Period.UnmarshalProtoJSON(s) + } + }) +} + +// UnmarshalJSON unmarshals the MACCommand_PingSlotInfoReq from JSON. +func (x *MACCommand_PingSlotInfoReq) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the MACCommand_PingSlotChannelReq message to JSON. +func (x *MACCommand_PingSlotChannelReq) MarshalProtoJSON(s *jsonplugin.MarshalState) { + if x == nil { + s.WriteNil() + return + } + s.WriteObjectStart() + var wroteField bool + if x.Frequency != 0 || s.HasField("frequency") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("frequency") + s.WriteUint64(x.Frequency) + } + if x.DataRateIndex != 0 || s.HasField("data_rate_index") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("data_rate_index") + x.DataRateIndex.MarshalProtoJSON(s) + } + s.WriteObjectEnd() +} + +// MarshalJSON marshals the MACCommand_PingSlotChannelReq to JSON. +func (x *MACCommand_PingSlotChannelReq) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// UnmarshalProtoJSON unmarshals the MACCommand_PingSlotChannelReq message from JSON. +func (x *MACCommand_PingSlotChannelReq) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + if s.ReadNil() { + return + } + s.ReadObject(func(key string) { + switch key { + default: + s.ReadAny() // ignore unknown field + case "frequency": + s.AddField("frequency") + x.Frequency = s.ReadUint64() + case "data_rate_index", "dataRateIndex": + s.AddField("data_rate_index") + x.DataRateIndex.UnmarshalProtoJSON(s) + } + }) +} + +// UnmarshalJSON unmarshals the MACCommand_PingSlotChannelReq from JSON. +func (x *MACCommand_PingSlotChannelReq) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the MACCommand_DeviceModeInd message to JSON. +func (x *MACCommand_DeviceModeInd) MarshalProtoJSON(s *jsonplugin.MarshalState) { + if x == nil { + s.WriteNil() + return + } + s.WriteObjectStart() + var wroteField bool + if x.Class != 0 || s.HasField("class") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("class") + x.Class.MarshalProtoJSON(s) + } + s.WriteObjectEnd() +} + +// MarshalJSON marshals the MACCommand_DeviceModeInd to JSON. +func (x *MACCommand_DeviceModeInd) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// UnmarshalProtoJSON unmarshals the MACCommand_DeviceModeInd message from JSON. +func (x *MACCommand_DeviceModeInd) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + if s.ReadNil() { + return + } + s.ReadObject(func(key string) { + switch key { + default: + s.ReadAny() // ignore unknown field + case "class": + s.AddField("class") + x.Class.UnmarshalProtoJSON(s) + } + }) +} + +// UnmarshalJSON unmarshals the MACCommand_DeviceModeInd from JSON. +func (x *MACCommand_DeviceModeInd) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the MACCommand_DeviceModeConf message to JSON. +func (x *MACCommand_DeviceModeConf) MarshalProtoJSON(s *jsonplugin.MarshalState) { + if x == nil { + s.WriteNil() + return + } + s.WriteObjectStart() + var wroteField bool + if x.Class != 0 || s.HasField("class") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("class") + x.Class.MarshalProtoJSON(s) + } + s.WriteObjectEnd() +} + +// MarshalJSON marshals the MACCommand_DeviceModeConf to JSON. +func (x *MACCommand_DeviceModeConf) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// UnmarshalProtoJSON unmarshals the MACCommand_DeviceModeConf message from JSON. +func (x *MACCommand_DeviceModeConf) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + if s.ReadNil() { + return + } + s.ReadObject(func(key string) { + switch key { + default: + s.ReadAny() // ignore unknown field + case "class": + s.AddField("class") + x.Class.UnmarshalProtoJSON(s) + } + }) +} + +// UnmarshalJSON unmarshals the MACCommand_DeviceModeConf from JSON. +func (x *MACCommand_DeviceModeConf) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the MACCommand_RelayConfReq_Configuration message to JSON. +func (x *MACCommand_RelayConfReq_Configuration) MarshalProtoJSON(s *jsonplugin.MarshalState) { + if x == nil { + s.WriteNil() + return + } + s.WriteObjectStart() + var wroteField bool + if x.SecondChannel != nil || s.HasField("second_channel") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("second_channel") + x.SecondChannel.MarshalProtoJSON(s.WithField("second_channel")) + } + if x.DefaultChannelIndex != 0 || s.HasField("default_channel_index") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("default_channel_index") + s.WriteUint32(x.DefaultChannelIndex) + } + if x.CadPeriodicity != 0 || s.HasField("cad_periodicity") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("cad_periodicity") + x.CadPeriodicity.MarshalProtoJSON(s) + } + s.WriteObjectEnd() +} + +// MarshalJSON marshals the MACCommand_RelayConfReq_Configuration to JSON. +func (x *MACCommand_RelayConfReq_Configuration) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// UnmarshalProtoJSON unmarshals the MACCommand_RelayConfReq_Configuration message from JSON. +func (x *MACCommand_RelayConfReq_Configuration) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + if s.ReadNil() { + return + } + s.ReadObject(func(key string) { + switch key { + default: + s.ReadAny() // ignore unknown field + case "second_channel", "secondChannel": + if s.ReadNil() { + x.SecondChannel = nil + return + } + x.SecondChannel = &RelaySecondChannel{} + x.SecondChannel.UnmarshalProtoJSON(s.WithField("second_channel", true)) + case "default_channel_index", "defaultChannelIndex": + s.AddField("default_channel_index") + x.DefaultChannelIndex = s.ReadUint32() + case "cad_periodicity", "cadPeriodicity": + s.AddField("cad_periodicity") + x.CadPeriodicity.UnmarshalProtoJSON(s) + } + }) +} + +// UnmarshalJSON unmarshals the MACCommand_RelayConfReq_Configuration from JSON. +func (x *MACCommand_RelayConfReq_Configuration) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the MACCommand_RelayConfReq message to JSON. +func (x *MACCommand_RelayConfReq) MarshalProtoJSON(s *jsonplugin.MarshalState) { + if x == nil { + s.WriteNil() + return + } + s.WriteObjectStart() + var wroteField bool + if x.Configuration != nil || s.HasField("configuration") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("configuration") + x.Configuration.MarshalProtoJSON(s.WithField("configuration")) + } + s.WriteObjectEnd() +} + +// MarshalJSON marshals the MACCommand_RelayConfReq to JSON. +func (x *MACCommand_RelayConfReq) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// UnmarshalProtoJSON unmarshals the MACCommand_RelayConfReq message from JSON. +func (x *MACCommand_RelayConfReq) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + if s.ReadNil() { + return + } + s.ReadObject(func(key string) { + switch key { + default: + s.ReadAny() // ignore unknown field + case "configuration": + if s.ReadNil() { + x.Configuration = nil + return + } + x.Configuration = &MACCommand_RelayConfReq_Configuration{} + x.Configuration.UnmarshalProtoJSON(s.WithField("configuration", true)) + } + }) +} + +// UnmarshalJSON unmarshals the MACCommand_RelayConfReq from JSON. +func (x *MACCommand_RelayConfReq) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the MACCommand_RelayEndDeviceConfReq_Configuration message to JSON. +func (x *MACCommand_RelayEndDeviceConfReq_Configuration) MarshalProtoJSON(s *jsonplugin.MarshalState) { + if x == nil { + s.WriteNil() + return + } + s.WriteObjectStart() + var wroteField bool + if x.Mode != nil { + switch ov := x.Mode.(type) { + case *MACCommand_RelayEndDeviceConfReq_Configuration_Always: + s.WriteMoreIf(&wroteField) + s.WriteObjectField("always") + // NOTE: RelayEndDeviceAlwaysMode does not seem to implement MarshalProtoJSON. + golang.MarshalMessage(s, ov.Always) + case *MACCommand_RelayEndDeviceConfReq_Configuration_Dynamic: + s.WriteMoreIf(&wroteField) + s.WriteObjectField("dynamic") + ov.Dynamic.MarshalProtoJSON(s.WithField("dynamic")) + case *MACCommand_RelayEndDeviceConfReq_Configuration_EndDeviceControlled: + s.WriteMoreIf(&wroteField) + s.WriteObjectField("end_device_controlled") + // NOTE: RelayEndDeviceControlledMode does not seem to implement MarshalProtoJSON. + golang.MarshalMessage(s, ov.EndDeviceControlled) + } + } + if x.Backoff != 0 || s.HasField("backoff") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("backoff") + s.WriteUint32(x.Backoff) + } + if x.SecondChannel != nil || s.HasField("second_channel") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("second_channel") + x.SecondChannel.MarshalProtoJSON(s.WithField("second_channel")) + } + if x.ServingDeviceId != "" || s.HasField("serving_device_id") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("serving_device_id") + s.WriteString(x.ServingDeviceId) + } + s.WriteObjectEnd() +} + +// MarshalJSON marshals the MACCommand_RelayEndDeviceConfReq_Configuration to JSON. +func (x *MACCommand_RelayEndDeviceConfReq_Configuration) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// UnmarshalProtoJSON unmarshals the MACCommand_RelayEndDeviceConfReq_Configuration message from JSON. +func (x *MACCommand_RelayEndDeviceConfReq_Configuration) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + if s.ReadNil() { + return + } + s.ReadObject(func(key string) { + switch key { + default: + s.ReadAny() // ignore unknown field + case "always": + s.AddField("always") + ov := &MACCommand_RelayEndDeviceConfReq_Configuration_Always{} + x.Mode = ov + if s.ReadNil() { + ov.Always = nil + return + } + // NOTE: RelayEndDeviceAlwaysMode does not seem to implement UnmarshalProtoJSON. + var v RelayEndDeviceAlwaysMode + golang.UnmarshalMessage(s, &v) + ov.Always = &v + case "dynamic": + ov := &MACCommand_RelayEndDeviceConfReq_Configuration_Dynamic{} + x.Mode = ov + if s.ReadNil() { + ov.Dynamic = nil + return + } + ov.Dynamic = &RelayEndDeviceDynamicMode{} + ov.Dynamic.UnmarshalProtoJSON(s.WithField("dynamic", true)) + case "end_device_controlled", "endDeviceControlled": + s.AddField("end_device_controlled") + ov := &MACCommand_RelayEndDeviceConfReq_Configuration_EndDeviceControlled{} + x.Mode = ov + if s.ReadNil() { + ov.EndDeviceControlled = nil + return + } + // NOTE: RelayEndDeviceControlledMode does not seem to implement UnmarshalProtoJSON. + var v RelayEndDeviceControlledMode + golang.UnmarshalMessage(s, &v) + ov.EndDeviceControlled = &v + case "backoff": + s.AddField("backoff") + x.Backoff = s.ReadUint32() + case "second_channel", "secondChannel": + if s.ReadNil() { + x.SecondChannel = nil + return + } + x.SecondChannel = &RelaySecondChannel{} + x.SecondChannel.UnmarshalProtoJSON(s.WithField("second_channel", true)) + case "serving_device_id", "servingDeviceId": + s.AddField("serving_device_id") + x.ServingDeviceId = s.ReadString() + } + }) +} + +// UnmarshalJSON unmarshals the MACCommand_RelayEndDeviceConfReq_Configuration from JSON. +func (x *MACCommand_RelayEndDeviceConfReq_Configuration) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the MACCommand_RelayEndDeviceConfReq message to JSON. +func (x *MACCommand_RelayEndDeviceConfReq) MarshalProtoJSON(s *jsonplugin.MarshalState) { + if x == nil { + s.WriteNil() + return + } + s.WriteObjectStart() + var wroteField bool + if x.Configuration != nil || s.HasField("configuration") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("configuration") + x.Configuration.MarshalProtoJSON(s.WithField("configuration")) + } + s.WriteObjectEnd() +} + +// MarshalJSON marshals the MACCommand_RelayEndDeviceConfReq to JSON. +func (x *MACCommand_RelayEndDeviceConfReq) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// UnmarshalProtoJSON unmarshals the MACCommand_RelayEndDeviceConfReq message from JSON. +func (x *MACCommand_RelayEndDeviceConfReq) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + if s.ReadNil() { + return + } + s.ReadObject(func(key string) { + switch key { + default: + s.ReadAny() // ignore unknown field + case "configuration": + if s.ReadNil() { + x.Configuration = nil + return + } + x.Configuration = &MACCommand_RelayEndDeviceConfReq_Configuration{} + x.Configuration.UnmarshalProtoJSON(s.WithField("configuration", true)) + } + }) +} + +// UnmarshalJSON unmarshals the MACCommand_RelayEndDeviceConfReq from JSON. +func (x *MACCommand_RelayEndDeviceConfReq) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the MACCommand_RelayUpdateUplinkListReq message to JSON. +func (x *MACCommand_RelayUpdateUplinkListReq) MarshalProtoJSON(s *jsonplugin.MarshalState) { + if x == nil { + s.WriteNil() + return + } + s.WriteObjectStart() + var wroteField bool + if x.RuleIndex != 0 || s.HasField("rule_index") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("rule_index") + s.WriteUint32(x.RuleIndex) + } + if x.ForwardLimits != nil || s.HasField("forward_limits") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("forward_limits") + x.ForwardLimits.MarshalProtoJSON(s.WithField("forward_limits")) + } + if len(x.DevAddr) > 0 || s.HasField("dev_addr") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("dev_addr") + types.MarshalHEXBytes(s.WithField("dev_addr"), x.DevAddr) + } + if x.WFCnt != 0 || s.HasField("w_f_cnt") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("w_f_cnt") + s.WriteUint32(x.WFCnt) + } + if len(x.RootWorSKey) > 0 || s.HasField("root_wor_s_key") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("root_wor_s_key") + types.MarshalHEXBytes(s.WithField("root_wor_s_key"), x.RootWorSKey) + } + if x.DeviceId != "" || s.HasField("device_id") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("device_id") + s.WriteString(x.DeviceId) + } + if len(x.SessionKeyId) > 0 || s.HasField("session_key_id") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("session_key_id") + s.WriteBytes(x.SessionKeyId) } s.WriteObjectEnd() } -// MarshalJSON marshals the MACCommand_PingSlotInfoReq to JSON. -func (x *MACCommand_PingSlotInfoReq) MarshalJSON() ([]byte, error) { +// MarshalJSON marshals the MACCommand_RelayUpdateUplinkListReq to JSON. +func (x *MACCommand_RelayUpdateUplinkListReq) MarshalJSON() ([]byte, error) { return jsonplugin.DefaultMarshalerConfig.Marshal(x) } -// UnmarshalProtoJSON unmarshals the MACCommand_PingSlotInfoReq message from JSON. -func (x *MACCommand_PingSlotInfoReq) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { +// UnmarshalProtoJSON unmarshals the MACCommand_RelayUpdateUplinkListReq message from JSON. +func (x *MACCommand_RelayUpdateUplinkListReq) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { if s.ReadNil() { return } @@ -3037,46 +4053,68 @@ func (x *MACCommand_PingSlotInfoReq) UnmarshalProtoJSON(s *jsonplugin.UnmarshalS switch key { default: s.ReadAny() // ignore unknown field - case "period": - s.AddField("period") - x.Period.UnmarshalProtoJSON(s) + case "rule_index", "ruleIndex": + s.AddField("rule_index") + x.RuleIndex = s.ReadUint32() + case "forward_limits", "forwardLimits": + if s.ReadNil() { + x.ForwardLimits = nil + return + } + x.ForwardLimits = &RelayUplinkForwardLimits{} + x.ForwardLimits.UnmarshalProtoJSON(s.WithField("forward_limits", true)) + case "dev_addr", "devAddr": + s.AddField("dev_addr") + x.DevAddr = types.Unmarshal4Bytes(s.WithField("dev_addr", false)) + case "w_f_cnt", "wFCnt": + s.AddField("w_f_cnt") + x.WFCnt = s.ReadUint32() + case "root_wor_s_key", "rootWorSKey": + s.AddField("root_wor_s_key") + x.RootWorSKey = types.Unmarshal16Bytes(s.WithField("root_wor_s_key", false)) + case "device_id", "deviceId": + s.AddField("device_id") + x.DeviceId = s.ReadString() + case "session_key_id", "sessionKeyId": + s.AddField("session_key_id") + x.SessionKeyId = s.ReadBytes() } }) } -// UnmarshalJSON unmarshals the MACCommand_PingSlotInfoReq from JSON. -func (x *MACCommand_PingSlotInfoReq) UnmarshalJSON(b []byte) error { +// UnmarshalJSON unmarshals the MACCommand_RelayUpdateUplinkListReq from JSON. +func (x *MACCommand_RelayUpdateUplinkListReq) UnmarshalJSON(b []byte) error { return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) } -// MarshalProtoJSON marshals the MACCommand_PingSlotChannelReq message to JSON. -func (x *MACCommand_PingSlotChannelReq) MarshalProtoJSON(s *jsonplugin.MarshalState) { +// MarshalProtoJSON marshals the MACCommand_RelayCtrlUplinkListReq message to JSON. +func (x *MACCommand_RelayCtrlUplinkListReq) MarshalProtoJSON(s *jsonplugin.MarshalState) { if x == nil { s.WriteNil() return } s.WriteObjectStart() var wroteField bool - if x.Frequency != 0 || s.HasField("frequency") { + if x.RuleIndex != 0 || s.HasField("rule_index") { s.WriteMoreIf(&wroteField) - s.WriteObjectField("frequency") - s.WriteUint64(x.Frequency) + s.WriteObjectField("rule_index") + s.WriteUint32(x.RuleIndex) } - if x.DataRateIndex != 0 || s.HasField("data_rate_index") { + if x.Action != 0 || s.HasField("action") { s.WriteMoreIf(&wroteField) - s.WriteObjectField("data_rate_index") - x.DataRateIndex.MarshalProtoJSON(s) + s.WriteObjectField("action") + x.Action.MarshalProtoJSON(s) } s.WriteObjectEnd() } -// MarshalJSON marshals the MACCommand_PingSlotChannelReq to JSON. -func (x *MACCommand_PingSlotChannelReq) MarshalJSON() ([]byte, error) { +// MarshalJSON marshals the MACCommand_RelayCtrlUplinkListReq to JSON. +func (x *MACCommand_RelayCtrlUplinkListReq) MarshalJSON() ([]byte, error) { return jsonplugin.DefaultMarshalerConfig.Marshal(x) } -// UnmarshalProtoJSON unmarshals the MACCommand_PingSlotChannelReq message from JSON. -func (x *MACCommand_PingSlotChannelReq) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { +// UnmarshalProtoJSON unmarshals the MACCommand_RelayCtrlUplinkListReq message from JSON. +func (x *MACCommand_RelayCtrlUplinkListReq) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { if s.ReadNil() { return } @@ -3084,44 +4122,64 @@ func (x *MACCommand_PingSlotChannelReq) UnmarshalProtoJSON(s *jsonplugin.Unmarsh switch key { default: s.ReadAny() // ignore unknown field - case "frequency": - s.AddField("frequency") - x.Frequency = s.ReadUint64() - case "data_rate_index", "dataRateIndex": - s.AddField("data_rate_index") - x.DataRateIndex.UnmarshalProtoJSON(s) + case "rule_index", "ruleIndex": + s.AddField("rule_index") + x.RuleIndex = s.ReadUint32() + case "action": + s.AddField("action") + x.Action.UnmarshalProtoJSON(s) } }) } -// UnmarshalJSON unmarshals the MACCommand_PingSlotChannelReq from JSON. -func (x *MACCommand_PingSlotChannelReq) UnmarshalJSON(b []byte) error { +// UnmarshalJSON unmarshals the MACCommand_RelayCtrlUplinkListReq from JSON. +func (x *MACCommand_RelayCtrlUplinkListReq) UnmarshalJSON(b []byte) error { return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) } -// MarshalProtoJSON marshals the MACCommand_DeviceModeInd message to JSON. -func (x *MACCommand_DeviceModeInd) MarshalProtoJSON(s *jsonplugin.MarshalState) { +// MarshalProtoJSON marshals the MACCommand_RelayConfigureFwdLimitReq message to JSON. +func (x *MACCommand_RelayConfigureFwdLimitReq) MarshalProtoJSON(s *jsonplugin.MarshalState) { if x == nil { s.WriteNil() return } s.WriteObjectStart() var wroteField bool - if x.Class != 0 || s.HasField("class") { + if x.ResetLimitCounter != 0 || s.HasField("reset_limit_counter") { s.WriteMoreIf(&wroteField) - s.WriteObjectField("class") - x.Class.MarshalProtoJSON(s) + s.WriteObjectField("reset_limit_counter") + x.ResetLimitCounter.MarshalProtoJSON(s) + } + if x.JoinRequestLimits != nil || s.HasField("join_request_limits") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("join_request_limits") + x.JoinRequestLimits.MarshalProtoJSON(s.WithField("join_request_limits")) + } + if x.NotifyLimits != nil || s.HasField("notify_limits") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("notify_limits") + x.NotifyLimits.MarshalProtoJSON(s.WithField("notify_limits")) + } + if x.GlobalUplinkLimits != nil || s.HasField("global_uplink_limits") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("global_uplink_limits") + x.GlobalUplinkLimits.MarshalProtoJSON(s.WithField("global_uplink_limits")) + } + if x.OverallLimits != nil || s.HasField("overall_limits") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("overall_limits") + x.OverallLimits.MarshalProtoJSON(s.WithField("overall_limits")) } s.WriteObjectEnd() } -// MarshalJSON marshals the MACCommand_DeviceModeInd to JSON. -func (x *MACCommand_DeviceModeInd) MarshalJSON() ([]byte, error) { +// MarshalJSON marshals the MACCommand_RelayConfigureFwdLimitReq to JSON. +func (x *MACCommand_RelayConfigureFwdLimitReq) MarshalJSON() ([]byte, error) { return jsonplugin.DefaultMarshalerConfig.Marshal(x) } -// UnmarshalProtoJSON unmarshals the MACCommand_DeviceModeInd message from JSON. -func (x *MACCommand_DeviceModeInd) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { +// UnmarshalProtoJSON unmarshals the MACCommand_RelayConfigureFwdLimitReq message from JSON. +func (x *MACCommand_RelayConfigureFwdLimitReq) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { if s.ReadNil() { return } @@ -3129,41 +4187,79 @@ func (x *MACCommand_DeviceModeInd) UnmarshalProtoJSON(s *jsonplugin.UnmarshalSta switch key { default: s.ReadAny() // ignore unknown field - case "class": - s.AddField("class") - x.Class.UnmarshalProtoJSON(s) + case "reset_limit_counter", "resetLimitCounter": + s.AddField("reset_limit_counter") + x.ResetLimitCounter.UnmarshalProtoJSON(s) + case "join_request_limits", "joinRequestLimits": + if s.ReadNil() { + x.JoinRequestLimits = nil + return + } + x.JoinRequestLimits = &RelayForwardLimits{} + x.JoinRequestLimits.UnmarshalProtoJSON(s.WithField("join_request_limits", true)) + case "notify_limits", "notifyLimits": + if s.ReadNil() { + x.NotifyLimits = nil + return + } + x.NotifyLimits = &RelayForwardLimits{} + x.NotifyLimits.UnmarshalProtoJSON(s.WithField("notify_limits", true)) + case "global_uplink_limits", "globalUplinkLimits": + if s.ReadNil() { + x.GlobalUplinkLimits = nil + return + } + x.GlobalUplinkLimits = &RelayForwardLimits{} + x.GlobalUplinkLimits.UnmarshalProtoJSON(s.WithField("global_uplink_limits", true)) + case "overall_limits", "overallLimits": + if s.ReadNil() { + x.OverallLimits = nil + return + } + x.OverallLimits = &RelayForwardLimits{} + x.OverallLimits.UnmarshalProtoJSON(s.WithField("overall_limits", true)) } }) } -// UnmarshalJSON unmarshals the MACCommand_DeviceModeInd from JSON. -func (x *MACCommand_DeviceModeInd) UnmarshalJSON(b []byte) error { +// UnmarshalJSON unmarshals the MACCommand_RelayConfigureFwdLimitReq from JSON. +func (x *MACCommand_RelayConfigureFwdLimitReq) UnmarshalJSON(b []byte) error { return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) } -// MarshalProtoJSON marshals the MACCommand_DeviceModeConf message to JSON. -func (x *MACCommand_DeviceModeConf) MarshalProtoJSON(s *jsonplugin.MarshalState) { +// MarshalProtoJSON marshals the MACCommand_RelayNotifyNewEndDeviceReq message to JSON. +func (x *MACCommand_RelayNotifyNewEndDeviceReq) MarshalProtoJSON(s *jsonplugin.MarshalState) { if x == nil { s.WriteNil() return } s.WriteObjectStart() var wroteField bool - if x.Class != 0 || s.HasField("class") { + if len(x.DevAddr) > 0 || s.HasField("dev_addr") { s.WriteMoreIf(&wroteField) - s.WriteObjectField("class") - x.Class.MarshalProtoJSON(s) + s.WriteObjectField("dev_addr") + types.MarshalHEXBytes(s.WithField("dev_addr"), x.DevAddr) + } + if x.Snr != 0 || s.HasField("snr") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("snr") + s.WriteInt32(x.Snr) + } + if x.Rssi != 0 || s.HasField("rssi") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("rssi") + s.WriteInt32(x.Rssi) } s.WriteObjectEnd() } -// MarshalJSON marshals the MACCommand_DeviceModeConf to JSON. -func (x *MACCommand_DeviceModeConf) MarshalJSON() ([]byte, error) { +// MarshalJSON marshals the MACCommand_RelayNotifyNewEndDeviceReq to JSON. +func (x *MACCommand_RelayNotifyNewEndDeviceReq) MarshalJSON() ([]byte, error) { return jsonplugin.DefaultMarshalerConfig.Marshal(x) } -// UnmarshalProtoJSON unmarshals the MACCommand_DeviceModeConf message from JSON. -func (x *MACCommand_DeviceModeConf) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { +// UnmarshalProtoJSON unmarshals the MACCommand_RelayNotifyNewEndDeviceReq message from JSON. +func (x *MACCommand_RelayNotifyNewEndDeviceReq) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { if s.ReadNil() { return } @@ -3171,15 +4267,21 @@ func (x *MACCommand_DeviceModeConf) UnmarshalProtoJSON(s *jsonplugin.UnmarshalSt switch key { default: s.ReadAny() // ignore unknown field - case "class": - s.AddField("class") - x.Class.UnmarshalProtoJSON(s) + case "dev_addr", "devAddr": + s.AddField("dev_addr") + x.DevAddr = types.Unmarshal4Bytes(s.WithField("dev_addr", false)) + case "snr": + s.AddField("snr") + x.Snr = s.ReadInt32() + case "rssi": + s.AddField("rssi") + x.Rssi = s.ReadInt32() } }) } -// UnmarshalJSON unmarshals the MACCommand_DeviceModeConf from JSON. -func (x *MACCommand_DeviceModeConf) UnmarshalJSON(b []byte) error { +// UnmarshalJSON unmarshals the MACCommand_RelayNotifyNewEndDeviceReq from JSON. +func (x *MACCommand_RelayNotifyNewEndDeviceReq) UnmarshalJSON(b []byte) error { return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) } @@ -3335,6 +4437,55 @@ func (x *MACCommand) MarshalProtoJSON(s *jsonplugin.MarshalState) { s.WriteMoreIf(&wroteField) s.WriteObjectField("device_mode_conf") ov.DeviceModeConf.MarshalProtoJSON(s.WithField("device_mode_conf")) + case *MACCommand_RelayConfReq_: + s.WriteMoreIf(&wroteField) + s.WriteObjectField("relay_conf_req") + ov.RelayConfReq.MarshalProtoJSON(s.WithField("relay_conf_req")) + case *MACCommand_RelayConfAns_: + s.WriteMoreIf(&wroteField) + s.WriteObjectField("relay_conf_ans") + // NOTE: MACCommand_RelayConfAns does not seem to implement MarshalProtoJSON. + golang.MarshalMessage(s, ov.RelayConfAns) + case *MACCommand_RelayEndDeviceConfReq_: + s.WriteMoreIf(&wroteField) + s.WriteObjectField("relay_end_device_conf_req") + ov.RelayEndDeviceConfReq.MarshalProtoJSON(s.WithField("relay_end_device_conf_req")) + case *MACCommand_RelayEndDeviceConfAns_: + s.WriteMoreIf(&wroteField) + s.WriteObjectField("relay_end_device_conf_ans") + // NOTE: MACCommand_RelayEndDeviceConfAns does not seem to implement MarshalProtoJSON. + golang.MarshalMessage(s, ov.RelayEndDeviceConfAns) + case *MACCommand_RelayUpdateUplinkListReq_: + s.WriteMoreIf(&wroteField) + s.WriteObjectField("relay_update_uplink_list_req") + ov.RelayUpdateUplinkListReq.MarshalProtoJSON(s.WithField("relay_update_uplink_list_req")) + case *MACCommand_RelayUpdateUplinkListAns_: + s.WriteMoreIf(&wroteField) + s.WriteObjectField("relay_update_uplink_list_ans") + // NOTE: MACCommand_RelayUpdateUplinkListAns does not seem to implement MarshalProtoJSON. + golang.MarshalMessage(s, ov.RelayUpdateUplinkListAns) + case *MACCommand_RelayCtrlUplinkListReq_: + s.WriteMoreIf(&wroteField) + s.WriteObjectField("relay_ctrl_uplink_list_req") + ov.RelayCtrlUplinkListReq.MarshalProtoJSON(s.WithField("relay_ctrl_uplink_list_req")) + case *MACCommand_RelayCtrlUplinkListAns_: + s.WriteMoreIf(&wroteField) + s.WriteObjectField("relay_ctrl_uplink_list_ans") + // NOTE: MACCommand_RelayCtrlUplinkListAns does not seem to implement MarshalProtoJSON. + golang.MarshalMessage(s, ov.RelayCtrlUplinkListAns) + case *MACCommand_RelayConfigureFwdLimitReq_: + s.WriteMoreIf(&wroteField) + s.WriteObjectField("relay_configure_fwd_limit_req") + ov.RelayConfigureFwdLimitReq.MarshalProtoJSON(s.WithField("relay_configure_fwd_limit_req")) + case *MACCommand_RelayConfigureFwdLimitAns_: + s.WriteMoreIf(&wroteField) + s.WriteObjectField("relay_configure_fwd_limit_ans") + // NOTE: MACCommand_RelayConfigureFwdLimitAns does not seem to implement MarshalProtoJSON. + golang.MarshalMessage(s, ov.RelayConfigureFwdLimitAns) + case *MACCommand_RelayNotifyNewEndDeviceReq_: + s.WriteMoreIf(&wroteField) + s.WriteObjectField("relay_notify_new_end_device_req") + ov.RelayNotifyNewEndDeviceReq.MarshalProtoJSON(s.WithField("relay_notify_new_end_device_req")) } } s.WriteObjectEnd() @@ -3671,6 +4822,120 @@ func (x *MACCommand) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { } ov.DeviceModeConf = &MACCommand_DeviceModeConf{} ov.DeviceModeConf.UnmarshalProtoJSON(s.WithField("device_mode_conf", true)) + case "relay_conf_req", "relayConfReq": + ov := &MACCommand_RelayConfReq_{} + x.Payload = ov + if s.ReadNil() { + ov.RelayConfReq = nil + return + } + ov.RelayConfReq = &MACCommand_RelayConfReq{} + ov.RelayConfReq.UnmarshalProtoJSON(s.WithField("relay_conf_req", true)) + case "relay_conf_ans", "relayConfAns": + s.AddField("relay_conf_ans") + ov := &MACCommand_RelayConfAns_{} + x.Payload = ov + if s.ReadNil() { + ov.RelayConfAns = nil + return + } + // NOTE: MACCommand_RelayConfAns does not seem to implement UnmarshalProtoJSON. + var v MACCommand_RelayConfAns + golang.UnmarshalMessage(s, &v) + ov.RelayConfAns = &v + case "relay_end_device_conf_req", "relayEndDeviceConfReq": + ov := &MACCommand_RelayEndDeviceConfReq_{} + x.Payload = ov + if s.ReadNil() { + ov.RelayEndDeviceConfReq = nil + return + } + ov.RelayEndDeviceConfReq = &MACCommand_RelayEndDeviceConfReq{} + ov.RelayEndDeviceConfReq.UnmarshalProtoJSON(s.WithField("relay_end_device_conf_req", true)) + case "relay_end_device_conf_ans", "relayEndDeviceConfAns": + s.AddField("relay_end_device_conf_ans") + ov := &MACCommand_RelayEndDeviceConfAns_{} + x.Payload = ov + if s.ReadNil() { + ov.RelayEndDeviceConfAns = nil + return + } + // NOTE: MACCommand_RelayEndDeviceConfAns does not seem to implement UnmarshalProtoJSON. + var v MACCommand_RelayEndDeviceConfAns + golang.UnmarshalMessage(s, &v) + ov.RelayEndDeviceConfAns = &v + case "relay_update_uplink_list_req", "relayUpdateUplinkListReq": + ov := &MACCommand_RelayUpdateUplinkListReq_{} + x.Payload = ov + if s.ReadNil() { + ov.RelayUpdateUplinkListReq = nil + return + } + ov.RelayUpdateUplinkListReq = &MACCommand_RelayUpdateUplinkListReq{} + ov.RelayUpdateUplinkListReq.UnmarshalProtoJSON(s.WithField("relay_update_uplink_list_req", true)) + case "relay_update_uplink_list_ans", "relayUpdateUplinkListAns": + s.AddField("relay_update_uplink_list_ans") + ov := &MACCommand_RelayUpdateUplinkListAns_{} + x.Payload = ov + if s.ReadNil() { + ov.RelayUpdateUplinkListAns = nil + return + } + // NOTE: MACCommand_RelayUpdateUplinkListAns does not seem to implement UnmarshalProtoJSON. + var v MACCommand_RelayUpdateUplinkListAns + golang.UnmarshalMessage(s, &v) + ov.RelayUpdateUplinkListAns = &v + case "relay_ctrl_uplink_list_req", "relayCtrlUplinkListReq": + ov := &MACCommand_RelayCtrlUplinkListReq_{} + x.Payload = ov + if s.ReadNil() { + ov.RelayCtrlUplinkListReq = nil + return + } + ov.RelayCtrlUplinkListReq = &MACCommand_RelayCtrlUplinkListReq{} + ov.RelayCtrlUplinkListReq.UnmarshalProtoJSON(s.WithField("relay_ctrl_uplink_list_req", true)) + case "relay_ctrl_uplink_list_ans", "relayCtrlUplinkListAns": + s.AddField("relay_ctrl_uplink_list_ans") + ov := &MACCommand_RelayCtrlUplinkListAns_{} + x.Payload = ov + if s.ReadNil() { + ov.RelayCtrlUplinkListAns = nil + return + } + // NOTE: MACCommand_RelayCtrlUplinkListAns does not seem to implement UnmarshalProtoJSON. + var v MACCommand_RelayCtrlUplinkListAns + golang.UnmarshalMessage(s, &v) + ov.RelayCtrlUplinkListAns = &v + case "relay_configure_fwd_limit_req", "relayConfigureFwdLimitReq": + ov := &MACCommand_RelayConfigureFwdLimitReq_{} + x.Payload = ov + if s.ReadNil() { + ov.RelayConfigureFwdLimitReq = nil + return + } + ov.RelayConfigureFwdLimitReq = &MACCommand_RelayConfigureFwdLimitReq{} + ov.RelayConfigureFwdLimitReq.UnmarshalProtoJSON(s.WithField("relay_configure_fwd_limit_req", true)) + case "relay_configure_fwd_limit_ans", "relayConfigureFwdLimitAns": + s.AddField("relay_configure_fwd_limit_ans") + ov := &MACCommand_RelayConfigureFwdLimitAns_{} + x.Payload = ov + if s.ReadNil() { + ov.RelayConfigureFwdLimitAns = nil + return + } + // NOTE: MACCommand_RelayConfigureFwdLimitAns does not seem to implement UnmarshalProtoJSON. + var v MACCommand_RelayConfigureFwdLimitAns + golang.UnmarshalMessage(s, &v) + ov.RelayConfigureFwdLimitAns = &v + case "relay_notify_new_end_device_req", "relayNotifyNewEndDeviceReq": + ov := &MACCommand_RelayNotifyNewEndDeviceReq_{} + x.Payload = ov + if s.ReadNil() { + ov.RelayNotifyNewEndDeviceReq = nil + return + } + ov.RelayNotifyNewEndDeviceReq = &MACCommand_RelayNotifyNewEndDeviceReq{} + ov.RelayNotifyNewEndDeviceReq.UnmarshalProtoJSON(s.WithField("relay_notify_new_end_device_req", true)) } }) } @@ -4032,3 +5297,155 @@ func (x *DeviceEIRPValue) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { func (x *DeviceEIRPValue) UnmarshalJSON(b []byte) error { return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) } + +// MarshalProtoJSON marshals the RelayForwardUplinkReq message to JSON. +func (x *RelayForwardUplinkReq) MarshalProtoJSON(s *jsonplugin.MarshalState) { + if x == nil { + s.WriteNil() + return + } + s.WriteObjectStart() + var wroteField bool + if x.DataRate != nil || s.HasField("data_rate") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("data_rate") + // NOTE: DataRate does not seem to implement MarshalProtoJSON. + golang.MarshalMessage(s, x.DataRate) + } + if x.Snr != 0 || s.HasField("snr") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("snr") + s.WriteInt32(x.Snr) + } + if x.Rssi != 0 || s.HasField("rssi") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("rssi") + s.WriteInt32(x.Rssi) + } + if x.WorChannel != 0 || s.HasField("wor_channel") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("wor_channel") + x.WorChannel.MarshalProtoJSON(s) + } + if x.Frequency != 0 || s.HasField("frequency") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("frequency") + s.WriteUint64(x.Frequency) + } + if len(x.RawPayload) > 0 || s.HasField("raw_payload") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("raw_payload") + s.WriteBytes(x.RawPayload) + } + s.WriteObjectEnd() +} + +// MarshalJSON marshals the RelayForwardUplinkReq to JSON. +func (x *RelayForwardUplinkReq) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// UnmarshalProtoJSON unmarshals the RelayForwardUplinkReq message from JSON. +func (x *RelayForwardUplinkReq) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + if s.ReadNil() { + return + } + s.ReadObject(func(key string) { + switch key { + default: + s.ReadAny() // ignore unknown field + case "data_rate", "dataRate": + s.AddField("data_rate") + if s.ReadNil() { + x.DataRate = nil + return + } + // NOTE: DataRate does not seem to implement UnmarshalProtoJSON. + var v DataRate + golang.UnmarshalMessage(s, &v) + x.DataRate = &v + case "snr": + s.AddField("snr") + x.Snr = s.ReadInt32() + case "rssi": + s.AddField("rssi") + x.Rssi = s.ReadInt32() + case "wor_channel", "worChannel": + s.AddField("wor_channel") + x.WorChannel.UnmarshalProtoJSON(s) + case "frequency": + s.AddField("frequency") + x.Frequency = s.ReadUint64() + case "raw_payload", "rawPayload": + s.AddField("raw_payload") + x.RawPayload = s.ReadBytes() + } + }) +} + +// UnmarshalJSON unmarshals the RelayForwardUplinkReq from JSON. +func (x *RelayForwardUplinkReq) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} + +// MarshalProtoJSON marshals the RelayUplinkToken message to JSON. +func (x *RelayUplinkToken) MarshalProtoJSON(s *jsonplugin.MarshalState) { + if x == nil { + s.WriteNil() + return + } + s.WriteObjectStart() + var wroteField bool + if x.Ids != nil || s.HasField("ids") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("ids") + x.Ids.MarshalProtoJSON(s.WithField("ids")) + } + if len(x.SessionKeyId) > 0 || s.HasField("session_key_id") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("session_key_id") + s.WriteBytes(x.SessionKeyId) + } + if x.FullFCnt != 0 || s.HasField("full_f_cnt") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("full_f_cnt") + s.WriteUint32(x.FullFCnt) + } + s.WriteObjectEnd() +} + +// MarshalJSON marshals the RelayUplinkToken to JSON. +func (x *RelayUplinkToken) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// UnmarshalProtoJSON unmarshals the RelayUplinkToken message from JSON. +func (x *RelayUplinkToken) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + if s.ReadNil() { + return + } + s.ReadObject(func(key string) { + switch key { + default: + s.ReadAny() // ignore unknown field + case "ids": + if s.ReadNil() { + x.Ids = nil + return + } + x.Ids = &EndDeviceIdentifiers{} + x.Ids.UnmarshalProtoJSON(s.WithField("ids", true)) + case "session_key_id", "sessionKeyId": + s.AddField("session_key_id") + x.SessionKeyId = s.ReadBytes() + case "full_f_cnt", "fullFCnt": + s.AddField("full_f_cnt") + x.FullFCnt = s.ReadUint32() + } + }) +} + +// UnmarshalJSON unmarshals the RelayUplinkToken from JSON. +func (x *RelayUplinkToken) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} diff --git a/pkg/ttnpb/lorawan_mac_commands.go b/pkg/ttnpb/lorawan_mac_commands.go index 407b8d4d9b..38b0167494 100644 --- a/pkg/ttnpb/lorawan_mac_commands.go +++ b/pkg/ttnpb/lorawan_mac_commands.go @@ -328,3 +328,141 @@ func (pld *MACCommand_DeviceModeConf) MACCommand() *MACCommand { }, } } + +// MACCommand returns the RelayConfReq MAC command as a *MACCommand. +func (pld *MACCommand_RelayConfReq) MACCommand() *MACCommand { + return &MACCommand{ + Cid: MACCommandIdentifier_CID_RELAY_CONF, + Payload: &MACCommand_RelayConfReq_{ + RelayConfReq: pld, + }, + } +} + +// MACCommand returns the RelayConfAns MAC command as a *MACCommand. +func (pld *MACCommand_RelayConfAns) MACCommand() *MACCommand { + return &MACCommand{ + Cid: MACCommandIdentifier_CID_RELAY_CONF, + Payload: &MACCommand_RelayConfAns_{ + RelayConfAns: pld, + }, + } +} + +// MACCommand returns the EndDeviceConfReq MAC command as a *MACCommand. +func (pld *MACCommand_RelayEndDeviceConfReq) MACCommand() *MACCommand { + return &MACCommand{ + Cid: MACCommandIdentifier_CID_RELAY_END_DEVICE_CONF, + Payload: &MACCommand_RelayEndDeviceConfReq_{ + RelayEndDeviceConfReq: pld, + }, + } +} + +// MACCommand returns the EndDeviceConfAns MAC command as a *MACCommand. +func (pld *MACCommand_RelayEndDeviceConfAns) MACCommand() *MACCommand { + return &MACCommand{ + Cid: MACCommandIdentifier_CID_RELAY_END_DEVICE_CONF, + Payload: &MACCommand_RelayEndDeviceConfAns_{ + RelayEndDeviceConfAns: pld, + }, + } +} + +// MACCommand returns the UpdateUplinkListReq MAC command as a *MACCommand. +func (pld *MACCommand_RelayUpdateUplinkListReq) MACCommand() *MACCommand { + return &MACCommand{ + Cid: MACCommandIdentifier_CID_RELAY_UPDATE_UPLINK_LIST, + Payload: &MACCommand_RelayUpdateUplinkListReq_{ + RelayUpdateUplinkListReq: pld, + }, + } +} + +// MACCommand returns the UpdateUplinkListAns MAC command as a *MACCommand. +func (pld *MACCommand_RelayUpdateUplinkListAns) MACCommand() *MACCommand { + return &MACCommand{ + Cid: MACCommandIdentifier_CID_RELAY_UPDATE_UPLINK_LIST, + Payload: &MACCommand_RelayUpdateUplinkListAns_{ + RelayUpdateUplinkListAns: pld, + }, + } +} + +// MACCommand returns the RelayCtrlUplinkListReq MAC command as a *MACCommand. +func (pld *MACCommand_RelayCtrlUplinkListReq) MACCommand() *MACCommand { + return &MACCommand{ + Cid: MACCommandIdentifier_CID_RELAY_CTRL_UPLINK_LIST, + Payload: &MACCommand_RelayCtrlUplinkListReq_{ + RelayCtrlUplinkListReq: pld, + }, + } +} + +// MACCommand returns the RelayCtrlUplinkListAns MAC command as a *MACCommand. +func (pld *MACCommand_RelayCtrlUplinkListAns) MACCommand() *MACCommand { + return &MACCommand{ + Cid: MACCommandIdentifier_CID_RELAY_CTRL_UPLINK_LIST, + Payload: &MACCommand_RelayCtrlUplinkListAns_{ + RelayCtrlUplinkListAns: pld, + }, + } +} + +// MACCommand returns the ConfigureFwdLimitReq MAC command as a *MACCommand. +func (pld *MACCommand_RelayConfigureFwdLimitReq) MACCommand() *MACCommand { + return &MACCommand{ + Cid: MACCommandIdentifier_CID_RELAY_CONFIGURE_FWD_LIMIT, + Payload: &MACCommand_RelayConfigureFwdLimitReq_{ + RelayConfigureFwdLimitReq: pld, + }, + } +} + +// MACCommand returns the ConfigureFwdLimitAns MAC command as a *MACCommand. +func (pld *MACCommand_RelayConfigureFwdLimitAns) MACCommand() *MACCommand { + return &MACCommand{ + Cid: MACCommandIdentifier_CID_RELAY_CONFIGURE_FWD_LIMIT, + Payload: &MACCommand_RelayConfigureFwdLimitAns_{ + RelayConfigureFwdLimitAns: pld, + }, + } +} + +// MACCommand returns the NotifyNewEndDeviceReq MAC command as a *MACCommand. +func (pld *MACCommand_RelayNotifyNewEndDeviceReq) MACCommand() *MACCommand { + return &MACCommand{ + Cid: MACCommandIdentifier_CID_RELAY_NOTIFY_NEW_END_DEVICE, + Payload: &MACCommand_RelayNotifyNewEndDeviceReq_{ + RelayNotifyNewEndDeviceReq: pld, + }, + } +} + +// sanitizableMACCommandPayload is a MAC command payload that can be sanitized. +type sanitizableMACCommandPayload interface { + // sanitizedMACCommand returns a sanitized copy of the MAC command. + sanitizedMACCommand() *MACCommand +} + +// Sanitized returns a sanitized copy of the MAC command. +func (m *MACCommand) Sanitized() *MACCommand { + if v, ok := m.GetPayload().(sanitizableMACCommandPayload); ok { + return v.sanitizedMACCommand() + } + return m +} + +var _ sanitizableMACCommandPayload = (*MACCommand_RelayUpdateUplinkListReq_)(nil) + +// Sanitized returns a sanitized copy of the payload. +func (pld *MACCommand_RelayUpdateUplinkListReq) Sanitized() *MACCommand_RelayUpdateUplinkListReq { + pld = Clone(pld) + pld.RootWorSKey = nil + return pld +} + +// sanitizedMACCommand returns a sanitized copy of the MAC command. +func (pld *MACCommand_RelayUpdateUplinkListReq_) sanitizedMACCommand() *MACCommand { + return pld.RelayUpdateUplinkListReq.Sanitized().MACCommand() +} diff --git a/pkg/ttnpb/metadata.pb.go b/pkg/ttnpb/metadata.pb.go index 9ae514f75a..a3ec06d512 100644 --- a/pkg/ttnpb/metadata.pb.go +++ b/pkg/ttnpb/metadata.pb.go @@ -126,6 +126,7 @@ type RxMetadata struct { GatewayIds *GatewayIdentifiers `protobuf:"bytes,1,opt,name=gateway_ids,json=gatewayIds,proto3" json:"gateway_ids,omitempty"` PacketBroker *PacketBrokerMetadata `protobuf:"bytes,18,opt,name=packet_broker,json=packetBroker,proto3" json:"packet_broker,omitempty"` + Relay *RelayMetadata `protobuf:"bytes,23,opt,name=relay,proto3" json:"relay,omitempty"` AntennaIndex uint32 `protobuf:"varint,2,opt,name=antenna_index,json=antennaIndex,proto3" json:"antenna_index,omitempty"` // Timestamp at the end of the transmission, provided by the gateway. The accuracy is undefined. Time *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=time,proto3" json:"time,omitempty"` @@ -218,6 +219,13 @@ func (x *RxMetadata) GetPacketBroker() *PacketBrokerMetadata { return nil } +func (x *RxMetadata) GetRelay() *RelayMetadata { + if x != nil { + return x.Relay + } + return nil +} + func (x *RxMetadata) GetAntennaIndex() uint32 { if x != nil { return x.AntennaIndex @@ -663,6 +671,63 @@ func (x *PacketBrokerRouteHop) GetReceiverAgent() string { return "" } +type RelayMetadata struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // End device identifiers of the relay. + DeviceId string `protobuf:"bytes,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` + // Wake on radio channel. + WorChannel RelayWORChannel `protobuf:"varint,2,opt,name=wor_channel,json=worChannel,proto3,enum=ttn.lorawan.v3.RelayWORChannel" json:"wor_channel,omitempty"` +} + +func (x *RelayMetadata) Reset() { + *x = RelayMetadata{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_metadata_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RelayMetadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RelayMetadata) ProtoMessage() {} + +func (x *RelayMetadata) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_metadata_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RelayMetadata.ProtoReflect.Descriptor instead. +func (*RelayMetadata) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_metadata_proto_rawDescGZIP(), []int{4} +} + +func (x *RelayMetadata) GetDeviceId() string { + if x != nil { + return x.DeviceId + } + return "" +} + +func (x *RelayMetadata) GetWorChannel() RelayWORChannel { + if x != nil { + return x.WorChannel + } + return RelayWORChannel_RELAY_WOR_CHANNEL_DEFAULT +} + var File_ttn_lorawan_v3_metadata_proto protoreflect.FileDescriptor var file_ttn_lorawan_v3_metadata_proto_rawDesc = []byte{ @@ -686,201 +751,216 @@ var file_ttn_lorawan_v3_metadata_proto_rawDesc = []byte{ 0x2f, 0x76, 0x33, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x74, 0x74, 0x6e, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2f, 0x76, 0x33, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x95, 0x09, 0x0a, 0x0a, 0x52, - 0x78, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x4d, 0x0a, 0x0b, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, - 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x73, 0x12, 0x49, 0x0a, 0x0d, 0x70, 0x61, 0x63, 0x6b, - 0x65, 0x74, 0x5f, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, - 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0c, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x72, 0x6f, - 0x6b, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6e, 0x74, 0x65, 0x6e, 0x6e, 0x61, 0x5f, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x61, 0x6e, 0x74, 0x65, - 0x6e, 0x6e, 0x61, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, - 0x66, 0x69, 0x6e, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x38, 0x0a, - 0x18, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x6e, 0x65, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x16, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x46, 0x69, 0x6e, 0x65, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x44, 0x0a, 0x1f, 0x65, 0x6e, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x1b, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x46, 0x69, 0x6e, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x72, 0x73, 0x73, 0x69, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x04, 0x72, 0x73, 0x73, - 0x69, 0x12, 0x3c, 0x0a, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x5f, 0x72, 0x73, 0x73, 0x69, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x73, 0x73, 0x69, 0x12, - 0x21, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x72, 0x73, 0x73, 0x69, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x73, - 0x73, 0x69, 0x12, 0x36, 0x0a, 0x17, 0x72, 0x73, 0x73, 0x69, 0x5f, 0x73, 0x74, 0x61, 0x6e, 0x64, - 0x61, 0x72, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x15, 0x72, 0x73, 0x73, 0x69, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, - 0x64, 0x44, 0x65, 0x76, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x6e, - 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x73, 0x6e, 0x72, 0x12, 0x29, 0x0a, 0x10, - 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x79, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x34, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x74, 0x6e, 0x2e, - 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x6a, 0x0a, - 0x18, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, - 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, - 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, - 0x01, 0x52, 0x16, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x43, - 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x70, 0x6c, - 0x69, 0x6e, 0x6b, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0b, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2d, 0x0a, 0x0d, - 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x0d, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x2a, 0x03, 0x18, 0xff, 0x01, 0x52, 0x0c, 0x63, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x23, 0x0a, 0x0d, 0x68, - 0x6f, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x13, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0c, 0x68, 0x6f, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x64, 0x74, 0x68, - 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x64, 0x72, - 0x69, 0x66, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x66, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x79, 0x44, 0x72, 0x69, 0x66, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x67, 0x70, 0x73, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x67, 0x70, 0x73, 0x54, 0x69, 0x6d, 0x65, - 0x12, 0x3b, 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x33, 0x0a, - 0x08, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x63, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, - 0x65, 0x64, 0x22, 0x80, 0x02, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x33, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x01, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x12, 0x12, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x56, - 0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x56, 0xc0, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, - 0x74, 0x75, 0x64, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x12, 0x12, 0x19, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x66, 0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x66, 0xc0, - 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x61, - 0x6c, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x61, - 0x6c, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x75, 0x72, - 0x61, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x61, 0x63, 0x63, 0x75, 0x72, - 0x61, 0x63, 0x79, 0x12, 0x46, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, - 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x42, 0x0e, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0xf2, 0xaa, 0x19, - 0x02, 0x10, 0x00, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3a, 0x08, 0xf2, 0xaa, 0x19, - 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0xae, 0x08, 0x0a, 0x14, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, - 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1d, - 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0xd5, 0x01, - 0x0a, 0x10, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x65, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0xaa, 0x01, 0x92, 0x41, 0x17, 0x4a, 0x08, - 0x22, 0x30, 0x30, 0x30, 0x30, 0x31, 0x33, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, 0x42, 0x06, 0x7a, 0x04, 0x68, 0x03, 0x70, 0x01, 0xea, 0xaa, - 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, - 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, - 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, - 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, - 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, - 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x33, - 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x0e, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, - 0x4e, 0x65, 0x74, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, - 0x65, 0x72, 0x5f, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x11, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x54, 0x65, 0x6e, - 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, - 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x12, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0xe9, 0x01, 0x0a, 0x15, 0x66, 0x6f, 0x72, 0x77, - 0x61, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x65, 0x75, - 0x69, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x42, 0xb4, 0x01, 0x92, 0x41, 0x21, 0x4a, 0x12, 0x22, - 0x37, 0x30, 0x42, 0x33, 0x44, 0x35, 0x37, 0x45, 0x44, 0x30, 0x30, 0x30, 0x41, 0x42, 0x43, 0x44, - 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, 0x42, - 0x06, 0x7a, 0x04, 0x68, 0x08, 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, 0x6f, - 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x61, - 0x72, 0x73, 0x68, 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x67, - 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, - 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x38, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x13, - 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x45, 0x75, 0x69, 0x12, 0x4e, 0x0a, 0x14, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, - 0x5f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x12, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x49, 0x64, 0x12, 0xda, 0x01, 0x0a, 0x13, 0x68, 0x6f, 0x6d, 0x65, 0x5f, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0c, 0x42, 0xaa, 0x01, 0x92, 0x41, 0x17, 0x4a, 0x08, 0x22, 0x30, 0x30, 0x30, 0x30, 0x31, 0x33, - 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, 0x42, - 0x06, 0x7a, 0x04, 0x68, 0x03, 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, 0x6f, - 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x61, - 0x72, 0x73, 0x68, 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x67, - 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, - 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x33, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x10, - 0x68, 0x6f, 0x6d, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x65, 0x74, 0x49, 0x64, - 0x12, 0x33, 0x0a, 0x16, 0x68, 0x6f, 0x6d, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x5f, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x13, 0x68, 0x6f, 0x6d, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x65, 0x6e, - 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x35, 0x0a, 0x17, 0x68, 0x6f, 0x6d, 0x65, 0x5f, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x68, 0x6f, 0x6d, 0x65, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x04, - 0x68, 0x6f, 0x70, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, 0x74, 0x6e, - 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x61, 0x63, 0x6b, - 0x65, 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x70, - 0x52, 0x04, 0x68, 0x6f, 0x70, 0x73, 0x22, 0xe7, 0x01, 0x0a, 0x14, 0x50, 0x61, 0x63, 0x6b, 0x65, - 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x70, 0x12, - 0x3b, 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, 0x0a, 0x0b, - 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, - 0x0e, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x2a, 0x9b, 0x02, 0x0a, 0x0e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x55, 0x4e, - 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x5f, 0x47, 0x50, 0x53, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x5f, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x52, 0x59, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, - 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x50, 0x5f, 0x47, 0x45, 0x4f, 0x4c, 0x4f, 0x43, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x20, 0x0a, 0x1c, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x5f, 0x57, 0x49, 0x46, 0x49, 0x5f, 0x52, 0x53, 0x53, 0x49, 0x5f, 0x47, 0x45, 0x4f, 0x4c, - 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x4f, 0x55, - 0x52, 0x43, 0x45, 0x5f, 0x42, 0x54, 0x5f, 0x52, 0x53, 0x53, 0x49, 0x5f, 0x47, 0x45, 0x4f, 0x4c, - 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06, 0x12, 0x20, 0x0a, 0x1c, 0x53, 0x4f, 0x55, - 0x52, 0x43, 0x45, 0x5f, 0x4c, 0x4f, 0x52, 0x41, 0x5f, 0x52, 0x53, 0x53, 0x49, 0x5f, 0x47, 0x45, - 0x4f, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x12, 0x20, 0x0a, 0x1c, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4c, 0x4f, 0x52, 0x41, 0x5f, 0x54, 0x44, 0x4f, 0x41, 0x5f, - 0x47, 0x45, 0x4f, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x08, 0x12, 0x1f, 0x0a, - 0x1b, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x45, 0x44, - 0x5f, 0x47, 0x45, 0x4f, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x1a, 0x0e, - 0xea, 0xaa, 0x19, 0x0a, 0x18, 0x01, 0x2a, 0x06, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x42, 0x31, - 0x5a, 0x2f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, + 0x6f, 0x1a, 0x1c, 0x74, 0x74, 0x6e, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2f, 0x76, + 0x33, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xca, 0x09, 0x0a, 0x0a, 0x52, 0x78, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x4d, 0x0a, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, + 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, + 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x49, 0x64, 0x73, 0x12, 0x49, 0x0a, 0x0d, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x5f, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x0c, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, + 0x72, 0x12, 0x33, 0x0a, 0x05, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, + 0x05, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6e, 0x74, 0x65, 0x6e, 0x6e, + 0x61, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x61, + 0x6e, 0x74, 0x65, 0x6e, 0x6e, 0x61, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2e, 0x0a, 0x04, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x69, 0x6e, + 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0d, 0x66, 0x69, 0x6e, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0x38, 0x0a, 0x18, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x69, + 0x6e, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x16, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x46, 0x69, 0x6e, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x44, 0x0a, 0x1f, 0x65, 0x6e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x1b, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x46, 0x69, + 0x6e, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4b, 0x65, 0x79, 0x49, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x72, 0x73, 0x73, 0x69, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x04, + 0x72, 0x73, 0x73, 0x69, 0x12, 0x3c, 0x0a, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x5f, 0x72, + 0x73, 0x73, 0x69, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x6c, 0x6f, 0x61, + 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x73, + 0x73, 0x69, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x72, 0x73, + 0x73, 0x69, 0x18, 0x09, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x52, 0x73, 0x73, 0x69, 0x12, 0x36, 0x0a, 0x17, 0x72, 0x73, 0x73, 0x69, 0x5f, 0x73, 0x74, + 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x15, 0x72, 0x73, 0x73, 0x69, 0x53, 0x74, 0x61, 0x6e, + 0x64, 0x61, 0x72, 0x64, 0x44, 0x65, 0x76, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, + 0x03, 0x73, 0x6e, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x73, 0x6e, 0x72, 0x12, + 0x29, 0x0a, 0x10, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x66, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x79, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x34, 0x0a, 0x08, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, + 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x6a, 0x0a, 0x18, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x50, 0x61, 0x74, 0x68, + 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, + 0x01, 0x02, 0x10, 0x01, 0x52, 0x16, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x50, 0x61, + 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, + 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0b, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x2d, 0x0a, 0x0d, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x2a, 0x03, 0x18, 0xff, 0x01, + 0x52, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x23, + 0x0a, 0x0d, 0x68, 0x6f, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, + 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x68, 0x6f, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x57, 0x69, + 0x64, 0x74, 0x68, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, + 0x5f, 0x64, 0x72, 0x69, 0x66, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x66, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x44, 0x72, 0x69, 0x66, 0x74, 0x12, 0x35, 0x0a, 0x08, + 0x67, 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x67, 0x70, 0x73, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x33, 0x0a, 0x08, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x63, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x61, 0x64, 0x76, + 0x61, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x80, 0x02, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x01, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x12, 0x12, 0x19, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x56, 0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x56, 0xc0, 0x52, 0x08, 0x6c, + 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, + 0x74, 0x75, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x12, + 0x12, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x66, 0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x66, 0xc0, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x61, 0x6c, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x61, 0x6c, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x63, + 0x63, 0x75, 0x72, 0x61, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x61, 0x63, + 0x63, 0x75, 0x72, 0x61, 0x63, 0x79, 0x12, 0x46, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x0e, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, + 0xf2, 0xaa, 0x19, 0x02, 0x10, 0x00, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3a, 0x08, + 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0xae, 0x08, 0x0a, 0x14, 0x50, 0x61, 0x63, + 0x6b, 0x65, 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, + 0x12, 0xd5, 0x01, 0x0a, 0x10, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x6e, + 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0xaa, 0x01, 0x92, 0x41, + 0x17, 0x4a, 0x08, 0x22, 0x30, 0x30, 0x30, 0x30, 0x31, 0x33, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, + 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, 0x42, 0x06, 0x7a, 0x04, 0x68, 0x03, 0x70, + 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, + 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, + 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x48, + 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, + 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, + 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, + 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, + 0x61, 0x6c, 0x33, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x0e, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, + 0x64, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x6f, 0x72, 0x77, + 0x61, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, + 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x66, 0x6f, 0x72, 0x77, + 0x61, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, + 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0xe9, 0x01, 0x0a, 0x15, 0x66, + 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x5f, 0x65, 0x75, 0x69, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x42, 0xb4, 0x01, 0x92, 0x41, 0x21, + 0x4a, 0x12, 0x22, 0x37, 0x30, 0x42, 0x33, 0x44, 0x35, 0x37, 0x45, 0x44, 0x30, 0x30, 0x30, 0x41, + 0x42, 0x43, 0x44, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0xfa, 0x42, 0x06, 0x7a, 0x04, 0x68, 0x08, 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, + 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x12, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x74, 0x6e, 0x70, - 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x38, 0x42, 0x79, 0x74, 0x65, + 0x73, 0x52, 0x13, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x45, 0x75, 0x69, 0x12, 0x4e, 0x0a, 0x14, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, + 0x64, 0x65, 0x72, 0x5f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x12, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x12, 0xda, 0x01, 0x0a, 0x13, 0x68, 0x6f, 0x6d, 0x65, 0x5f, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0c, 0x42, 0xaa, 0x01, 0x92, 0x41, 0x17, 0x4a, 0x08, 0x22, 0x30, 0x30, 0x30, + 0x30, 0x31, 0x33, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0xfa, 0x42, 0x06, 0x7a, 0x04, 0x68, 0x03, 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, + 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x12, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x33, 0x42, 0x79, 0x74, 0x65, + 0x73, 0x52, 0x10, 0x68, 0x6f, 0x6d, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x65, + 0x74, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x16, 0x68, 0x6f, 0x6d, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x13, 0x68, 0x6f, 0x6d, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x35, 0x0a, 0x17, 0x68, 0x6f, 0x6d, 0x65, + 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x68, 0x6f, 0x6d, 0x65, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x38, 0x0a, 0x04, 0x68, 0x6f, 0x70, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x48, 0x6f, 0x70, 0x52, 0x04, 0x68, 0x6f, 0x70, 0x73, 0x22, 0xe7, 0x01, 0x0a, 0x14, 0x50, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x48, + 0x6f, 0x70, 0x12, 0x3b, 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, + 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x44, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xfa, 0x42, 0x24, 0x72, 0x22, 0x18, + 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, + 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, + 0x24, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x4a, 0x0a, 0x0b, 0x77, + 0x6f, 0x72, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1f, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x57, 0x4f, 0x52, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x77, 0x6f, 0x72, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2a, 0x9b, 0x02, 0x0a, 0x0e, 0x4c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x4f, + 0x55, 0x52, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0e, + 0x0a, 0x0a, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x47, 0x50, 0x53, 0x10, 0x01, 0x12, 0x13, + 0x0a, 0x0f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x52, + 0x59, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x50, + 0x5f, 0x47, 0x45, 0x4f, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x20, + 0x0a, 0x1c, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x57, 0x49, 0x46, 0x49, 0x5f, 0x52, 0x53, + 0x53, 0x49, 0x5f, 0x47, 0x45, 0x4f, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x05, + 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x42, 0x54, 0x5f, 0x52, 0x53, + 0x53, 0x49, 0x5f, 0x47, 0x45, 0x4f, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06, + 0x12, 0x20, 0x0a, 0x1c, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4c, 0x4f, 0x52, 0x41, 0x5f, + 0x52, 0x53, 0x53, 0x49, 0x5f, 0x47, 0x45, 0x4f, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x10, 0x07, 0x12, 0x20, 0x0a, 0x1c, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4c, 0x4f, 0x52, + 0x41, 0x5f, 0x54, 0x44, 0x4f, 0x41, 0x5f, 0x47, 0x45, 0x4f, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x10, 0x08, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x43, + 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x45, 0x44, 0x5f, 0x47, 0x45, 0x4f, 0x4c, 0x4f, 0x43, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x1a, 0x0e, 0xea, 0xaa, 0x19, 0x0a, 0x18, 0x01, 0x2a, 0x06, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, + 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, + 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, + 0x6b, 0x67, 0x2f, 0x74, 0x74, 0x6e, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -896,39 +976,43 @@ func file_ttn_lorawan_v3_metadata_proto_rawDescGZIP() []byte { } var file_ttn_lorawan_v3_metadata_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_ttn_lorawan_v3_metadata_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_ttn_lorawan_v3_metadata_proto_msgTypes = make([]protoimpl.MessageInfo, 5) var file_ttn_lorawan_v3_metadata_proto_goTypes = []interface{}{ (LocationSource)(0), // 0: ttn.lorawan.v3.LocationSource (*RxMetadata)(nil), // 1: ttn.lorawan.v3.RxMetadata (*Location)(nil), // 2: ttn.lorawan.v3.Location (*PacketBrokerMetadata)(nil), // 3: ttn.lorawan.v3.PacketBrokerMetadata (*PacketBrokerRouteHop)(nil), // 4: ttn.lorawan.v3.PacketBrokerRouteHop - (*GatewayIdentifiers)(nil), // 5: ttn.lorawan.v3.GatewayIdentifiers - (*timestamppb.Timestamp)(nil), // 6: google.protobuf.Timestamp - (*wrapperspb.FloatValue)(nil), // 7: google.protobuf.FloatValue - (DownlinkPathConstraint)(0), // 8: ttn.lorawan.v3.DownlinkPathConstraint - (*structpb.Struct)(nil), // 9: google.protobuf.Struct - (*wrapperspb.StringValue)(nil), // 10: google.protobuf.StringValue + (*RelayMetadata)(nil), // 5: ttn.lorawan.v3.RelayMetadata + (*GatewayIdentifiers)(nil), // 6: ttn.lorawan.v3.GatewayIdentifiers + (*timestamppb.Timestamp)(nil), // 7: google.protobuf.Timestamp + (*wrapperspb.FloatValue)(nil), // 8: google.protobuf.FloatValue + (DownlinkPathConstraint)(0), // 9: ttn.lorawan.v3.DownlinkPathConstraint + (*structpb.Struct)(nil), // 10: google.protobuf.Struct + (*wrapperspb.StringValue)(nil), // 11: google.protobuf.StringValue + (RelayWORChannel)(0), // 12: ttn.lorawan.v3.RelayWORChannel } var file_ttn_lorawan_v3_metadata_proto_depIdxs = []int32{ - 5, // 0: ttn.lorawan.v3.RxMetadata.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers + 6, // 0: ttn.lorawan.v3.RxMetadata.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers 3, // 1: ttn.lorawan.v3.RxMetadata.packet_broker:type_name -> ttn.lorawan.v3.PacketBrokerMetadata - 6, // 2: ttn.lorawan.v3.RxMetadata.time:type_name -> google.protobuf.Timestamp - 7, // 3: ttn.lorawan.v3.RxMetadata.signal_rssi:type_name -> google.protobuf.FloatValue - 2, // 4: ttn.lorawan.v3.RxMetadata.location:type_name -> ttn.lorawan.v3.Location - 8, // 5: ttn.lorawan.v3.RxMetadata.downlink_path_constraint:type_name -> ttn.lorawan.v3.DownlinkPathConstraint - 6, // 6: ttn.lorawan.v3.RxMetadata.gps_time:type_name -> google.protobuf.Timestamp - 6, // 7: ttn.lorawan.v3.RxMetadata.received_at:type_name -> google.protobuf.Timestamp - 9, // 8: ttn.lorawan.v3.RxMetadata.advanced:type_name -> google.protobuf.Struct - 0, // 9: ttn.lorawan.v3.Location.source:type_name -> ttn.lorawan.v3.LocationSource - 10, // 10: ttn.lorawan.v3.PacketBrokerMetadata.forwarder_gateway_id:type_name -> google.protobuf.StringValue - 4, // 11: ttn.lorawan.v3.PacketBrokerMetadata.hops:type_name -> ttn.lorawan.v3.PacketBrokerRouteHop - 6, // 12: ttn.lorawan.v3.PacketBrokerRouteHop.received_at:type_name -> google.protobuf.Timestamp - 13, // [13:13] is the sub-list for method output_type - 13, // [13:13] is the sub-list for method input_type - 13, // [13:13] is the sub-list for extension type_name - 13, // [13:13] is the sub-list for extension extendee - 0, // [0:13] is the sub-list for field type_name + 5, // 2: ttn.lorawan.v3.RxMetadata.relay:type_name -> ttn.lorawan.v3.RelayMetadata + 7, // 3: ttn.lorawan.v3.RxMetadata.time:type_name -> google.protobuf.Timestamp + 8, // 4: ttn.lorawan.v3.RxMetadata.signal_rssi:type_name -> google.protobuf.FloatValue + 2, // 5: ttn.lorawan.v3.RxMetadata.location:type_name -> ttn.lorawan.v3.Location + 9, // 6: ttn.lorawan.v3.RxMetadata.downlink_path_constraint:type_name -> ttn.lorawan.v3.DownlinkPathConstraint + 7, // 7: ttn.lorawan.v3.RxMetadata.gps_time:type_name -> google.protobuf.Timestamp + 7, // 8: ttn.lorawan.v3.RxMetadata.received_at:type_name -> google.protobuf.Timestamp + 10, // 9: ttn.lorawan.v3.RxMetadata.advanced:type_name -> google.protobuf.Struct + 0, // 10: ttn.lorawan.v3.Location.source:type_name -> ttn.lorawan.v3.LocationSource + 11, // 11: ttn.lorawan.v3.PacketBrokerMetadata.forwarder_gateway_id:type_name -> google.protobuf.StringValue + 4, // 12: ttn.lorawan.v3.PacketBrokerMetadata.hops:type_name -> ttn.lorawan.v3.PacketBrokerRouteHop + 7, // 13: ttn.lorawan.v3.PacketBrokerRouteHop.received_at:type_name -> google.protobuf.Timestamp + 12, // 14: ttn.lorawan.v3.RelayMetadata.wor_channel:type_name -> ttn.lorawan.v3.RelayWORChannel + 15, // [15:15] is the sub-list for method output_type + 15, // [15:15] is the sub-list for method input_type + 15, // [15:15] is the sub-list for extension type_name + 15, // [15:15] is the sub-list for extension extendee + 0, // [0:15] is the sub-list for field type_name } func init() { file_ttn_lorawan_v3_metadata_proto_init() } @@ -938,6 +1022,7 @@ func file_ttn_lorawan_v3_metadata_proto_init() { } file_ttn_lorawan_v3_enums_proto_init() file_ttn_lorawan_v3_identifiers_proto_init() + file_ttn_lorawan_v3_lorawan_proto_init() if !protoimpl.UnsafeEnabled { file_ttn_lorawan_v3_metadata_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RxMetadata); i { @@ -987,6 +1072,18 @@ func file_ttn_lorawan_v3_metadata_proto_init() { return nil } } + file_ttn_lorawan_v3_metadata_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RelayMetadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -994,7 +1091,7 @@ func file_ttn_lorawan_v3_metadata_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_ttn_lorawan_v3_metadata_proto_rawDesc, NumEnums: 1, - NumMessages: 4, + NumMessages: 5, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/ttnpb/metadata.pb.paths.fm.go b/pkg/ttnpb/metadata.pb.paths.fm.go index 692280d0c8..878d9d1826 100644 --- a/pkg/ttnpb/metadata.pb.paths.fm.go +++ b/pkg/ttnpb/metadata.pb.paths.fm.go @@ -36,6 +36,9 @@ var RxMetadataFieldPathsNested = []string{ "packet_broker.hops", "packet_broker.message_id", "received_at", + "relay", + "relay.device_id", + "relay.wor_channel", "rssi", "rssi_standard_deviation", "signal_rssi", @@ -62,6 +65,7 @@ var RxMetadataFieldPathsTopLevel = []string{ "location", "packet_broker", "received_at", + "relay", "rssi", "rssi_standard_deviation", "signal_rssi", @@ -125,3 +129,12 @@ var PacketBrokerRouteHopFieldPathsTopLevel = []string{ "sender_address", "sender_name", } +var RelayMetadataFieldPathsNested = []string{ + "device_id", + "wor_channel", +} + +var RelayMetadataFieldPathsTopLevel = []string{ + "device_id", + "wor_channel", +} diff --git a/pkg/ttnpb/metadata.pb.setters.fm.go b/pkg/ttnpb/metadata.pb.setters.fm.go index 5eac69dbb0..b6e711d744 100644 --- a/pkg/ttnpb/metadata.pb.setters.fm.go +++ b/pkg/ttnpb/metadata.pb.setters.fm.go @@ -57,6 +57,31 @@ func (dst *RxMetadata) SetFields(src *RxMetadata, paths ...string) error { dst.PacketBroker = nil } } + case "relay": + if len(subs) > 0 { + var newDst, newSrc *RelayMetadata + if (src == nil || src.Relay == nil) && dst.Relay == nil { + continue + } + if src != nil { + newSrc = src.Relay + } + if dst.Relay != nil { + newDst = dst.Relay + } else { + newDst = &RelayMetadata{} + dst.Relay = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.Relay = src.Relay + } else { + dst.Relay = nil + } + } case "antenna_index": if len(subs) > 0 { return fmt.Errorf("'antenna_index' has no subfields, but %s were specified", subs) @@ -507,3 +532,33 @@ func (dst *PacketBrokerRouteHop) SetFields(src *PacketBrokerRouteHop, paths ...s } return nil } + +func (dst *RelayMetadata) SetFields(src *RelayMetadata, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "device_id": + if len(subs) > 0 { + return fmt.Errorf("'device_id' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.DeviceId = src.DeviceId + } else { + var zero string + dst.DeviceId = zero + } + case "wor_channel": + if len(subs) > 0 { + return fmt.Errorf("'wor_channel' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.WorChannel = src.WorChannel + } else { + dst.WorChannel = 0 + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} diff --git a/pkg/ttnpb/metadata.pb.validate.go b/pkg/ttnpb/metadata.pb.validate.go index 90a88dd264..852bcc101e 100644 --- a/pkg/ttnpb/metadata.pb.validate.go +++ b/pkg/ttnpb/metadata.pb.validate.go @@ -78,6 +78,18 @@ func (m *RxMetadata) ValidateFields(paths ...string) error { } } + case "relay": + + if v, ok := interface{}(m.GetRelay()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return RxMetadataValidationError{ + field: "relay", + reason: "embedded message failed validation", + cause: err, + } + } + } + case "antenna_index": // no validation rules for AntennaIndex case "time": @@ -627,3 +639,109 @@ var _ interface { Cause() error ErrorName() string } = PacketBrokerRouteHopValidationError{} + +// ValidateFields checks the field values on RelayMetadata with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *RelayMetadata) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = RelayMetadataFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "device_id": + + if utf8.RuneCountInString(m.GetDeviceId()) > 36 { + return RelayMetadataValidationError{ + field: "device_id", + reason: "value length must be at most 36 runes", + } + } + + if !_RelayMetadata_DeviceId_Pattern.MatchString(m.GetDeviceId()) { + return RelayMetadataValidationError{ + field: "device_id", + reason: "value does not match regex pattern \"^[a-z0-9](?:[-]?[a-z0-9]){2,}$\"", + } + } + + case "wor_channel": + + if _, ok := RelayWORChannel_name[int32(m.GetWorChannel())]; !ok { + return RelayMetadataValidationError{ + field: "wor_channel", + reason: "value must be one of the defined enum values", + } + } + + default: + return RelayMetadataValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// RelayMetadataValidationError is the validation error returned by +// RelayMetadata.ValidateFields if the designated constraints aren't met. +type RelayMetadataValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e RelayMetadataValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e RelayMetadataValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e RelayMetadataValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e RelayMetadataValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e RelayMetadataValidationError) ErrorName() string { return "RelayMetadataValidationError" } + +// Error satisfies the builtin error interface +func (e RelayMetadataValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sRelayMetadata.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = RelayMetadataValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RelayMetadataValidationError{} + +var _RelayMetadata_DeviceId_Pattern = regexp.MustCompile("^[a-z0-9](?:[-]?[a-z0-9]){2,}$") diff --git a/pkg/ttnpb/metadata_json.pb.go b/pkg/ttnpb/metadata_json.pb.go index 08f5421ed0..78fb30da13 100644 --- a/pkg/ttnpb/metadata_json.pb.go +++ b/pkg/ttnpb/metadata_json.pb.go @@ -84,6 +84,11 @@ func (x *RxMetadata) MarshalProtoJSON(s *jsonplugin.MarshalState) { s.WriteObjectField("packet_broker") x.PacketBroker.MarshalProtoJSON(s.WithField("packet_broker")) } + if x.Relay != nil || s.HasField("relay") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("relay") + x.Relay.MarshalProtoJSON(s.WithField("relay")) + } if x.AntennaIndex != 0 || s.HasField("antenna_index") { s.WriteMoreIf(&wroteField) s.WriteObjectField("antenna_index") @@ -240,6 +245,13 @@ func (x *RxMetadata) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { } x.PacketBroker = &PacketBrokerMetadata{} x.PacketBroker.UnmarshalProtoJSON(s.WithField("packet_broker", true)) + case "relay": + if s.ReadNil() { + x.Relay = nil + return + } + x.Relay = &RelayMetadata{} + x.Relay.UnmarshalProtoJSON(s.WithField("relay", true)) case "antenna_index", "antennaIndex": s.AddField("antenna_index") x.AntennaIndex = s.ReadUint32() @@ -571,3 +583,53 @@ func (x *PacketBrokerMetadata) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) func (x *PacketBrokerMetadata) UnmarshalJSON(b []byte) error { return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) } + +// MarshalProtoJSON marshals the RelayMetadata message to JSON. +func (x *RelayMetadata) MarshalProtoJSON(s *jsonplugin.MarshalState) { + if x == nil { + s.WriteNil() + return + } + s.WriteObjectStart() + var wroteField bool + if x.DeviceId != "" || s.HasField("device_id") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("device_id") + s.WriteString(x.DeviceId) + } + if x.WorChannel != 0 || s.HasField("wor_channel") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("wor_channel") + x.WorChannel.MarshalProtoJSON(s) + } + s.WriteObjectEnd() +} + +// MarshalJSON marshals the RelayMetadata to JSON. +func (x *RelayMetadata) MarshalJSON() ([]byte, error) { + return jsonplugin.DefaultMarshalerConfig.Marshal(x) +} + +// UnmarshalProtoJSON unmarshals the RelayMetadata message from JSON. +func (x *RelayMetadata) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { + if s.ReadNil() { + return + } + s.ReadObject(func(key string) { + switch key { + default: + s.ReadAny() // ignore unknown field + case "device_id", "deviceId": + s.AddField("device_id") + x.DeviceId = s.ReadString() + case "wor_channel", "worChannel": + s.AddField("wor_channel") + x.WorChannel.UnmarshalProtoJSON(s) + } + }) +} + +// UnmarshalJSON unmarshals the RelayMetadata from JSON. +func (x *RelayMetadata) UnmarshalJSON(b []byte) error { + return jsonplugin.DefaultUnmarshalerConfig.Unmarshal(b, x) +} diff --git a/pkg/ttnpb/qrcodegenerator.pb.paths.fm.go b/pkg/ttnpb/qrcodegenerator.pb.paths.fm.go index ab09f0addd..52103884db 100644 --- a/pkg/ttnpb/qrcodegenerator.pb.paths.fm.go +++ b/pkg/ttnpb/qrcodegenerator.pb.paths.fm.go @@ -110,6 +110,42 @@ var GenerateEndDeviceQRCodeRequestFieldPathsNested = []string{ "end_device.mac_settings.desired_ping_slot_data_rate_index.value", "end_device.mac_settings.desired_ping_slot_frequency", "end_device.mac_settings.desired_ping_slot_frequency.value", + "end_device.mac_settings.desired_relay", + "end_device.mac_settings.desired_relay.mode", + "end_device.mac_settings.desired_relay.mode.served", + "end_device.mac_settings.desired_relay.mode.served.backoff", + "end_device.mac_settings.desired_relay.mode.served.mode", + "end_device.mac_settings.desired_relay.mode.served.mode.always", + "end_device.mac_settings.desired_relay.mode.served.mode.dynamic", + "end_device.mac_settings.desired_relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.mac_settings.desired_relay.mode.served.mode.end_device_controlled", + "end_device.mac_settings.desired_relay.mode.served.second_channel", + "end_device.mac_settings.desired_relay.mode.served.second_channel.ack_offset", + "end_device.mac_settings.desired_relay.mode.served.second_channel.data_rate_index", + "end_device.mac_settings.desired_relay.mode.served.second_channel.frequency", + "end_device.mac_settings.desired_relay.mode.served.serving_device_id", + "end_device.mac_settings.desired_relay.mode.serving", + "end_device.mac_settings.desired_relay.mode.serving.cad_periodicity", + "end_device.mac_settings.desired_relay.mode.serving.default_channel_index", + "end_device.mac_settings.desired_relay.mode.serving.limits", + "end_device.mac_settings.desired_relay.mode.serving.limits.join_requests", + "end_device.mac_settings.desired_relay.mode.serving.limits.join_requests.bucket_size", + "end_device.mac_settings.desired_relay.mode.serving.limits.join_requests.reload_rate", + "end_device.mac_settings.desired_relay.mode.serving.limits.notifications", + "end_device.mac_settings.desired_relay.mode.serving.limits.notifications.bucket_size", + "end_device.mac_settings.desired_relay.mode.serving.limits.notifications.reload_rate", + "end_device.mac_settings.desired_relay.mode.serving.limits.overall", + "end_device.mac_settings.desired_relay.mode.serving.limits.overall.bucket_size", + "end_device.mac_settings.desired_relay.mode.serving.limits.overall.reload_rate", + "end_device.mac_settings.desired_relay.mode.serving.limits.reset_behavior", + "end_device.mac_settings.desired_relay.mode.serving.limits.uplink_messages", + "end_device.mac_settings.desired_relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.mac_settings.desired_relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.mac_settings.desired_relay.mode.serving.second_channel", + "end_device.mac_settings.desired_relay.mode.serving.second_channel.ack_offset", + "end_device.mac_settings.desired_relay.mode.serving.second_channel.data_rate_index", + "end_device.mac_settings.desired_relay.mode.serving.second_channel.frequency", + "end_device.mac_settings.desired_relay.mode.serving.uplink_forwarding_rules", "end_device.mac_settings.desired_rx1_data_rate_offset", "end_device.mac_settings.desired_rx1_data_rate_offset.value", "end_device.mac_settings.desired_rx1_delay", @@ -129,6 +165,42 @@ var GenerateEndDeviceQRCodeRequestFieldPathsNested = []string{ "end_device.mac_settings.ping_slot_frequency.value", "end_device.mac_settings.ping_slot_periodicity", "end_device.mac_settings.ping_slot_periodicity.value", + "end_device.mac_settings.relay", + "end_device.mac_settings.relay.mode", + "end_device.mac_settings.relay.mode.served", + "end_device.mac_settings.relay.mode.served.backoff", + "end_device.mac_settings.relay.mode.served.mode", + "end_device.mac_settings.relay.mode.served.mode.always", + "end_device.mac_settings.relay.mode.served.mode.dynamic", + "end_device.mac_settings.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.mac_settings.relay.mode.served.mode.end_device_controlled", + "end_device.mac_settings.relay.mode.served.second_channel", + "end_device.mac_settings.relay.mode.served.second_channel.ack_offset", + "end_device.mac_settings.relay.mode.served.second_channel.data_rate_index", + "end_device.mac_settings.relay.mode.served.second_channel.frequency", + "end_device.mac_settings.relay.mode.served.serving_device_id", + "end_device.mac_settings.relay.mode.serving", + "end_device.mac_settings.relay.mode.serving.cad_periodicity", + "end_device.mac_settings.relay.mode.serving.default_channel_index", + "end_device.mac_settings.relay.mode.serving.limits", + "end_device.mac_settings.relay.mode.serving.limits.join_requests", + "end_device.mac_settings.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.mac_settings.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.mac_settings.relay.mode.serving.limits.notifications", + "end_device.mac_settings.relay.mode.serving.limits.notifications.bucket_size", + "end_device.mac_settings.relay.mode.serving.limits.notifications.reload_rate", + "end_device.mac_settings.relay.mode.serving.limits.overall", + "end_device.mac_settings.relay.mode.serving.limits.overall.bucket_size", + "end_device.mac_settings.relay.mode.serving.limits.overall.reload_rate", + "end_device.mac_settings.relay.mode.serving.limits.reset_behavior", + "end_device.mac_settings.relay.mode.serving.limits.uplink_messages", + "end_device.mac_settings.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.mac_settings.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.mac_settings.relay.mode.serving.second_channel", + "end_device.mac_settings.relay.mode.serving.second_channel.ack_offset", + "end_device.mac_settings.relay.mode.serving.second_channel.data_rate_index", + "end_device.mac_settings.relay.mode.serving.second_channel.frequency", + "end_device.mac_settings.relay.mode.serving.uplink_forwarding_rules", "end_device.mac_settings.resets_f_cnt", "end_device.mac_settings.resets_f_cnt.value", "end_device.mac_settings.rx1_data_rate_offset", @@ -172,6 +244,42 @@ var GenerateEndDeviceQRCodeRequestFieldPathsNested = []string{ "end_device.mac_state.current_parameters.ping_slot_frequency", "end_device.mac_state.current_parameters.rejoin_count_periodicity", "end_device.mac_state.current_parameters.rejoin_time_periodicity", + "end_device.mac_state.current_parameters.relay", + "end_device.mac_state.current_parameters.relay.mode", + "end_device.mac_state.current_parameters.relay.mode.served", + "end_device.mac_state.current_parameters.relay.mode.served.backoff", + "end_device.mac_state.current_parameters.relay.mode.served.mode", + "end_device.mac_state.current_parameters.relay.mode.served.mode.always", + "end_device.mac_state.current_parameters.relay.mode.served.mode.dynamic", + "end_device.mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "end_device.mac_state.current_parameters.relay.mode.served.second_channel", + "end_device.mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "end_device.mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device.mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "end_device.mac_state.current_parameters.relay.mode.served.serving_device_id", + "end_device.mac_state.current_parameters.relay.mode.serving", + "end_device.mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "end_device.mac_state.current_parameters.relay.mode.serving.default_channel_index", + "end_device.mac_state.current_parameters.relay.mode.serving.limits", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.notifications", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.overall", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.mac_state.current_parameters.relay.mode.serving.second_channel", + "end_device.mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device.mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device.mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "end_device.mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device.mac_state.current_parameters.rx1_data_rate_offset", "end_device.mac_state.current_parameters.rx1_delay", "end_device.mac_state.current_parameters.rx2_data_rate_index", @@ -200,6 +308,42 @@ var GenerateEndDeviceQRCodeRequestFieldPathsNested = []string{ "end_device.mac_state.desired_parameters.ping_slot_frequency", "end_device.mac_state.desired_parameters.rejoin_count_periodicity", "end_device.mac_state.desired_parameters.rejoin_time_periodicity", + "end_device.mac_state.desired_parameters.relay", + "end_device.mac_state.desired_parameters.relay.mode", + "end_device.mac_state.desired_parameters.relay.mode.served", + "end_device.mac_state.desired_parameters.relay.mode.served.backoff", + "end_device.mac_state.desired_parameters.relay.mode.served.mode", + "end_device.mac_state.desired_parameters.relay.mode.served.mode.always", + "end_device.mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "end_device.mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "end_device.mac_state.desired_parameters.relay.mode.served.second_channel", + "end_device.mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "end_device.mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device.mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "end_device.mac_state.desired_parameters.relay.mode.served.serving_device_id", + "end_device.mac_state.desired_parameters.relay.mode.serving", + "end_device.mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "end_device.mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.overall", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.mac_state.desired_parameters.relay.mode.serving.second_channel", + "end_device.mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device.mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device.mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "end_device.mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device.mac_state.desired_parameters.rx1_data_rate_offset", "end_device.mac_state.desired_parameters.rx1_delay", "end_device.mac_state.desired_parameters.rx2_data_rate_index", @@ -239,6 +383,8 @@ var GenerateEndDeviceQRCodeRequestFieldPathsNested = []string{ "end_device.mac_state.pending_join_request.downlink_settings.rx1_dr_offset", "end_device.mac_state.pending_join_request.downlink_settings.rx2_dr", "end_device.mac_state.pending_join_request.rx_delay", + "end_device.mac_state.pending_relay_downlink", + "end_device.mac_state.pending_relay_downlink.raw_payload", "end_device.mac_state.pending_requests", "end_device.mac_state.ping_slot_periodicity", "end_device.mac_state.ping_slot_periodicity.value", @@ -314,6 +460,42 @@ var GenerateEndDeviceQRCodeRequestFieldPathsNested = []string{ "end_device.pending_mac_state.current_parameters.ping_slot_frequency", "end_device.pending_mac_state.current_parameters.rejoin_count_periodicity", "end_device.pending_mac_state.current_parameters.rejoin_time_periodicity", + "end_device.pending_mac_state.current_parameters.relay", + "end_device.pending_mac_state.current_parameters.relay.mode", + "end_device.pending_mac_state.current_parameters.relay.mode.served", + "end_device.pending_mac_state.current_parameters.relay.mode.served.backoff", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode.always", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode.dynamic", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.pending_mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel", + "end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "end_device.pending_mac_state.current_parameters.relay.mode.served.serving_device_id", + "end_device.pending_mac_state.current_parameters.relay.mode.serving", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.default_channel_index", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.notifications", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.overall", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "end_device.pending_mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device.pending_mac_state.current_parameters.rx1_data_rate_offset", "end_device.pending_mac_state.current_parameters.rx1_delay", "end_device.pending_mac_state.current_parameters.rx2_data_rate_index", @@ -342,6 +524,42 @@ var GenerateEndDeviceQRCodeRequestFieldPathsNested = []string{ "end_device.pending_mac_state.desired_parameters.ping_slot_frequency", "end_device.pending_mac_state.desired_parameters.rejoin_count_periodicity", "end_device.pending_mac_state.desired_parameters.rejoin_time_periodicity", + "end_device.pending_mac_state.desired_parameters.relay", + "end_device.pending_mac_state.desired_parameters.relay.mode", + "end_device.pending_mac_state.desired_parameters.relay.mode.served", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.backoff", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.always", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "end_device.pending_mac_state.desired_parameters.relay.mode.served.serving_device_id", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.overall", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "end_device.pending_mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device.pending_mac_state.desired_parameters.rx1_data_rate_offset", "end_device.pending_mac_state.desired_parameters.rx1_delay", "end_device.pending_mac_state.desired_parameters.rx2_data_rate_index", @@ -381,6 +599,8 @@ var GenerateEndDeviceQRCodeRequestFieldPathsNested = []string{ "end_device.pending_mac_state.pending_join_request.downlink_settings.rx1_dr_offset", "end_device.pending_mac_state.pending_join_request.downlink_settings.rx2_dr", "end_device.pending_mac_state.pending_join_request.rx_delay", + "end_device.pending_mac_state.pending_relay_downlink", + "end_device.pending_mac_state.pending_relay_downlink.raw_payload", "end_device.pending_mac_state.pending_requests", "end_device.pending_mac_state.ping_slot_periodicity", "end_device.pending_mac_state.ping_slot_periodicity.value", @@ -629,6 +849,42 @@ var ParseEndDeviceQRCodeResponseFieldPathsNested = []string{ "end_device_template.end_device.mac_settings.desired_ping_slot_data_rate_index.value", "end_device_template.end_device.mac_settings.desired_ping_slot_frequency", "end_device_template.end_device.mac_settings.desired_ping_slot_frequency.value", + "end_device_template.end_device.mac_settings.desired_relay", + "end_device_template.end_device.mac_settings.desired_relay.mode", + "end_device_template.end_device.mac_settings.desired_relay.mode.served", + "end_device_template.end_device.mac_settings.desired_relay.mode.served.backoff", + "end_device_template.end_device.mac_settings.desired_relay.mode.served.mode", + "end_device_template.end_device.mac_settings.desired_relay.mode.served.mode.always", + "end_device_template.end_device.mac_settings.desired_relay.mode.served.mode.dynamic", + "end_device_template.end_device.mac_settings.desired_relay.mode.served.mode.dynamic.smart_enable_level", + "end_device_template.end_device.mac_settings.desired_relay.mode.served.mode.end_device_controlled", + "end_device_template.end_device.mac_settings.desired_relay.mode.served.second_channel", + "end_device_template.end_device.mac_settings.desired_relay.mode.served.second_channel.ack_offset", + "end_device_template.end_device.mac_settings.desired_relay.mode.served.second_channel.data_rate_index", + "end_device_template.end_device.mac_settings.desired_relay.mode.served.second_channel.frequency", + "end_device_template.end_device.mac_settings.desired_relay.mode.served.serving_device_id", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving.cad_periodicity", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving.default_channel_index", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving.limits", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving.limits.join_requests", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving.limits.join_requests.bucket_size", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving.limits.join_requests.reload_rate", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving.limits.notifications", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving.limits.notifications.bucket_size", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving.limits.notifications.reload_rate", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving.limits.overall", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving.limits.overall.bucket_size", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving.limits.overall.reload_rate", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving.limits.reset_behavior", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving.limits.uplink_messages", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving.second_channel", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving.second_channel.ack_offset", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving.second_channel.data_rate_index", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving.second_channel.frequency", + "end_device_template.end_device.mac_settings.desired_relay.mode.serving.uplink_forwarding_rules", "end_device_template.end_device.mac_settings.desired_rx1_data_rate_offset", "end_device_template.end_device.mac_settings.desired_rx1_data_rate_offset.value", "end_device_template.end_device.mac_settings.desired_rx1_delay", @@ -648,6 +904,42 @@ var ParseEndDeviceQRCodeResponseFieldPathsNested = []string{ "end_device_template.end_device.mac_settings.ping_slot_frequency.value", "end_device_template.end_device.mac_settings.ping_slot_periodicity", "end_device_template.end_device.mac_settings.ping_slot_periodicity.value", + "end_device_template.end_device.mac_settings.relay", + "end_device_template.end_device.mac_settings.relay.mode", + "end_device_template.end_device.mac_settings.relay.mode.served", + "end_device_template.end_device.mac_settings.relay.mode.served.backoff", + "end_device_template.end_device.mac_settings.relay.mode.served.mode", + "end_device_template.end_device.mac_settings.relay.mode.served.mode.always", + "end_device_template.end_device.mac_settings.relay.mode.served.mode.dynamic", + "end_device_template.end_device.mac_settings.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device_template.end_device.mac_settings.relay.mode.served.mode.end_device_controlled", + "end_device_template.end_device.mac_settings.relay.mode.served.second_channel", + "end_device_template.end_device.mac_settings.relay.mode.served.second_channel.ack_offset", + "end_device_template.end_device.mac_settings.relay.mode.served.second_channel.data_rate_index", + "end_device_template.end_device.mac_settings.relay.mode.served.second_channel.frequency", + "end_device_template.end_device.mac_settings.relay.mode.served.serving_device_id", + "end_device_template.end_device.mac_settings.relay.mode.serving", + "end_device_template.end_device.mac_settings.relay.mode.serving.cad_periodicity", + "end_device_template.end_device.mac_settings.relay.mode.serving.default_channel_index", + "end_device_template.end_device.mac_settings.relay.mode.serving.limits", + "end_device_template.end_device.mac_settings.relay.mode.serving.limits.join_requests", + "end_device_template.end_device.mac_settings.relay.mode.serving.limits.join_requests.bucket_size", + "end_device_template.end_device.mac_settings.relay.mode.serving.limits.join_requests.reload_rate", + "end_device_template.end_device.mac_settings.relay.mode.serving.limits.notifications", + "end_device_template.end_device.mac_settings.relay.mode.serving.limits.notifications.bucket_size", + "end_device_template.end_device.mac_settings.relay.mode.serving.limits.notifications.reload_rate", + "end_device_template.end_device.mac_settings.relay.mode.serving.limits.overall", + "end_device_template.end_device.mac_settings.relay.mode.serving.limits.overall.bucket_size", + "end_device_template.end_device.mac_settings.relay.mode.serving.limits.overall.reload_rate", + "end_device_template.end_device.mac_settings.relay.mode.serving.limits.reset_behavior", + "end_device_template.end_device.mac_settings.relay.mode.serving.limits.uplink_messages", + "end_device_template.end_device.mac_settings.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device_template.end_device.mac_settings.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device_template.end_device.mac_settings.relay.mode.serving.second_channel", + "end_device_template.end_device.mac_settings.relay.mode.serving.second_channel.ack_offset", + "end_device_template.end_device.mac_settings.relay.mode.serving.second_channel.data_rate_index", + "end_device_template.end_device.mac_settings.relay.mode.serving.second_channel.frequency", + "end_device_template.end_device.mac_settings.relay.mode.serving.uplink_forwarding_rules", "end_device_template.end_device.mac_settings.resets_f_cnt", "end_device_template.end_device.mac_settings.resets_f_cnt.value", "end_device_template.end_device.mac_settings.rx1_data_rate_offset", @@ -691,6 +983,42 @@ var ParseEndDeviceQRCodeResponseFieldPathsNested = []string{ "end_device_template.end_device.mac_state.current_parameters.ping_slot_frequency", "end_device_template.end_device.mac_state.current_parameters.rejoin_count_periodicity", "end_device_template.end_device.mac_state.current_parameters.rejoin_time_periodicity", + "end_device_template.end_device.mac_state.current_parameters.relay", + "end_device_template.end_device.mac_state.current_parameters.relay.mode", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.served", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.served.backoff", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.served.mode", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.served.mode.always", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.served.mode.dynamic", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.served.second_channel", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.served.serving_device_id", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving.default_channel_index", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving.limits", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving.limits.notifications", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving.limits.overall", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving.second_channel", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "end_device_template.end_device.mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device_template.end_device.mac_state.current_parameters.rx1_data_rate_offset", "end_device_template.end_device.mac_state.current_parameters.rx1_delay", "end_device_template.end_device.mac_state.current_parameters.rx2_data_rate_index", @@ -719,6 +1047,42 @@ var ParseEndDeviceQRCodeResponseFieldPathsNested = []string{ "end_device_template.end_device.mac_state.desired_parameters.ping_slot_frequency", "end_device_template.end_device.mac_state.desired_parameters.rejoin_count_periodicity", "end_device_template.end_device.mac_state.desired_parameters.rejoin_time_periodicity", + "end_device_template.end_device.mac_state.desired_parameters.relay", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.served", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.served.backoff", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.served.mode", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.served.mode.always", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.served.second_channel", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.served.serving_device_id", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving.limits", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving.limits.overall", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving.second_channel", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "end_device_template.end_device.mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device_template.end_device.mac_state.desired_parameters.rx1_data_rate_offset", "end_device_template.end_device.mac_state.desired_parameters.rx1_delay", "end_device_template.end_device.mac_state.desired_parameters.rx2_data_rate_index", @@ -758,6 +1122,8 @@ var ParseEndDeviceQRCodeResponseFieldPathsNested = []string{ "end_device_template.end_device.mac_state.pending_join_request.downlink_settings.rx1_dr_offset", "end_device_template.end_device.mac_state.pending_join_request.downlink_settings.rx2_dr", "end_device_template.end_device.mac_state.pending_join_request.rx_delay", + "end_device_template.end_device.mac_state.pending_relay_downlink", + "end_device_template.end_device.mac_state.pending_relay_downlink.raw_payload", "end_device_template.end_device.mac_state.pending_requests", "end_device_template.end_device.mac_state.ping_slot_periodicity", "end_device_template.end_device.mac_state.ping_slot_periodicity.value", @@ -833,6 +1199,42 @@ var ParseEndDeviceQRCodeResponseFieldPathsNested = []string{ "end_device_template.end_device.pending_mac_state.current_parameters.ping_slot_frequency", "end_device_template.end_device.pending_mac_state.current_parameters.rejoin_count_periodicity", "end_device_template.end_device.pending_mac_state.current_parameters.rejoin_time_periodicity", + "end_device_template.end_device.pending_mac_state.current_parameters.relay", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.served", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.served.backoff", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.served.mode", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.served.mode.always", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.served.mode.dynamic", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.served.serving_device_id", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving.default_channel_index", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving.limits", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.notifications", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.overall", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "end_device_template.end_device.pending_mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device_template.end_device.pending_mac_state.current_parameters.rx1_data_rate_offset", "end_device_template.end_device.pending_mac_state.current_parameters.rx1_delay", "end_device_template.end_device.pending_mac_state.current_parameters.rx2_data_rate_index", @@ -861,6 +1263,42 @@ var ParseEndDeviceQRCodeResponseFieldPathsNested = []string{ "end_device_template.end_device.pending_mac_state.desired_parameters.ping_slot_frequency", "end_device_template.end_device.pending_mac_state.desired_parameters.rejoin_count_periodicity", "end_device_template.end_device.pending_mac_state.desired_parameters.rejoin_time_periodicity", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.served", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.served.backoff", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.served.mode", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.always", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.served.serving_device_id", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.overall", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "end_device_template.end_device.pending_mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "end_device_template.end_device.pending_mac_state.desired_parameters.rx1_data_rate_offset", "end_device_template.end_device.pending_mac_state.desired_parameters.rx1_delay", "end_device_template.end_device.pending_mac_state.desired_parameters.rx2_data_rate_index", @@ -900,6 +1338,8 @@ var ParseEndDeviceQRCodeResponseFieldPathsNested = []string{ "end_device_template.end_device.pending_mac_state.pending_join_request.downlink_settings.rx1_dr_offset", "end_device_template.end_device.pending_mac_state.pending_join_request.downlink_settings.rx2_dr", "end_device_template.end_device.pending_mac_state.pending_join_request.rx_delay", + "end_device_template.end_device.pending_mac_state.pending_relay_downlink", + "end_device_template.end_device.pending_mac_state.pending_relay_downlink.raw_payload", "end_device_template.end_device.pending_mac_state.pending_requests", "end_device_template.end_device.pending_mac_state.ping_slot_periodicity", "end_device_template.end_device.pending_mac_state.ping_slot_periodicity.value", diff --git a/pkg/ttnpb/testdata/ttnpb_encoding_golden.md b/pkg/ttnpb/testdata/ttnpb_encoding_golden.md index e87dac40fa..4bb15def24 100644 --- a/pkg/ttnpb/testdata/ttnpb_encoding_golden.md +++ b/pkg/ttnpb/testdata/ttnpb_encoding_golden.md @@ -201,6 +201,13 @@ Binary | ttnpb.MACCommandIdentifier | CID_PING_SLOT_CHANNEL | [17] Binary | ttnpb.MACCommandIdentifier | CID_PING_SLOT_INFO | [16] Binary | ttnpb.MACCommandIdentifier | CID_REJOIN_PARAM_SETUP | [15] Binary | ttnpb.MACCommandIdentifier | CID_REKEY | [11] +Binary | ttnpb.MACCommandIdentifier | CID_RELAY_CONF | [64] +Binary | ttnpb.MACCommandIdentifier | CID_RELAY_CONFIGURE_FWD_LIMIT | [69] +Binary | ttnpb.MACCommandIdentifier | CID_RELAY_CTRL_UPLINK_LIST | [68] +Binary | ttnpb.MACCommandIdentifier | CID_RELAY_END_DEVICE_CONF | [65] +Binary | ttnpb.MACCommandIdentifier | CID_RELAY_FILTER_LIST | [66] +Binary | ttnpb.MACCommandIdentifier | CID_RELAY_NOTIFY_NEW_END_DEVICE | [70] +Binary | ttnpb.MACCommandIdentifier | CID_RELAY_UPDATE_UPLINK_LIST | [67] Binary | ttnpb.MACCommandIdentifier | CID_RESET | [1] Binary | ttnpb.MACCommandIdentifier | CID_RFU_0 | [0] Binary | ttnpb.MACCommandIdentifier | CID_RX_PARAM_SETUP | [5] @@ -570,6 +577,13 @@ JSON | ttnpb.MACCommandIdentifier | CID_PING_SLOT_CHANNEL | "CID_PING_SLOT_CHANN JSON | ttnpb.MACCommandIdentifier | CID_PING_SLOT_INFO | "CID_PING_SLOT_INFO" JSON | ttnpb.MACCommandIdentifier | CID_REJOIN_PARAM_SETUP | "CID_REJOIN_PARAM_SETUP" JSON | ttnpb.MACCommandIdentifier | CID_REKEY | "CID_REKEY" +JSON | ttnpb.MACCommandIdentifier | CID_RELAY_CONF | "CID_RELAY_CONF" +JSON | ttnpb.MACCommandIdentifier | CID_RELAY_CONFIGURE_FWD_LIMIT | "CID_RELAY_CONFIGURE_FWD_LIMIT" +JSON | ttnpb.MACCommandIdentifier | CID_RELAY_CTRL_UPLINK_LIST | "CID_RELAY_CTRL_UPLINK_LIST" +JSON | ttnpb.MACCommandIdentifier | CID_RELAY_END_DEVICE_CONF | "CID_RELAY_END_DEVICE_CONF" +JSON | ttnpb.MACCommandIdentifier | CID_RELAY_FILTER_LIST | "CID_RELAY_FILTER_LIST" +JSON | ttnpb.MACCommandIdentifier | CID_RELAY_NOTIFY_NEW_END_DEVICE | "CID_RELAY_NOTIFY_NEW_END_DEVICE" +JSON | ttnpb.MACCommandIdentifier | CID_RELAY_UPDATE_UPLINK_LIST | "CID_RELAY_UPDATE_UPLINK_LIST" JSON | ttnpb.MACCommandIdentifier | CID_RESET | "CID_RESET" JSON | ttnpb.MACCommandIdentifier | CID_RFU_0 | "CID_RFU_0" JSON | ttnpb.MACCommandIdentifier | CID_RX_PARAM_SETUP | "CID_RX_PARAM_SETUP" @@ -1012,6 +1026,13 @@ ProtoJSON | ttnpb.MACCommandIdentifier | CID_PING_SLOT_CHANNEL | "CID_PING_SLOT_ ProtoJSON | ttnpb.MACCommandIdentifier | CID_PING_SLOT_INFO | "CID_PING_SLOT_INFO" ProtoJSON | ttnpb.MACCommandIdentifier | CID_REJOIN_PARAM_SETUP | "CID_REJOIN_PARAM_SETUP" ProtoJSON | ttnpb.MACCommandIdentifier | CID_REKEY | "CID_REKEY" +ProtoJSON | ttnpb.MACCommandIdentifier | CID_RELAY_CONF | "CID_RELAY_CONF" +ProtoJSON | ttnpb.MACCommandIdentifier | CID_RELAY_CONFIGURE_FWD_LIMIT | "CID_RELAY_CONFIGURE_FWD_LIMIT" +ProtoJSON | ttnpb.MACCommandIdentifier | CID_RELAY_CTRL_UPLINK_LIST | "CID_RELAY_CTRL_UPLINK_LIST" +ProtoJSON | ttnpb.MACCommandIdentifier | CID_RELAY_END_DEVICE_CONF | "CID_RELAY_END_DEVICE_CONF" +ProtoJSON | ttnpb.MACCommandIdentifier | CID_RELAY_FILTER_LIST | "CID_RELAY_FILTER_LIST" +ProtoJSON | ttnpb.MACCommandIdentifier | CID_RELAY_NOTIFY_NEW_END_DEVICE | "CID_RELAY_NOTIFY_NEW_END_DEVICE" +ProtoJSON | ttnpb.MACCommandIdentifier | CID_RELAY_UPDATE_UPLINK_LIST | "CID_RELAY_UPDATE_UPLINK_LIST" ProtoJSON | ttnpb.MACCommandIdentifier | CID_RESET | "CID_RESET" ProtoJSON | ttnpb.MACCommandIdentifier | CID_RFU_0 | "CID_RFU_0" ProtoJSON | ttnpb.MACCommandIdentifier | CID_RX_PARAM_SETUP | "CID_RX_PARAM_SETUP" @@ -1454,6 +1475,13 @@ Text | ttnpb.MACCommandIdentifier | CID_PING_SLOT_CHANNEL | CID_PING_SLOT_CHANNE Text | ttnpb.MACCommandIdentifier | CID_PING_SLOT_INFO | CID_PING_SLOT_INFO Text | ttnpb.MACCommandIdentifier | CID_REJOIN_PARAM_SETUP | CID_REJOIN_PARAM_SETUP Text | ttnpb.MACCommandIdentifier | CID_REKEY | CID_REKEY +Text | ttnpb.MACCommandIdentifier | CID_RELAY_CONF | CID_RELAY_CONF +Text | ttnpb.MACCommandIdentifier | CID_RELAY_CONFIGURE_FWD_LIMIT | CID_RELAY_CONFIGURE_FWD_LIMIT +Text | ttnpb.MACCommandIdentifier | CID_RELAY_CTRL_UPLINK_LIST | CID_RELAY_CTRL_UPLINK_LIST +Text | ttnpb.MACCommandIdentifier | CID_RELAY_END_DEVICE_CONF | CID_RELAY_END_DEVICE_CONF +Text | ttnpb.MACCommandIdentifier | CID_RELAY_FILTER_LIST | CID_RELAY_FILTER_LIST +Text | ttnpb.MACCommandIdentifier | CID_RELAY_NOTIFY_NEW_END_DEVICE | CID_RELAY_NOTIFY_NEW_END_DEVICE +Text | ttnpb.MACCommandIdentifier | CID_RELAY_UPDATE_UPLINK_LIST | CID_RELAY_UPDATE_UPLINK_LIST Text | ttnpb.MACCommandIdentifier | CID_RESET | CID_RESET Text | ttnpb.MACCommandIdentifier | CID_RFU_0 | CID_RFU_0 Text | ttnpb.MACCommandIdentifier | CID_RX_PARAM_SETUP | CID_RX_PARAM_SETUP diff --git a/pkg/ttnpb/zero_test.go b/pkg/ttnpb/zero_test.go index efda844672..6f5cf5aa9c 100644 --- a/pkg/ttnpb/zero_test.go +++ b/pkg/ttnpb/zero_test.go @@ -107,6 +107,20 @@ func TestFieldIsZero(t *testing.T) { (*SetEndDeviceRequest)(nil): EndDeviceFieldPathsNested, &UpdateEndDeviceRequest{}: EndDeviceFieldPathsNested, (*UpdateEndDeviceRequest)(nil): EndDeviceFieldPathsNested, + &RelayParameters{}: RelayParametersFieldPathsNested, + (*RelayParameters)(nil): RelayParametersFieldPathsNested, + &ServedRelayParameters{}: ServedRelayParametersFieldPathsNested, + (*ServedRelayParameters)(nil): ServedRelayParametersFieldPathsNested, + &ServingRelayParameters{}: ServingRelayParametersFieldPathsNested, + (*ServingRelayParameters)(nil): ServingRelayParametersFieldPathsNested, + &RelaySecondChannel{}: RelaySecondChannelFieldPathsNested, + (*RelaySecondChannel)(nil): RelaySecondChannelFieldPathsNested, + &RelayEndDeviceDynamicMode{}: RelayEndDeviceDynamicModeFieldPathsNested, + (*RelayEndDeviceDynamicMode)(nil): RelayEndDeviceDynamicModeFieldPathsNested, + &RelayForwardLimits{}: RelayForwardLimitsFieldPathsNested, + (*RelayForwardLimits)(nil): RelayForwardLimitsFieldPathsNested, + &ServingRelayParameters_ForwardingLimits{}: ServingRelayParameters_ForwardingLimitsFieldPathsNested, + (*ServingRelayParameters_ForwardingLimits)(nil): ServingRelayParameters_ForwardingLimitsFieldPathsNested, } { for _, p := range paths { v, p := v, p diff --git a/pkg/util/test/constructors_generated.go b/pkg/util/test/constructors_generated.go index 7403d703ac..abb8efc41a 100644 --- a/pkg/util/test/constructors_generated.go +++ b/pkg/util/test/constructors_generated.go @@ -483,6 +483,15 @@ func (MACStateOptionNamespace) WithRecentMacCommandIdentifiers(vs ...ttnpb.MACCo } } +// WithPendingRelayDownlink returns a MACStateOption, which returns a copy of ttnpb.MACState with PendingRelayDownlink set to v. +func (MACStateOptionNamespace) WithPendingRelayDownlink(v *ttnpb.RelayForwardDownlinkReq) MACStateOption { + return func(x *ttnpb.MACState) *ttnpb.MACState { + copy := ttnpb.Clone(x) + copy.PendingRelayDownlink = v + return copy + } +} + // Compose returns a functional composition of opts as a singular MACStateOption. func (MACStateOptionNamespace) Compose(opts ...MACStateOption) MACStateOption { return func(x *ttnpb.MACState) *ttnpb.MACState { diff --git a/pkg/webui/locales/ja.json b/pkg/webui/locales/ja.json index 018b86dfb5..f13141418e 100644 --- a/pkg/webui/locales/ja.json +++ b/pkg/webui/locales/ja.json @@ -1508,6 +1508,13 @@ "enum:CID_PING_SLOT_INFO": "スロット情報へPing", "enum:CID_REJOIN_PARAM_SETUP": "再ジョインパラメータ", "enum:CID_REKEY": "再キー", + "enum:CID_RELAY_CONF": "", + "enum:CID_RELAY_CONFIGURE_FWD_LIMIT": "", + "enum:CID_RELAY_CTRL_UPLINK_LIST": "", + "enum:CID_RELAY_END_DEVICE_CONF": "", + "enum:CID_RELAY_FILTER_LIST": "", + "enum:CID_RELAY_NOTIFY_NEW_END_DEVICE": "", + "enum:CID_RELAY_UPDATE_UPLINK_LIST": "", "enum:CID_RESET": "リセット", "enum:CID_RFU_0": "RFU", "enum:CID_RX_PARAM_SETUP": "受信パラメータ", @@ -2323,6 +2330,7 @@ "error:pkg/networkserver/redis:missing_uid": "", "error:pkg/networkserver/redis:no_uplink_match": "デバイスがアップリンクと一致しません", "error:pkg/networkserver/redis:read_only_field": "読み取り専用フィールド `{field}`", + "error:pkg/networkserver/redis:relay_served": "", "error:pkg/networkserver:abp_join_request": "ABPデバイスからジョインリクエストを受信しました", "error:pkg/networkserver:absolute_time": "アプリケーションダウンリンクに無効なアブソリュートタイムが設定されています", "error:pkg/networkserver:application_downlink_too_long": "アプリケーションダウンリンク長 `{length}` が最大値 '{max}' を超えています", @@ -2358,6 +2366,15 @@ "error:pkg/networkserver:payload": "無効なペイロード", "error:pkg/networkserver:raw_payload_too_short": "RawPayload長は4より大きい値でなければいけません", "error:pkg/networkserver:rejoin_request": "再ジョイン要求制御が未実装", + "error:pkg/networkserver:relay_full_f_cnt": "", + "error:pkg/networkserver:relay_m_type": "", + "error:pkg/networkserver:relay_recent_uplinks": "", + "error:pkg/networkserver:relay_rx_windows_available": "", + "error:pkg/networkserver:relay_schedule": "", + "error:pkg/networkserver:relay_serving": "", + "error:pkg/networkserver:relay_session": "", + "error:pkg/networkserver:relay_session_key_id": "", + "error:pkg/networkserver:relay_uplink_token": "", "error:pkg/networkserver:schedule": "全てのスケジュールされたダウンリンクが失敗に終わりました", "error:pkg/networkserver:transmission": "ダウンリンク伝送が結果 `{result}` で失敗しました", "error:pkg/networkserver:unknown_mac_state": "不明なMAC状態", @@ -2678,6 +2695,20 @@ "event:ns.mac.rejoin_param_setup.request": "再ジョインパラメータ設定要求がエンキューされました", "event:ns.mac.rekey.confirmation": "デバイス再キー確認がエンキューされました", "event:ns.mac.rekey.indication": "デバイス再キー指示を受信", + "event:ns.mac.relay_conf.answer.accept": "", + "event:ns.mac.relay_conf.answer.reject": "", + "event:ns.mac.relay_conf.request": "", + "event:ns.mac.relay_configure_fwd_limit.answer": "", + "event:ns.mac.relay_configure_fwd_limit.request": "", + "event:ns.mac.relay_ctrl_uplink_list.answer.accept": "", + "event:ns.mac.relay_ctrl_uplink_list.answer.reject": "", + "event:ns.mac.relay_ctrl_uplink_list.request": "", + "event:ns.mac.relay_end_device_conf.answer.accept": "", + "event:ns.mac.relay_end_device_conf.answer.reject": "", + "event:ns.mac.relay_end_device_conf.request": "", + "event:ns.mac.relay_notify_new_end_device.indication": "", + "event:ns.mac.relay_update_uplink_list.answer": "", + "event:ns.mac.relay_update_uplink_list.request": "", "event:ns.mac.reset.confirmation": "デバイスリセット確認がエンキューされました", "event:ns.mac.reset.indication": "デバイスリセット指示を受信", "event:ns.mac.rx_param_setup.answer.accept": "受信パラメータ設定許可を受信", @@ -2701,6 +2732,8 @@ "event:ns.up.join.interop.success": "相互接続ジョインサーバへのジョイン要求成功", "event:ns.up.join.process": "ジョイン要求処理に成功", "event:ns.up.join.receive": "ジョイン要求を受信", + "event:ns.up.relay.drop": "", + "event:ns.up.relay.process": "", "event:oauth.authorize": "OAuthクラアントを認証", "event:oauth.session.terminated": "ユーザセッションを終了", "event:oauth.token.deleted": "アクセストークンを削除", diff --git a/sdk/js/generated/api-definition.json b/sdk/js/generated/api-definition.json index c844543b19..95581bf4b9 100644 --- a/sdk/js/generated/api-definition.json +++ b/sdk/js/generated/api-definition.json @@ -4064,6 +4064,42 @@ "mac_settings.desired_ping_slot_data_rate_index.value", "mac_settings.desired_ping_slot_frequency", "mac_settings.desired_ping_slot_frequency.value", + "mac_settings.desired_relay", + "mac_settings.desired_relay.mode", + "mac_settings.desired_relay.mode.served", + "mac_settings.desired_relay.mode.served.backoff", + "mac_settings.desired_relay.mode.served.mode", + "mac_settings.desired_relay.mode.served.mode.always", + "mac_settings.desired_relay.mode.served.mode.dynamic", + "mac_settings.desired_relay.mode.served.mode.dynamic.smart_enable_level", + "mac_settings.desired_relay.mode.served.mode.end_device_controlled", + "mac_settings.desired_relay.mode.served.second_channel", + "mac_settings.desired_relay.mode.served.second_channel.ack_offset", + "mac_settings.desired_relay.mode.served.second_channel.data_rate_index", + "mac_settings.desired_relay.mode.served.second_channel.frequency", + "mac_settings.desired_relay.mode.served.serving_device_id", + "mac_settings.desired_relay.mode.serving", + "mac_settings.desired_relay.mode.serving.cad_periodicity", + "mac_settings.desired_relay.mode.serving.default_channel_index", + "mac_settings.desired_relay.mode.serving.limits", + "mac_settings.desired_relay.mode.serving.limits.join_requests", + "mac_settings.desired_relay.mode.serving.limits.join_requests.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.join_requests.reload_rate", + "mac_settings.desired_relay.mode.serving.limits.notifications", + "mac_settings.desired_relay.mode.serving.limits.notifications.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.notifications.reload_rate", + "mac_settings.desired_relay.mode.serving.limits.overall", + "mac_settings.desired_relay.mode.serving.limits.overall.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.overall.reload_rate", + "mac_settings.desired_relay.mode.serving.limits.reset_behavior", + "mac_settings.desired_relay.mode.serving.limits.uplink_messages", + "mac_settings.desired_relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_settings.desired_relay.mode.serving.second_channel", + "mac_settings.desired_relay.mode.serving.second_channel.ack_offset", + "mac_settings.desired_relay.mode.serving.second_channel.data_rate_index", + "mac_settings.desired_relay.mode.serving.second_channel.frequency", + "mac_settings.desired_relay.mode.serving.uplink_forwarding_rules", "mac_settings.desired_rx1_data_rate_offset", "mac_settings.desired_rx1_data_rate_offset.value", "mac_settings.desired_rx1_delay", @@ -4081,6 +4117,42 @@ "mac_settings.ping_slot_frequency.value", "mac_settings.ping_slot_periodicity", "mac_settings.ping_slot_periodicity.value", + "mac_settings.relay", + "mac_settings.relay.mode", + "mac_settings.relay.mode.served", + "mac_settings.relay.mode.served.backoff", + "mac_settings.relay.mode.served.mode", + "mac_settings.relay.mode.served.mode.always", + "mac_settings.relay.mode.served.mode.dynamic", + "mac_settings.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_settings.relay.mode.served.mode.end_device_controlled", + "mac_settings.relay.mode.served.second_channel", + "mac_settings.relay.mode.served.second_channel.ack_offset", + "mac_settings.relay.mode.served.second_channel.data_rate_index", + "mac_settings.relay.mode.served.second_channel.frequency", + "mac_settings.relay.mode.served.serving_device_id", + "mac_settings.relay.mode.serving", + "mac_settings.relay.mode.serving.cad_periodicity", + "mac_settings.relay.mode.serving.default_channel_index", + "mac_settings.relay.mode.serving.limits", + "mac_settings.relay.mode.serving.limits.join_requests", + "mac_settings.relay.mode.serving.limits.join_requests.bucket_size", + "mac_settings.relay.mode.serving.limits.join_requests.reload_rate", + "mac_settings.relay.mode.serving.limits.notifications", + "mac_settings.relay.mode.serving.limits.notifications.bucket_size", + "mac_settings.relay.mode.serving.limits.notifications.reload_rate", + "mac_settings.relay.mode.serving.limits.overall", + "mac_settings.relay.mode.serving.limits.overall.bucket_size", + "mac_settings.relay.mode.serving.limits.overall.reload_rate", + "mac_settings.relay.mode.serving.limits.reset_behavior", + "mac_settings.relay.mode.serving.limits.uplink_messages", + "mac_settings.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_settings.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_settings.relay.mode.serving.second_channel", + "mac_settings.relay.mode.serving.second_channel.ack_offset", + "mac_settings.relay.mode.serving.second_channel.data_rate_index", + "mac_settings.relay.mode.serving.second_channel.frequency", + "mac_settings.relay.mode.serving.uplink_forwarding_rules", "mac_settings.resets_f_cnt", "mac_settings.resets_f_cnt.value", "mac_settings.rx1_data_rate_offset", @@ -4123,6 +4195,42 @@ "mac_state.current_parameters.ping_slot_frequency", "mac_state.current_parameters.rejoin_count_periodicity", "mac_state.current_parameters.rejoin_time_periodicity", + "mac_state.current_parameters.relay", + "mac_state.current_parameters.relay.mode", + "mac_state.current_parameters.relay.mode.served", + "mac_state.current_parameters.relay.mode.served.backoff", + "mac_state.current_parameters.relay.mode.served.mode", + "mac_state.current_parameters.relay.mode.served.mode.always", + "mac_state.current_parameters.relay.mode.served.mode.dynamic", + "mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "mac_state.current_parameters.relay.mode.served.second_channel", + "mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "mac_state.current_parameters.relay.mode.served.serving_device_id", + "mac_state.current_parameters.relay.mode.serving", + "mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "mac_state.current_parameters.relay.mode.serving.default_channel_index", + "mac_state.current_parameters.relay.mode.serving.limits", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.notifications", + "mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.overall", + "mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_state.current_parameters.relay.mode.serving.second_channel", + "mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "mac_state.current_parameters.rx1_data_rate_offset", "mac_state.current_parameters.rx1_delay", "mac_state.current_parameters.rx2_data_rate_index", @@ -4148,6 +4256,42 @@ "mac_state.desired_parameters.ping_slot_frequency", "mac_state.desired_parameters.rejoin_count_periodicity", "mac_state.desired_parameters.rejoin_time_periodicity", + "mac_state.desired_parameters.relay", + "mac_state.desired_parameters.relay.mode", + "mac_state.desired_parameters.relay.mode.served", + "mac_state.desired_parameters.relay.mode.served.backoff", + "mac_state.desired_parameters.relay.mode.served.mode", + "mac_state.desired_parameters.relay.mode.served.mode.always", + "mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "mac_state.desired_parameters.relay.mode.served.second_channel", + "mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "mac_state.desired_parameters.relay.mode.served.serving_device_id", + "mac_state.desired_parameters.relay.mode.serving", + "mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "mac_state.desired_parameters.relay.mode.serving.limits", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.overall", + "mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.second_channel", + "mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "mac_state.desired_parameters.rx1_data_rate_offset", "mac_state.desired_parameters.rx1_delay", "mac_state.desired_parameters.rx2_data_rate_index", @@ -4172,6 +4316,8 @@ "mac_state.pending_application_downlink.frm_payload", "mac_state.pending_application_downlink.priority", "mac_state.pending_application_downlink.session_key_id", + "mac_state.pending_relay_downlink", + "mac_state.pending_relay_downlink.raw_payload", "mac_state.pending_requests", "mac_state.ping_slot_periodicity", "mac_state.ping_slot_periodicity.value", @@ -4207,6 +4353,42 @@ "pending_mac_state.current_parameters.ping_slot_frequency", "pending_mac_state.current_parameters.rejoin_count_periodicity", "pending_mac_state.current_parameters.rejoin_time_periodicity", + "pending_mac_state.current_parameters.relay", + "pending_mac_state.current_parameters.relay.mode", + "pending_mac_state.current_parameters.relay.mode.served", + "pending_mac_state.current_parameters.relay.mode.served.backoff", + "pending_mac_state.current_parameters.relay.mode.served.mode", + "pending_mac_state.current_parameters.relay.mode.served.mode.always", + "pending_mac_state.current_parameters.relay.mode.served.mode.dynamic", + "pending_mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "pending_mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "pending_mac_state.current_parameters.relay.mode.served.second_channel", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "pending_mac_state.current_parameters.relay.mode.served.serving_device_id", + "pending_mac_state.current_parameters.relay.mode.serving", + "pending_mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "pending_mac_state.current_parameters.relay.mode.serving.default_channel_index", + "pending_mac_state.current_parameters.relay.mode.serving.limits", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "pending_mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "pending_mac_state.current_parameters.rx1_data_rate_offset", "pending_mac_state.current_parameters.rx1_delay", "pending_mac_state.current_parameters.rx2_data_rate_index", @@ -4232,6 +4414,42 @@ "pending_mac_state.desired_parameters.ping_slot_frequency", "pending_mac_state.desired_parameters.rejoin_count_periodicity", "pending_mac_state.desired_parameters.rejoin_time_periodicity", + "pending_mac_state.desired_parameters.relay", + "pending_mac_state.desired_parameters.relay.mode", + "pending_mac_state.desired_parameters.relay.mode.served", + "pending_mac_state.desired_parameters.relay.mode.served.backoff", + "pending_mac_state.desired_parameters.relay.mode.served.mode", + "pending_mac_state.desired_parameters.relay.mode.served.mode.always", + "pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "pending_mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "pending_mac_state.desired_parameters.relay.mode.served.serving_device_id", + "pending_mac_state.desired_parameters.relay.mode.serving", + "pending_mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "pending_mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "pending_mac_state.desired_parameters.relay.mode.serving.limits", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "pending_mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "pending_mac_state.desired_parameters.rx1_data_rate_offset", "pending_mac_state.desired_parameters.rx1_delay", "pending_mac_state.desired_parameters.rx2_data_rate_index", @@ -4405,6 +4623,42 @@ "mac_settings.desired_ping_slot_data_rate_index.value", "mac_settings.desired_ping_slot_frequency", "mac_settings.desired_ping_slot_frequency.value", + "mac_settings.desired_relay", + "mac_settings.desired_relay.mode", + "mac_settings.desired_relay.mode.served", + "mac_settings.desired_relay.mode.served.backoff", + "mac_settings.desired_relay.mode.served.mode", + "mac_settings.desired_relay.mode.served.mode.always", + "mac_settings.desired_relay.mode.served.mode.dynamic", + "mac_settings.desired_relay.mode.served.mode.dynamic.smart_enable_level", + "mac_settings.desired_relay.mode.served.mode.end_device_controlled", + "mac_settings.desired_relay.mode.served.second_channel", + "mac_settings.desired_relay.mode.served.second_channel.ack_offset", + "mac_settings.desired_relay.mode.served.second_channel.data_rate_index", + "mac_settings.desired_relay.mode.served.second_channel.frequency", + "mac_settings.desired_relay.mode.served.serving_device_id", + "mac_settings.desired_relay.mode.serving", + "mac_settings.desired_relay.mode.serving.cad_periodicity", + "mac_settings.desired_relay.mode.serving.default_channel_index", + "mac_settings.desired_relay.mode.serving.limits", + "mac_settings.desired_relay.mode.serving.limits.join_requests", + "mac_settings.desired_relay.mode.serving.limits.join_requests.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.join_requests.reload_rate", + "mac_settings.desired_relay.mode.serving.limits.notifications", + "mac_settings.desired_relay.mode.serving.limits.notifications.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.notifications.reload_rate", + "mac_settings.desired_relay.mode.serving.limits.overall", + "mac_settings.desired_relay.mode.serving.limits.overall.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.overall.reload_rate", + "mac_settings.desired_relay.mode.serving.limits.reset_behavior", + "mac_settings.desired_relay.mode.serving.limits.uplink_messages", + "mac_settings.desired_relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_settings.desired_relay.mode.serving.second_channel", + "mac_settings.desired_relay.mode.serving.second_channel.ack_offset", + "mac_settings.desired_relay.mode.serving.second_channel.data_rate_index", + "mac_settings.desired_relay.mode.serving.second_channel.frequency", + "mac_settings.desired_relay.mode.serving.uplink_forwarding_rules", "mac_settings.desired_rx1_data_rate_offset", "mac_settings.desired_rx1_data_rate_offset.value", "mac_settings.desired_rx1_delay", @@ -4422,6 +4676,42 @@ "mac_settings.ping_slot_frequency.value", "mac_settings.ping_slot_periodicity", "mac_settings.ping_slot_periodicity.value", + "mac_settings.relay", + "mac_settings.relay.mode", + "mac_settings.relay.mode.served", + "mac_settings.relay.mode.served.backoff", + "mac_settings.relay.mode.served.mode", + "mac_settings.relay.mode.served.mode.always", + "mac_settings.relay.mode.served.mode.dynamic", + "mac_settings.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_settings.relay.mode.served.mode.end_device_controlled", + "mac_settings.relay.mode.served.second_channel", + "mac_settings.relay.mode.served.second_channel.ack_offset", + "mac_settings.relay.mode.served.second_channel.data_rate_index", + "mac_settings.relay.mode.served.second_channel.frequency", + "mac_settings.relay.mode.served.serving_device_id", + "mac_settings.relay.mode.serving", + "mac_settings.relay.mode.serving.cad_periodicity", + "mac_settings.relay.mode.serving.default_channel_index", + "mac_settings.relay.mode.serving.limits", + "mac_settings.relay.mode.serving.limits.join_requests", + "mac_settings.relay.mode.serving.limits.join_requests.bucket_size", + "mac_settings.relay.mode.serving.limits.join_requests.reload_rate", + "mac_settings.relay.mode.serving.limits.notifications", + "mac_settings.relay.mode.serving.limits.notifications.bucket_size", + "mac_settings.relay.mode.serving.limits.notifications.reload_rate", + "mac_settings.relay.mode.serving.limits.overall", + "mac_settings.relay.mode.serving.limits.overall.bucket_size", + "mac_settings.relay.mode.serving.limits.overall.reload_rate", + "mac_settings.relay.mode.serving.limits.reset_behavior", + "mac_settings.relay.mode.serving.limits.uplink_messages", + "mac_settings.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_settings.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_settings.relay.mode.serving.second_channel", + "mac_settings.relay.mode.serving.second_channel.ack_offset", + "mac_settings.relay.mode.serving.second_channel.data_rate_index", + "mac_settings.relay.mode.serving.second_channel.frequency", + "mac_settings.relay.mode.serving.uplink_forwarding_rules", "mac_settings.resets_f_cnt", "mac_settings.resets_f_cnt.value", "mac_settings.rx1_data_rate_offset", @@ -4464,6 +4754,42 @@ "mac_state.current_parameters.ping_slot_frequency", "mac_state.current_parameters.rejoin_count_periodicity", "mac_state.current_parameters.rejoin_time_periodicity", + "mac_state.current_parameters.relay", + "mac_state.current_parameters.relay.mode", + "mac_state.current_parameters.relay.mode.served", + "mac_state.current_parameters.relay.mode.served.backoff", + "mac_state.current_parameters.relay.mode.served.mode", + "mac_state.current_parameters.relay.mode.served.mode.always", + "mac_state.current_parameters.relay.mode.served.mode.dynamic", + "mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "mac_state.current_parameters.relay.mode.served.second_channel", + "mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "mac_state.current_parameters.relay.mode.served.serving_device_id", + "mac_state.current_parameters.relay.mode.serving", + "mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "mac_state.current_parameters.relay.mode.serving.default_channel_index", + "mac_state.current_parameters.relay.mode.serving.limits", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.notifications", + "mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.overall", + "mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_state.current_parameters.relay.mode.serving.second_channel", + "mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "mac_state.current_parameters.rx1_data_rate_offset", "mac_state.current_parameters.rx1_delay", "mac_state.current_parameters.rx2_data_rate_index", @@ -4489,6 +4815,42 @@ "mac_state.desired_parameters.ping_slot_frequency", "mac_state.desired_parameters.rejoin_count_periodicity", "mac_state.desired_parameters.rejoin_time_periodicity", + "mac_state.desired_parameters.relay", + "mac_state.desired_parameters.relay.mode", + "mac_state.desired_parameters.relay.mode.served", + "mac_state.desired_parameters.relay.mode.served.backoff", + "mac_state.desired_parameters.relay.mode.served.mode", + "mac_state.desired_parameters.relay.mode.served.mode.always", + "mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "mac_state.desired_parameters.relay.mode.served.second_channel", + "mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "mac_state.desired_parameters.relay.mode.served.serving_device_id", + "mac_state.desired_parameters.relay.mode.serving", + "mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "mac_state.desired_parameters.relay.mode.serving.limits", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.overall", + "mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.second_channel", + "mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "mac_state.desired_parameters.rx1_data_rate_offset", "mac_state.desired_parameters.rx1_delay", "mac_state.desired_parameters.rx2_data_rate_index", @@ -4513,6 +4875,8 @@ "mac_state.pending_application_downlink.frm_payload", "mac_state.pending_application_downlink.priority", "mac_state.pending_application_downlink.session_key_id", + "mac_state.pending_relay_downlink", + "mac_state.pending_relay_downlink.raw_payload", "mac_state.pending_requests", "mac_state.ping_slot_periodicity", "mac_state.ping_slot_periodicity.value", @@ -4548,6 +4912,42 @@ "pending_mac_state.current_parameters.ping_slot_frequency", "pending_mac_state.current_parameters.rejoin_count_periodicity", "pending_mac_state.current_parameters.rejoin_time_periodicity", + "pending_mac_state.current_parameters.relay", + "pending_mac_state.current_parameters.relay.mode", + "pending_mac_state.current_parameters.relay.mode.served", + "pending_mac_state.current_parameters.relay.mode.served.backoff", + "pending_mac_state.current_parameters.relay.mode.served.mode", + "pending_mac_state.current_parameters.relay.mode.served.mode.always", + "pending_mac_state.current_parameters.relay.mode.served.mode.dynamic", + "pending_mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "pending_mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "pending_mac_state.current_parameters.relay.mode.served.second_channel", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "pending_mac_state.current_parameters.relay.mode.served.serving_device_id", + "pending_mac_state.current_parameters.relay.mode.serving", + "pending_mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "pending_mac_state.current_parameters.relay.mode.serving.default_channel_index", + "pending_mac_state.current_parameters.relay.mode.serving.limits", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "pending_mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "pending_mac_state.current_parameters.rx1_data_rate_offset", "pending_mac_state.current_parameters.rx1_delay", "pending_mac_state.current_parameters.rx2_data_rate_index", @@ -4573,6 +4973,42 @@ "pending_mac_state.desired_parameters.ping_slot_frequency", "pending_mac_state.desired_parameters.rejoin_count_periodicity", "pending_mac_state.desired_parameters.rejoin_time_periodicity", + "pending_mac_state.desired_parameters.relay", + "pending_mac_state.desired_parameters.relay.mode", + "pending_mac_state.desired_parameters.relay.mode.served", + "pending_mac_state.desired_parameters.relay.mode.served.backoff", + "pending_mac_state.desired_parameters.relay.mode.served.mode", + "pending_mac_state.desired_parameters.relay.mode.served.mode.always", + "pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "pending_mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "pending_mac_state.desired_parameters.relay.mode.served.serving_device_id", + "pending_mac_state.desired_parameters.relay.mode.serving", + "pending_mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "pending_mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "pending_mac_state.desired_parameters.relay.mode.serving.limits", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "pending_mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "pending_mac_state.desired_parameters.rx1_data_rate_offset", "pending_mac_state.desired_parameters.rx1_delay", "pending_mac_state.desired_parameters.rx2_data_rate_index", @@ -4742,6 +5178,42 @@ "mac_settings.desired_ping_slot_data_rate_index.value", "mac_settings.desired_ping_slot_frequency", "mac_settings.desired_ping_slot_frequency.value", + "mac_settings.desired_relay", + "mac_settings.desired_relay.mode", + "mac_settings.desired_relay.mode.served", + "mac_settings.desired_relay.mode.served.backoff", + "mac_settings.desired_relay.mode.served.mode", + "mac_settings.desired_relay.mode.served.mode.always", + "mac_settings.desired_relay.mode.served.mode.dynamic", + "mac_settings.desired_relay.mode.served.mode.dynamic.smart_enable_level", + "mac_settings.desired_relay.mode.served.mode.end_device_controlled", + "mac_settings.desired_relay.mode.served.second_channel", + "mac_settings.desired_relay.mode.served.second_channel.ack_offset", + "mac_settings.desired_relay.mode.served.second_channel.data_rate_index", + "mac_settings.desired_relay.mode.served.second_channel.frequency", + "mac_settings.desired_relay.mode.served.serving_device_id", + "mac_settings.desired_relay.mode.serving", + "mac_settings.desired_relay.mode.serving.cad_periodicity", + "mac_settings.desired_relay.mode.serving.default_channel_index", + "mac_settings.desired_relay.mode.serving.limits", + "mac_settings.desired_relay.mode.serving.limits.join_requests", + "mac_settings.desired_relay.mode.serving.limits.join_requests.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.join_requests.reload_rate", + "mac_settings.desired_relay.mode.serving.limits.notifications", + "mac_settings.desired_relay.mode.serving.limits.notifications.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.notifications.reload_rate", + "mac_settings.desired_relay.mode.serving.limits.overall", + "mac_settings.desired_relay.mode.serving.limits.overall.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.overall.reload_rate", + "mac_settings.desired_relay.mode.serving.limits.reset_behavior", + "mac_settings.desired_relay.mode.serving.limits.uplink_messages", + "mac_settings.desired_relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_settings.desired_relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_settings.desired_relay.mode.serving.second_channel", + "mac_settings.desired_relay.mode.serving.second_channel.ack_offset", + "mac_settings.desired_relay.mode.serving.second_channel.data_rate_index", + "mac_settings.desired_relay.mode.serving.second_channel.frequency", + "mac_settings.desired_relay.mode.serving.uplink_forwarding_rules", "mac_settings.desired_rx1_data_rate_offset", "mac_settings.desired_rx1_data_rate_offset.value", "mac_settings.desired_rx1_delay", @@ -4759,6 +5231,42 @@ "mac_settings.ping_slot_frequency.value", "mac_settings.ping_slot_periodicity", "mac_settings.ping_slot_periodicity.value", + "mac_settings.relay", + "mac_settings.relay.mode", + "mac_settings.relay.mode.served", + "mac_settings.relay.mode.served.backoff", + "mac_settings.relay.mode.served.mode", + "mac_settings.relay.mode.served.mode.always", + "mac_settings.relay.mode.served.mode.dynamic", + "mac_settings.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_settings.relay.mode.served.mode.end_device_controlled", + "mac_settings.relay.mode.served.second_channel", + "mac_settings.relay.mode.served.second_channel.ack_offset", + "mac_settings.relay.mode.served.second_channel.data_rate_index", + "mac_settings.relay.mode.served.second_channel.frequency", + "mac_settings.relay.mode.served.serving_device_id", + "mac_settings.relay.mode.serving", + "mac_settings.relay.mode.serving.cad_periodicity", + "mac_settings.relay.mode.serving.default_channel_index", + "mac_settings.relay.mode.serving.limits", + "mac_settings.relay.mode.serving.limits.join_requests", + "mac_settings.relay.mode.serving.limits.join_requests.bucket_size", + "mac_settings.relay.mode.serving.limits.join_requests.reload_rate", + "mac_settings.relay.mode.serving.limits.notifications", + "mac_settings.relay.mode.serving.limits.notifications.bucket_size", + "mac_settings.relay.mode.serving.limits.notifications.reload_rate", + "mac_settings.relay.mode.serving.limits.overall", + "mac_settings.relay.mode.serving.limits.overall.bucket_size", + "mac_settings.relay.mode.serving.limits.overall.reload_rate", + "mac_settings.relay.mode.serving.limits.reset_behavior", + "mac_settings.relay.mode.serving.limits.uplink_messages", + "mac_settings.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_settings.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_settings.relay.mode.serving.second_channel", + "mac_settings.relay.mode.serving.second_channel.ack_offset", + "mac_settings.relay.mode.serving.second_channel.data_rate_index", + "mac_settings.relay.mode.serving.second_channel.frequency", + "mac_settings.relay.mode.serving.uplink_forwarding_rules", "mac_settings.resets_f_cnt", "mac_settings.resets_f_cnt.value", "mac_settings.rx1_data_rate_offset", @@ -4801,6 +5309,42 @@ "mac_state.current_parameters.ping_slot_frequency", "mac_state.current_parameters.rejoin_count_periodicity", "mac_state.current_parameters.rejoin_time_periodicity", + "mac_state.current_parameters.relay", + "mac_state.current_parameters.relay.mode", + "mac_state.current_parameters.relay.mode.served", + "mac_state.current_parameters.relay.mode.served.backoff", + "mac_state.current_parameters.relay.mode.served.mode", + "mac_state.current_parameters.relay.mode.served.mode.always", + "mac_state.current_parameters.relay.mode.served.mode.dynamic", + "mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "mac_state.current_parameters.relay.mode.served.second_channel", + "mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "mac_state.current_parameters.relay.mode.served.serving_device_id", + "mac_state.current_parameters.relay.mode.serving", + "mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "mac_state.current_parameters.relay.mode.serving.default_channel_index", + "mac_state.current_parameters.relay.mode.serving.limits", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.notifications", + "mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.overall", + "mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_state.current_parameters.relay.mode.serving.second_channel", + "mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "mac_state.current_parameters.rx1_data_rate_offset", "mac_state.current_parameters.rx1_delay", "mac_state.current_parameters.rx2_data_rate_index", @@ -4826,6 +5370,42 @@ "mac_state.desired_parameters.ping_slot_frequency", "mac_state.desired_parameters.rejoin_count_periodicity", "mac_state.desired_parameters.rejoin_time_periodicity", + "mac_state.desired_parameters.relay", + "mac_state.desired_parameters.relay.mode", + "mac_state.desired_parameters.relay.mode.served", + "mac_state.desired_parameters.relay.mode.served.backoff", + "mac_state.desired_parameters.relay.mode.served.mode", + "mac_state.desired_parameters.relay.mode.served.mode.always", + "mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "mac_state.desired_parameters.relay.mode.served.second_channel", + "mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "mac_state.desired_parameters.relay.mode.served.serving_device_id", + "mac_state.desired_parameters.relay.mode.serving", + "mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "mac_state.desired_parameters.relay.mode.serving.limits", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.overall", + "mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "mac_state.desired_parameters.relay.mode.serving.second_channel", + "mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "mac_state.desired_parameters.rx1_data_rate_offset", "mac_state.desired_parameters.rx1_delay", "mac_state.desired_parameters.rx2_data_rate_index", @@ -4850,6 +5430,8 @@ "mac_state.pending_application_downlink.frm_payload", "mac_state.pending_application_downlink.priority", "mac_state.pending_application_downlink.session_key_id", + "mac_state.pending_relay_downlink", + "mac_state.pending_relay_downlink.raw_payload", "mac_state.pending_requests", "mac_state.ping_slot_periodicity", "mac_state.ping_slot_periodicity.value", @@ -4885,6 +5467,42 @@ "pending_mac_state.current_parameters.ping_slot_frequency", "pending_mac_state.current_parameters.rejoin_count_periodicity", "pending_mac_state.current_parameters.rejoin_time_periodicity", + "pending_mac_state.current_parameters.relay", + "pending_mac_state.current_parameters.relay.mode", + "pending_mac_state.current_parameters.relay.mode.served", + "pending_mac_state.current_parameters.relay.mode.served.backoff", + "pending_mac_state.current_parameters.relay.mode.served.mode", + "pending_mac_state.current_parameters.relay.mode.served.mode.always", + "pending_mac_state.current_parameters.relay.mode.served.mode.dynamic", + "pending_mac_state.current_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "pending_mac_state.current_parameters.relay.mode.served.mode.end_device_controlled", + "pending_mac_state.current_parameters.relay.mode.served.second_channel", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.ack_offset", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.data_rate_index", + "pending_mac_state.current_parameters.relay.mode.served.second_channel.frequency", + "pending_mac_state.current_parameters.relay.mode.served.serving_device_id", + "pending_mac_state.current_parameters.relay.mode.serving", + "pending_mac_state.current_parameters.relay.mode.serving.cad_periodicity", + "pending_mac_state.current_parameters.relay.mode.serving.default_channel_index", + "pending_mac_state.current_parameters.relay.mode.serving.limits", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.notifications.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.overall.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.limits.reset_behavior", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "pending_mac_state.current_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.ack_offset", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.data_rate_index", + "pending_mac_state.current_parameters.relay.mode.serving.second_channel.frequency", + "pending_mac_state.current_parameters.relay.mode.serving.uplink_forwarding_rules", "pending_mac_state.current_parameters.rx1_data_rate_offset", "pending_mac_state.current_parameters.rx1_delay", "pending_mac_state.current_parameters.rx2_data_rate_index", @@ -4910,6 +5528,42 @@ "pending_mac_state.desired_parameters.ping_slot_frequency", "pending_mac_state.desired_parameters.rejoin_count_periodicity", "pending_mac_state.desired_parameters.rejoin_time_periodicity", + "pending_mac_state.desired_parameters.relay", + "pending_mac_state.desired_parameters.relay.mode", + "pending_mac_state.desired_parameters.relay.mode.served", + "pending_mac_state.desired_parameters.relay.mode.served.backoff", + "pending_mac_state.desired_parameters.relay.mode.served.mode", + "pending_mac_state.desired_parameters.relay.mode.served.mode.always", + "pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic", + "pending_mac_state.desired_parameters.relay.mode.served.mode.dynamic.smart_enable_level", + "pending_mac_state.desired_parameters.relay.mode.served.mode.end_device_controlled", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.ack_offset", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.data_rate_index", + "pending_mac_state.desired_parameters.relay.mode.served.second_channel.frequency", + "pending_mac_state.desired_parameters.relay.mode.served.serving_device_id", + "pending_mac_state.desired_parameters.relay.mode.serving", + "pending_mac_state.desired_parameters.relay.mode.serving.cad_periodicity", + "pending_mac_state.desired_parameters.relay.mode.serving.default_channel_index", + "pending_mac_state.desired_parameters.relay.mode.serving.limits", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.join_requests.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.notifications.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.overall.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.reset_behavior", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.bucket_size", + "pending_mac_state.desired_parameters.relay.mode.serving.limits.uplink_messages.reload_rate", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.ack_offset", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.data_rate_index", + "pending_mac_state.desired_parameters.relay.mode.serving.second_channel.frequency", + "pending_mac_state.desired_parameters.relay.mode.serving.uplink_forwarding_rules", "pending_mac_state.desired_parameters.rx1_data_rate_offset", "pending_mac_state.desired_parameters.rx1_delay", "pending_mac_state.desired_parameters.rx2_data_rate_index", diff --git a/sdk/js/generated/api.json b/sdk/js/generated/api.json index 4d2fb73c13..76a0852b33 100644 --- a/sdk/js/generated/api.json +++ b/sdk/js/generated/api.json @@ -17284,7 +17284,7 @@ }, { "name": "uplink_dwell_time", - "description": "Whether uplink dwell time is set (400ms).\nIf this field is not set, then the value is either unknown or irrelevant(Network Server cannot modify it).", + "description": "Whether uplink dwell time is set (400ms).\nIf unset, then the value is either unknown or irrelevant(Network Server cannot modify it).", "label": "", "type": "BoolValue", "longType": "BoolValue", @@ -17296,7 +17296,7 @@ }, { "name": "downlink_dwell_time", - "description": "Whether downlink dwell time is set (400ms).\nIf this field is not set, then the value is either unknown or irrelevant(Network Server cannot modify it).", + "description": "Whether downlink dwell time is set (400ms).\nIf unset, then the value is either unknown or irrelevant(Network Server cannot modify it).", "label": "", "type": "BoolValue", "longType": "BoolValue", @@ -17341,6 +17341,18 @@ "isoneof": false, "oneofdecl": "", "defaultValue": "" + }, + { + "name": "relay", + "description": "Relay parameters.", + "label": "", + "type": "RelayParameters", + "longType": "RelayParameters", + "fullType": "ttn.lorawan.v3.RelayParameters", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" } ] }, @@ -17883,6 +17895,30 @@ "isoneof": false, "oneofdecl": "", "defaultValue": "" + }, + { + "name": "relay", + "description": "The relay parameters the end device is using.\nIf unset, the default value from Network Server configuration or regional parameters specification will be used.", + "label": "", + "type": "RelayParameters", + "longType": "RelayParameters", + "fullType": "ttn.lorawan.v3.RelayParameters", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "desired_relay", + "description": "The relay parameters the Network Server should configure device to use via MAC commands.\nIf unset, the default value from Network Server configuration or regional parameters specification will be used.", + "label": "", + "type": "RelayParameters", + "longType": "RelayParameters", + "fullType": "ttn.lorawan.v3.RelayParameters", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" } ] }, @@ -18235,6 +18271,18 @@ "isoneof": false, "oneofdecl": "", "defaultValue": "" + }, + { + "name": "pending_relay_downlink", + "description": "Pending relay downlink contents.\nThe pending downlink will be scheduled to the relay in either Rx1 or Rx2.\nThe pending downlink will be cleared after the scheduling attempt.", + "label": "", + "type": "RelayForwardDownlinkReq", + "longType": "RelayForwardDownlinkReq", + "fullType": "ttn.lorawan.v3.RelayForwardDownlinkReq", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" } ] }, @@ -18935,6 +18983,18 @@ "isoneof": false, "oneofdecl": "", "defaultValue": "" + }, + { + "name": "relay", + "description": "", + "label": "", + "type": "RelayMetadata", + "longType": "MACState.UplinkMessage.RxMetadata.RelayMetadata", + "fullType": "ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.RelayMetadata", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" } ] }, @@ -18949,6 +19009,17 @@ "extensions": [], "fields": [] }, + { + "name": "RelayMetadata", + "longName": "MACState.UplinkMessage.RxMetadata.RelayMetadata", + "fullName": "ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.RelayMetadata", + "description": "", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, { "name": "TxSettings", "longName": "MACState.UplinkMessage.TxSettings", @@ -18981,6 +19052,42 @@ } ] }, + { + "name": "RelayParameters", + "longName": "RelayParameters", + "fullName": "ttn.lorawan.v3.RelayParameters", + "description": "RelayParameters represent the parameters of a relay.\nThis is used internally by the Network Server.", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": true, + "extensions": [], + "fields": [ + { + "name": "serving", + "description": "Parameters related to a relay which is serving end devices.", + "label": "", + "type": "ServingRelayParameters", + "longType": "ServingRelayParameters", + "fullType": "ttn.lorawan.v3.ServingRelayParameters", + "ismap": false, + "isoneof": true, + "oneofdecl": "mode", + "defaultValue": "" + }, + { + "name": "served", + "description": "Parameters related to an end device served by a relay.", + "label": "", + "type": "ServedRelayParameters", + "longType": "ServedRelayParameters", + "fullType": "ttn.lorawan.v3.ServedRelayParameters", + "ismap": false, + "isoneof": true, + "oneofdecl": "mode", + "defaultValue": "" + } + ] + }, { "name": "ResetAndGetEndDeviceRequest", "longName": "ResetAndGetEndDeviceRequest", @@ -19026,42 +19133,58 @@ ] }, { - "name": "Session", - "longName": "Session", - "fullName": "ttn.lorawan.v3.Session", + "name": "ServedRelayParameters", + "longName": "ServedRelayParameters", + "fullName": "ttn.lorawan.v3.ServedRelayParameters", "description": "", "hasExtensions": false, "hasFields": true, - "hasOneofs": false, + "hasOneofs": true, "extensions": [], "fields": [ { - "name": "dev_addr", - "description": "Device Address, issued by the Network Server or chosen by device manufacturer in case of testing range (beginning with 00-03).\nKnown by Network Server, Application Server and Join Server. Owned by Network Server.", + "name": "always", + "description": "The end device will always attempt to use the relay mode in order to send uplink messages.", "label": "", - "type": "bytes", - "longType": "bytes", - "fullType": "bytes", + "type": "RelayEndDeviceAlwaysMode", + "longType": "RelayEndDeviceAlwaysMode", + "fullType": "ttn.lorawan.v3.RelayEndDeviceAlwaysMode", "ismap": false, - "isoneof": false, - "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "bytes.len", - "value": 4 - } - ] - } + "isoneof": true, + "oneofdecl": "mode", + "defaultValue": "" }, { - "name": "keys", - "description": "", + "name": "dynamic", + "description": "The end device will attempt to use relay mode only after a number of uplink messages have been sent without\nreceiving a valid a downlink message.", "label": "", - "type": "SessionKeys", - "longType": "SessionKeys", - "fullType": "ttn.lorawan.v3.SessionKeys", + "type": "RelayEndDeviceDynamicMode", + "longType": "RelayEndDeviceDynamicMode", + "fullType": "ttn.lorawan.v3.RelayEndDeviceDynamicMode", + "ismap": false, + "isoneof": true, + "oneofdecl": "mode", + "defaultValue": "" + }, + { + "name": "end_device_controlled", + "description": "The end device will control when it uses the relay mode. This is the default mode.", + "label": "", + "type": "RelayEndDeviceControlledMode", + "longType": "RelayEndDeviceControlledMode", + "fullType": "ttn.lorawan.v3.RelayEndDeviceControlledMode", + "ismap": false, + "isoneof": true, + "oneofdecl": "mode", + "defaultValue": "" + }, + { + "name": "backoff", + "description": "Number of uplinks to be sent without a wake on radio frame.", + "label": "", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -19069,51 +19192,75 @@ "options": { "validate.rules": [ { - "name": "message.required", - "value": true + "name": "uint32.lte", + "value": 63 } ] } }, { - "name": "last_f_cnt_up", - "description": "Last uplink frame counter value used. Network Server only. Application Server assumes the Network Server checked it.", + "name": "second_channel", + "description": "Second wake on radio channel configuration.", "label": "", - "type": "uint32", - "longType": "uint32", - "fullType": "uint32", + "type": "RelaySecondChannel", + "longType": "RelaySecondChannel", + "fullType": "ttn.lorawan.v3.RelaySecondChannel", "ismap": false, "isoneof": false, "oneofdecl": "", "defaultValue": "" }, { - "name": "last_n_f_cnt_down", - "description": "Last network downlink frame counter value used. Network Server only.", + "name": "serving_device_id", + "description": "End device identifier of the serving end device.", "label": "", - "type": "uint32", - "longType": "uint32", - "fullType": "uint32", + "type": "string", + "longType": "string", + "fullType": "string", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "" - }, + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "string.max_len", + "value": 36 + }, + { + "name": "string.pattern", + "value": "^[a-z0-9](?:[-]?[a-z0-9]){2,}$" + } + ] + } + } + ] + }, + { + "name": "ServingRelayParameters", + "longName": "ServingRelayParameters", + "fullName": "ttn.lorawan.v3.ServingRelayParameters", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "last_a_f_cnt_down", - "description": "Last application downlink frame counter value used. Application Server only.", + "name": "second_channel", + "description": "Second wake on radio channel configuration.", "label": "", - "type": "uint32", - "longType": "uint32", - "fullType": "uint32", + "type": "RelaySecondChannel", + "longType": "RelaySecondChannel", + "fullType": "ttn.lorawan.v3.RelaySecondChannel", "ismap": false, "isoneof": false, "oneofdecl": "", "defaultValue": "" }, { - "name": "last_conf_f_cnt_down", - "description": "Frame counter of the last confirmed downlink message sent. Network Server only.", + "name": "default_channel_index", + "description": "Index of the default wake on radio channel.", "label": "", "type": "uint32", "longType": "uint32", @@ -19121,51 +19268,43 @@ "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "" + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "uint32.lte", + "value": 255 + } + ] + } }, { - "name": "started_at", - "description": "Time when the session started. Network Server only.", + "name": "cad_periodicity", + "description": "Channel activity detection periodicity.", "label": "", - "type": "Timestamp", - "longType": "google.protobuf.Timestamp", - "fullType": "google.protobuf.Timestamp", + "type": "RelayCADPeriodicity", + "longType": "RelayCADPeriodicity", + "fullType": "ttn.lorawan.v3.RelayCADPeriodicity", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "" + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } }, { - "name": "queued_application_downlinks", - "description": "Queued Application downlink messages. Stored in Application Server and Network Server.", + "name": "uplink_forwarding_rules", + "description": "Configured uplink forwarding rules.", "label": "repeated", - "type": "ApplicationDownlink", - "longType": "ApplicationDownlink", - "fullType": "ttn.lorawan.v3.ApplicationDownlink", - "ismap": false, - "isoneof": false, - "oneofdecl": "", - "defaultValue": "" - } - ] - }, - { - "name": "SetEndDeviceRequest", - "longName": "SetEndDeviceRequest", - "fullName": "ttn.lorawan.v3.SetEndDeviceRequest", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ - { - "name": "end_device", - "description": "", - "label": "", - "type": "EndDevice", - "longType": "EndDevice", - "fullType": "ttn.lorawan.v3.EndDevice", + "type": "UplinkForwardingRule", + "longType": "ServingRelayParameters.UplinkForwardingRule", + "fullType": "ttn.lorawan.v3.ServingRelayParameters.UplinkForwardingRule", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -19173,19 +19312,19 @@ "options": { "validate.rules": [ { - "name": "message.required", - "value": true + "name": "repeated.max_items", + "value": 16 } ] } }, { - "name": "field_mask", - "description": "The names of the end device fields that should be updated.\nSee the API reference for which fields can be set on the different services.", + "name": "limits", + "description": "Configured forwarding limits.\nIf unset, the default value from Network Server configuration will be used.", "label": "", - "type": "FieldMask", - "longType": "google.protobuf.FieldMask", - "fullType": "google.protobuf.FieldMask", + "type": "ForwardingLimits", + "longType": "ServingRelayParameters.ForwardingLimits", + "fullType": "ttn.lorawan.v3.ServingRelayParameters.ForwardingLimits", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -19194,9 +19333,9 @@ ] }, { - "name": "UpdateEndDeviceRequest", - "longName": "UpdateEndDeviceRequest", - "fullName": "ttn.lorawan.v3.UpdateEndDeviceRequest", + "name": "ForwardingLimits", + "longName": "ServingRelayParameters.ForwardingLimits", + "fullName": "ttn.lorawan.v3.ServingRelayParameters.ForwardingLimits", "description": "", "hasExtensions": false, "hasFields": true, @@ -19204,232 +19343,400 @@ "extensions": [], "fields": [ { - "name": "end_device", - "description": "", + "name": "reset_behavior", + "description": "Reset behavior of the buckets upon limit update.", "label": "", - "type": "EndDevice", - "longType": "EndDevice", - "fullType": "ttn.lorawan.v3.EndDevice", + "type": "RelayResetLimitCounter", + "longType": "RelayResetLimitCounter", + "fullType": "ttn.lorawan.v3.RelayResetLimitCounter", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "message.required", - "value": true - } - ] - } + "defaultValue": "" }, { - "name": "field_mask", - "description": "The names of the end device fields that should be updated.\nSee the API reference for which fields can be set on the different services.", + "name": "join_requests", + "description": "Bucket configuration for join requests.\nIf unset, no individual limits will apply to join requests, but the relay overall limitations will apply.", "label": "", - "type": "FieldMask", - "longType": "google.protobuf.FieldMask", - "fullType": "google.protobuf.FieldMask", + "type": "RelayForwardLimits", + "longType": "RelayForwardLimits", + "fullType": "ttn.lorawan.v3.RelayForwardLimits", "ismap": false, "isoneof": false, "oneofdecl": "", "defaultValue": "" - } - ] - } - ], - "services": [] - }, - { - "name": "ttn/lorawan/v3/end_device_services.proto", - "description": "", - "package": "ttn.lorawan.v3", - "hasEnums": false, - "hasExtensions": false, - "hasMessages": false, - "hasServices": true, - "enums": [], - "extensions": [], - "messages": [], - "services": [ + }, + { + "name": "notifications", + "description": "Bucket configuration for unknown device notifications.\nIf unset, no individual limits will apply to unknown end device notifications, but the relay overall\nlimitations will still apply.", + "label": "", + "type": "RelayForwardLimits", + "longType": "RelayForwardLimits", + "fullType": "ttn.lorawan.v3.RelayForwardLimits", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "uplink_messages", + "description": "Bucket configuration for uplink messages across all served end devices.\nIf unset, no individual limits will apply to uplink messages across all served end devices, but the relay\noverall limitations will still apply.", + "label": "", + "type": "RelayForwardLimits", + "longType": "RelayForwardLimits", + "fullType": "ttn.lorawan.v3.RelayForwardLimits", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "overall", + "description": "Bucket configuration for all relay messages.\nIf unset, no overall limits will apply to the relay, but individual limitations will still apply.", + "label": "", + "type": "RelayForwardLimits", + "longType": "RelayForwardLimits", + "fullType": "ttn.lorawan.v3.RelayForwardLimits", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, { - "name": "EndDeviceBatchRegistry", - "longName": "EndDeviceBatchRegistry", - "fullName": "ttn.lorawan.v3.EndDeviceBatchRegistry", - "description": "The EndDeviceBatchRegistry service, exposed by the Identity Server, is used to manage\nend device registrations in batches.", - "methods": [ + "name": "UplinkForwardingRule", + "longName": "ServingRelayParameters.UplinkForwardingRule", + "fullName": "ttn.lorawan.v3.ServingRelayParameters.UplinkForwardingRule", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "Get", - "description": "Get a batch of end devices with the given identifiers, selecting the fields specified\nin the field mask.\nMore or less fields may be returned, depending on the rights of the caller.\nDevices not found are skipped and no error is returned.", - "requestType": "BatchGetEndDevicesRequest", - "requestLongType": "BatchGetEndDevicesRequest", - "requestFullType": "ttn.lorawan.v3.BatchGetEndDevicesRequest", - "requestStreaming": false, - "responseType": "EndDevices", - "responseLongType": "EndDevices", - "responseFullType": "ttn.lorawan.v3.EndDevices", - "responseStreaming": false, - "options": { - "google.api.http": { - "rules": [ - { - "method": "GET", - "pattern": "/applications/{application_ids.application_id}/devices/batch" - } - ] - } - } + "name": "limits", + "description": "Bucket configuration for the served end device.\nIf unset, no individual limits will apply to the end device, but the relay global limitations will apply.", + "label": "", + "type": "RelayUplinkForwardLimits", + "longType": "RelayUplinkForwardLimits", + "fullType": "ttn.lorawan.v3.RelayUplinkForwardLimits", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" }, { - "name": "Delete", - "description": "Delete a batch of end devices with the given IDs.\n\nThis operation is atomic; either all devices are deleted or none.\nDevices not found are skipped and no error is returned.\nBefore calling this RPC, use the corresponding BatchDelete RPCs\nof NsEndDeviceRegistry, AsEndDeviceRegistry and\noptionally the JsEndDeviceRegistry to delete the end devices.\nIf the devices were claimed on a Join Server, use the BatchUnclaim RPC\nof the DeviceClaimingServer.\nThis is NOT done automatically.", - "requestType": "BatchDeleteEndDevicesRequest", - "requestLongType": "BatchDeleteEndDevicesRequest", - "requestFullType": "ttn.lorawan.v3.BatchDeleteEndDevicesRequest", - "requestStreaming": false, - "responseType": "Empty", - "responseLongType": ".google.protobuf.Empty", - "responseFullType": "google.protobuf.Empty", - "responseStreaming": false, + "name": "last_w_f_cnt", + "description": "Last wake on radio frame counter used by the served end device.", + "label": "", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "device_id", + "description": "End device identifier of the served end device.", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", "options": { - "google.api.http": { - "rules": [ - { - "method": "DELETE", - "pattern": "/applications/{application_ids.application_id}/devices/batch" - } - ] - } + "validate.rules": [ + { + "name": "string.max_len", + "value": 36 + }, + { + "name": "string.pattern", + "value": "^[a-z0-9](?:[-]?[a-z0-9]){2,}$" + } + ] } + }, + { + "name": "session_key_id", + "description": "Session key ID of the session keys used to derive the root relay session key.", + "label": "", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" } ] }, { - "name": "EndDeviceRegistry", - "longName": "EndDeviceRegistry", - "fullName": "ttn.lorawan.v3.EndDeviceRegistry", - "description": "The EndDeviceRegistry service, exposed by the Identity Server, is used to manage\nend device registrations.\n\nAfter registering an end device, it also needs to be registered in\nthe NsEndDeviceRegistry that is exposed by the Network Server,\nthe AsEndDeviceRegistry that is exposed by the Application Server,\nand the JsEndDeviceRegistry that is exposed by the Join Server.\n\nBefore deleting an end device it first needs to be deleted from the\nNsEndDeviceRegistry, the AsEndDeviceRegistry and the JsEndDeviceRegistry.", - "methods": [ + "name": "Session", + "longName": "Session", + "fullName": "ttn.lorawan.v3.Session", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "Create", - "description": "Create a new end device within an application.\n\nAfter registering an end device, it also needs to be registered in\nthe NsEndDeviceRegistry that is exposed by the Network Server,\nthe AsEndDeviceRegistry that is exposed by the Application Server,\nand the JsEndDeviceRegistry that is exposed by the Join Server.", - "requestType": "CreateEndDeviceRequest", - "requestLongType": "CreateEndDeviceRequest", - "requestFullType": "ttn.lorawan.v3.CreateEndDeviceRequest", - "requestStreaming": false, - "responseType": "EndDevice", - "responseLongType": "EndDevice", - "responseFullType": "ttn.lorawan.v3.EndDevice", - "responseStreaming": false, + "name": "dev_addr", + "description": "Device Address, issued by the Network Server or chosen by device manufacturer in case of testing range (beginning with 00-03).\nKnown by Network Server, Application Server and Join Server. Owned by Network Server.", + "label": "", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", "options": { - "google.api.http": { - "rules": [ - { - "method": "POST", - "pattern": "/applications/{end_device.ids.application_ids.application_id}/devices", - "body": "*" - } - ] - } + "validate.rules": [ + { + "name": "bytes.len", + "value": 4 + } + ] } }, { - "name": "Get", - "description": "Get the end device with the given identifiers, selecting the fields specified\nin the field mask.\nMore or less fields may be returned, depending on the rights of the caller.", - "requestType": "GetEndDeviceRequest", - "requestLongType": "GetEndDeviceRequest", - "requestFullType": "ttn.lorawan.v3.GetEndDeviceRequest", - "requestStreaming": false, - "responseType": "EndDevice", - "responseLongType": "EndDevice", - "responseFullType": "ttn.lorawan.v3.EndDevice", - "responseStreaming": false, + "name": "keys", + "description": "", + "label": "", + "type": "SessionKeys", + "longType": "SessionKeys", + "fullType": "ttn.lorawan.v3.SessionKeys", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", "options": { - "google.api.http": { - "rules": [ - { - "method": "GET", - "pattern": "/applications/{end_device_ids.application_ids.application_id}/devices/{end_device_ids.device_id}" - } - ] - } + "validate.rules": [ + { + "name": "message.required", + "value": true + } + ] } }, { - "name": "GetIdentifiersForEUIs", - "description": "Get the identifiers of the end device that has the given EUIs registered.", - "requestType": "GetEndDeviceIdentifiersForEUIsRequest", - "requestLongType": "GetEndDeviceIdentifiersForEUIsRequest", - "requestFullType": "ttn.lorawan.v3.GetEndDeviceIdentifiersForEUIsRequest", - "requestStreaming": false, - "responseType": "EndDeviceIdentifiers", - "responseLongType": "EndDeviceIdentifiers", - "responseFullType": "ttn.lorawan.v3.EndDeviceIdentifiers", - "responseStreaming": false + "name": "last_f_cnt_up", + "description": "Last uplink frame counter value used. Network Server only. Application Server assumes the Network Server checked it.", + "label": "", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" }, { - "name": "List", - "description": "List end devices in the given application.\nSimilar to Get, this selects the fields given by the field mask.\nMore or less fields may be returned, depending on the rights of the caller.", - "requestType": "ListEndDevicesRequest", - "requestLongType": "ListEndDevicesRequest", - "requestFullType": "ttn.lorawan.v3.ListEndDevicesRequest", - "requestStreaming": false, - "responseType": "EndDevices", - "responseLongType": "EndDevices", - "responseFullType": "ttn.lorawan.v3.EndDevices", - "responseStreaming": false, - "options": { - "google.api.http": { - "rules": [ - { - "method": "GET", - "pattern": "/applications/{application_ids.application_id}/devices" - } - ] - } + "name": "last_n_f_cnt_down", + "description": "Last network downlink frame counter value used. Network Server only.", + "label": "", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "last_a_f_cnt_down", + "description": "Last application downlink frame counter value used. Application Server only.", + "label": "", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "last_conf_f_cnt_down", + "description": "Frame counter of the last confirmed downlink message sent. Network Server only.", + "label": "", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "started_at", + "description": "Time when the session started. Network Server only.", + "label": "", + "type": "Timestamp", + "longType": "google.protobuf.Timestamp", + "fullType": "google.protobuf.Timestamp", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "queued_application_downlinks", + "description": "Queued Application downlink messages. Stored in Application Server and Network Server.", + "label": "repeated", + "type": "ApplicationDownlink", + "longType": "ApplicationDownlink", + "fullType": "ttn.lorawan.v3.ApplicationDownlink", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "SetEndDeviceRequest", + "longName": "SetEndDeviceRequest", + "fullName": "ttn.lorawan.v3.SetEndDeviceRequest", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "end_device", + "description": "", + "label": "", + "type": "EndDevice", + "longType": "EndDevice", + "fullType": "ttn.lorawan.v3.EndDevice", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "message.required", + "value": true + } + ] } }, { - "name": "Update", - "description": "Update the end device, changing the fields specified by the field mask to the provided values.", - "requestType": "UpdateEndDeviceRequest", - "requestLongType": "UpdateEndDeviceRequest", - "requestFullType": "ttn.lorawan.v3.UpdateEndDeviceRequest", + "name": "field_mask", + "description": "The names of the end device fields that should be updated.\nSee the API reference for which fields can be set on the different services.", + "label": "", + "type": "FieldMask", + "longType": "google.protobuf.FieldMask", + "fullType": "google.protobuf.FieldMask", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "UpdateEndDeviceRequest", + "longName": "UpdateEndDeviceRequest", + "fullName": "ttn.lorawan.v3.UpdateEndDeviceRequest", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "end_device", + "description": "", + "label": "", + "type": "EndDevice", + "longType": "EndDevice", + "fullType": "ttn.lorawan.v3.EndDevice", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "message.required", + "value": true + } + ] + } + }, + { + "name": "field_mask", + "description": "The names of the end device fields that should be updated.\nSee the API reference for which fields can be set on the different services.", + "label": "", + "type": "FieldMask", + "longType": "google.protobuf.FieldMask", + "fullType": "google.protobuf.FieldMask", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + } + ], + "services": [] + }, + { + "name": "ttn/lorawan/v3/end_device_services.proto", + "description": "", + "package": "ttn.lorawan.v3", + "hasEnums": false, + "hasExtensions": false, + "hasMessages": false, + "hasServices": true, + "enums": [], + "extensions": [], + "messages": [], + "services": [ + { + "name": "EndDeviceBatchRegistry", + "longName": "EndDeviceBatchRegistry", + "fullName": "ttn.lorawan.v3.EndDeviceBatchRegistry", + "description": "The EndDeviceBatchRegistry service, exposed by the Identity Server, is used to manage\nend device registrations in batches.", + "methods": [ + { + "name": "Get", + "description": "Get a batch of end devices with the given identifiers, selecting the fields specified\nin the field mask.\nMore or less fields may be returned, depending on the rights of the caller.\nDevices not found are skipped and no error is returned.", + "requestType": "BatchGetEndDevicesRequest", + "requestLongType": "BatchGetEndDevicesRequest", + "requestFullType": "ttn.lorawan.v3.BatchGetEndDevicesRequest", "requestStreaming": false, - "responseType": "EndDevice", - "responseLongType": "EndDevice", - "responseFullType": "ttn.lorawan.v3.EndDevice", + "responseType": "EndDevices", + "responseLongType": "EndDevices", + "responseFullType": "ttn.lorawan.v3.EndDevices", "responseStreaming": false, "options": { "google.api.http": { "rules": [ { - "method": "PUT", - "pattern": "/applications/{end_device.ids.application_ids.application_id}/devices/{end_device.ids.device_id}", - "body": "*" + "method": "GET", + "pattern": "/applications/{application_ids.application_id}/devices/batch" } ] } } }, - { - "name": "BatchUpdateLastSeen", - "description": "Update the last seen timestamp for a batch of end devices.", - "requestType": "BatchUpdateEndDeviceLastSeenRequest", - "requestLongType": "BatchUpdateEndDeviceLastSeenRequest", - "requestFullType": "ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest", - "requestStreaming": false, - "responseType": "Empty", - "responseLongType": ".google.protobuf.Empty", - "responseFullType": "google.protobuf.Empty", - "responseStreaming": false - }, { "name": "Delete", - "description": "Delete the end device with the given IDs.\n\nBefore deleting an end device it first needs to be deleted from the\nNsEndDeviceRegistry, the AsEndDeviceRegistry and the JsEndDeviceRegistry.\nIn addition, if the device claimed on a Join Server, it also needs to be\nunclaimed via the DeviceClaimingServer so it can be claimed in the future.\nThis is NOT done automatically.", - "requestType": "EndDeviceIdentifiers", - "requestLongType": "EndDeviceIdentifiers", - "requestFullType": "ttn.lorawan.v3.EndDeviceIdentifiers", + "description": "Delete a batch of end devices with the given IDs.\n\nThis operation is atomic; either all devices are deleted or none.\nDevices not found are skipped and no error is returned.\nBefore calling this RPC, use the corresponding BatchDelete RPCs\nof NsEndDeviceRegistry, AsEndDeviceRegistry and\noptionally the JsEndDeviceRegistry to delete the end devices.\nIf the devices were claimed on a Join Server, use the BatchUnclaim RPC\nof the DeviceClaimingServer.\nThis is NOT done automatically.", + "requestType": "BatchDeleteEndDevicesRequest", + "requestLongType": "BatchDeleteEndDevicesRequest", + "requestFullType": "ttn.lorawan.v3.BatchDeleteEndDevicesRequest", "requestStreaming": false, "responseType": "Empty", "responseLongType": ".google.protobuf.Empty", @@ -19440,7 +19747,7 @@ "rules": [ { "method": "DELETE", - "pattern": "/applications/{application_ids.application_id}/devices/{device_id}" + "pattern": "/applications/{application_ids.application_id}/devices/batch" } ] } @@ -19449,44 +19756,188 @@ ] }, { - "name": "EndDeviceTemplateConverter", - "longName": "EndDeviceTemplateConverter", - "fullName": "ttn.lorawan.v3.EndDeviceTemplateConverter", - "description": "", + "name": "EndDeviceRegistry", + "longName": "EndDeviceRegistry", + "fullName": "ttn.lorawan.v3.EndDeviceRegistry", + "description": "The EndDeviceRegistry service, exposed by the Identity Server, is used to manage\nend device registrations.\n\nAfter registering an end device, it also needs to be registered in\nthe NsEndDeviceRegistry that is exposed by the Network Server,\nthe AsEndDeviceRegistry that is exposed by the Application Server,\nand the JsEndDeviceRegistry that is exposed by the Join Server.\n\nBefore deleting an end device it first needs to be deleted from the\nNsEndDeviceRegistry, the AsEndDeviceRegistry and the JsEndDeviceRegistry.", "methods": [ { - "name": "ListFormats", - "description": "Returns the configured formats to convert from.", - "requestType": "Empty", - "requestLongType": ".google.protobuf.Empty", - "requestFullType": "google.protobuf.Empty", + "name": "Create", + "description": "Create a new end device within an application.\n\nAfter registering an end device, it also needs to be registered in\nthe NsEndDeviceRegistry that is exposed by the Network Server,\nthe AsEndDeviceRegistry that is exposed by the Application Server,\nand the JsEndDeviceRegistry that is exposed by the Join Server.", + "requestType": "CreateEndDeviceRequest", + "requestLongType": "CreateEndDeviceRequest", + "requestFullType": "ttn.lorawan.v3.CreateEndDeviceRequest", "requestStreaming": false, - "responseType": "EndDeviceTemplateFormats", - "responseLongType": "EndDeviceTemplateFormats", - "responseFullType": "ttn.lorawan.v3.EndDeviceTemplateFormats", + "responseType": "EndDevice", + "responseLongType": "EndDevice", + "responseFullType": "ttn.lorawan.v3.EndDevice", "responseStreaming": false, "options": { "google.api.http": { "rules": [ { - "method": "GET", - "pattern": "/edtc/formats" + "method": "POST", + "pattern": "/applications/{end_device.ids.application_ids.application_id}/devices", + "body": "*" } ] } } }, { - "name": "Convert", - "description": "Converts the binary data to a stream of end device templates.", - "requestType": "ConvertEndDeviceTemplateRequest", - "requestLongType": "ConvertEndDeviceTemplateRequest", - "requestFullType": "ttn.lorawan.v3.ConvertEndDeviceTemplateRequest", + "name": "Get", + "description": "Get the end device with the given identifiers, selecting the fields specified\nin the field mask.\nMore or less fields may be returned, depending on the rights of the caller.", + "requestType": "GetEndDeviceRequest", + "requestLongType": "GetEndDeviceRequest", + "requestFullType": "ttn.lorawan.v3.GetEndDeviceRequest", "requestStreaming": false, - "responseType": "EndDeviceTemplate", - "responseLongType": "EndDeviceTemplate", - "responseFullType": "ttn.lorawan.v3.EndDeviceTemplate", - "responseStreaming": true, + "responseType": "EndDevice", + "responseLongType": "EndDevice", + "responseFullType": "ttn.lorawan.v3.EndDevice", + "responseStreaming": false, + "options": { + "google.api.http": { + "rules": [ + { + "method": "GET", + "pattern": "/applications/{end_device_ids.application_ids.application_id}/devices/{end_device_ids.device_id}" + } + ] + } + } + }, + { + "name": "GetIdentifiersForEUIs", + "description": "Get the identifiers of the end device that has the given EUIs registered.", + "requestType": "GetEndDeviceIdentifiersForEUIsRequest", + "requestLongType": "GetEndDeviceIdentifiersForEUIsRequest", + "requestFullType": "ttn.lorawan.v3.GetEndDeviceIdentifiersForEUIsRequest", + "requestStreaming": false, + "responseType": "EndDeviceIdentifiers", + "responseLongType": "EndDeviceIdentifiers", + "responseFullType": "ttn.lorawan.v3.EndDeviceIdentifiers", + "responseStreaming": false + }, + { + "name": "List", + "description": "List end devices in the given application.\nSimilar to Get, this selects the fields given by the field mask.\nMore or less fields may be returned, depending on the rights of the caller.", + "requestType": "ListEndDevicesRequest", + "requestLongType": "ListEndDevicesRequest", + "requestFullType": "ttn.lorawan.v3.ListEndDevicesRequest", + "requestStreaming": false, + "responseType": "EndDevices", + "responseLongType": "EndDevices", + "responseFullType": "ttn.lorawan.v3.EndDevices", + "responseStreaming": false, + "options": { + "google.api.http": { + "rules": [ + { + "method": "GET", + "pattern": "/applications/{application_ids.application_id}/devices" + } + ] + } + } + }, + { + "name": "Update", + "description": "Update the end device, changing the fields specified by the field mask to the provided values.", + "requestType": "UpdateEndDeviceRequest", + "requestLongType": "UpdateEndDeviceRequest", + "requestFullType": "ttn.lorawan.v3.UpdateEndDeviceRequest", + "requestStreaming": false, + "responseType": "EndDevice", + "responseLongType": "EndDevice", + "responseFullType": "ttn.lorawan.v3.EndDevice", + "responseStreaming": false, + "options": { + "google.api.http": { + "rules": [ + { + "method": "PUT", + "pattern": "/applications/{end_device.ids.application_ids.application_id}/devices/{end_device.ids.device_id}", + "body": "*" + } + ] + } + } + }, + { + "name": "BatchUpdateLastSeen", + "description": "Update the last seen timestamp for a batch of end devices.", + "requestType": "BatchUpdateEndDeviceLastSeenRequest", + "requestLongType": "BatchUpdateEndDeviceLastSeenRequest", + "requestFullType": "ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest", + "requestStreaming": false, + "responseType": "Empty", + "responseLongType": ".google.protobuf.Empty", + "responseFullType": "google.protobuf.Empty", + "responseStreaming": false + }, + { + "name": "Delete", + "description": "Delete the end device with the given IDs.\n\nBefore deleting an end device it first needs to be deleted from the\nNsEndDeviceRegistry, the AsEndDeviceRegistry and the JsEndDeviceRegistry.\nIn addition, if the device claimed on a Join Server, it also needs to be\nunclaimed via the DeviceClaimingServer so it can be claimed in the future.\nThis is NOT done automatically.", + "requestType": "EndDeviceIdentifiers", + "requestLongType": "EndDeviceIdentifiers", + "requestFullType": "ttn.lorawan.v3.EndDeviceIdentifiers", + "requestStreaming": false, + "responseType": "Empty", + "responseLongType": ".google.protobuf.Empty", + "responseFullType": "google.protobuf.Empty", + "responseStreaming": false, + "options": { + "google.api.http": { + "rules": [ + { + "method": "DELETE", + "pattern": "/applications/{application_ids.application_id}/devices/{device_id}" + } + ] + } + } + } + ] + }, + { + "name": "EndDeviceTemplateConverter", + "longName": "EndDeviceTemplateConverter", + "fullName": "ttn.lorawan.v3.EndDeviceTemplateConverter", + "description": "", + "methods": [ + { + "name": "ListFormats", + "description": "Returns the configured formats to convert from.", + "requestType": "Empty", + "requestLongType": ".google.protobuf.Empty", + "requestFullType": "google.protobuf.Empty", + "requestStreaming": false, + "responseType": "EndDeviceTemplateFormats", + "responseLongType": "EndDeviceTemplateFormats", + "responseFullType": "ttn.lorawan.v3.EndDeviceTemplateFormats", + "responseStreaming": false, + "options": { + "google.api.http": { + "rules": [ + { + "method": "GET", + "pattern": "/edtc/formats" + } + ] + } + } + }, + { + "name": "Convert", + "description": "Converts the binary data to a stream of end device templates.", + "requestType": "ConvertEndDeviceTemplateRequest", + "requestLongType": "ConvertEndDeviceTemplateRequest", + "requestFullType": "ttn.lorawan.v3.ConvertEndDeviceTemplateRequest", + "requestStreaming": false, + "responseType": "EndDeviceTemplate", + "responseLongType": "EndDeviceTemplate", + "responseFullType": "ttn.lorawan.v3.EndDeviceTemplate", + "responseStreaming": true, "options": { "google.api.http": { "rules": [ @@ -28502,6 +28953,41 @@ "name": "CID_DEVICE_MODE", "number": "32", "description": "" + }, + { + "name": "CID_RELAY_CONF", + "number": "64", + "description": "" + }, + { + "name": "CID_RELAY_END_DEVICE_CONF", + "number": "65", + "description": "" + }, + { + "name": "CID_RELAY_FILTER_LIST", + "number": "66", + "description": "" + }, + { + "name": "CID_RELAY_UPDATE_UPLINK_LIST", + "number": "67", + "description": "" + }, + { + "name": "CID_RELAY_CTRL_UPLINK_LIST", + "number": "68", + "description": "" + }, + { + "name": "CID_RELAY_CONFIGURE_FWD_LIMIT", + "number": "69", + "description": "" + }, + { + "name": "CID_RELAY_NOTIFY_NEW_END_DEVICE", + "number": "70", + "description": "" } ] }, @@ -28769,999 +29255,2233 @@ "description": "" }, { - "name": "PHY_V1_0_3_REV_A", - "number": "7", - "description": "" + "name": "PHY_V1_0_3_REV_A", + "number": "7", + "description": "" + }, + { + "name": "RP001_V1_0_3_REV_A", + "number": "7", + "description": "" + }, + { + "name": "RP002_V1_0_0", + "number": "8", + "description": "" + }, + { + "name": "RP002_V1_0_1", + "number": "9", + "description": "" + }, + { + "name": "RP002_V1_0_2", + "number": "10", + "description": "" + }, + { + "name": "RP002_V1_0_3", + "number": "11", + "description": "" + }, + { + "name": "RP002_V1_0_4", + "number": "12", + "description": "" + } + ] + }, + { + "name": "PingSlotPeriod", + "longName": "PingSlotPeriod", + "fullName": "ttn.lorawan.v3.PingSlotPeriod", + "description": "", + "values": [ + { + "name": "PING_EVERY_1S", + "number": "0", + "description": "Every second." + }, + { + "name": "PING_EVERY_2S", + "number": "1", + "description": "Every 2 seconds." + }, + { + "name": "PING_EVERY_4S", + "number": "2", + "description": "Every 4 seconds." + }, + { + "name": "PING_EVERY_8S", + "number": "3", + "description": "Every 8 seconds." + }, + { + "name": "PING_EVERY_16S", + "number": "4", + "description": "Every 16 seconds." + }, + { + "name": "PING_EVERY_32S", + "number": "5", + "description": "Every 32 seconds." + }, + { + "name": "PING_EVERY_64S", + "number": "6", + "description": "Every 64 seconds." + }, + { + "name": "PING_EVERY_128S", + "number": "7", + "description": "Every 128 seconds." + } + ] + }, + { + "name": "RejoinCountExponent", + "longName": "RejoinCountExponent", + "fullName": "ttn.lorawan.v3.RejoinCountExponent", + "description": "", + "values": [ + { + "name": "REJOIN_COUNT_16", + "number": "0", + "description": "" + }, + { + "name": "REJOIN_COUNT_32", + "number": "1", + "description": "" + }, + { + "name": "REJOIN_COUNT_64", + "number": "2", + "description": "" + }, + { + "name": "REJOIN_COUNT_128", + "number": "3", + "description": "" + }, + { + "name": "REJOIN_COUNT_256", + "number": "4", + "description": "" + }, + { + "name": "REJOIN_COUNT_512", + "number": "5", + "description": "" + }, + { + "name": "REJOIN_COUNT_1024", + "number": "6", + "description": "" + }, + { + "name": "REJOIN_COUNT_2048", + "number": "7", + "description": "" + }, + { + "name": "REJOIN_COUNT_4096", + "number": "8", + "description": "" + }, + { + "name": "REJOIN_COUNT_8192", + "number": "9", + "description": "" + }, + { + "name": "REJOIN_COUNT_16384", + "number": "10", + "description": "" + }, + { + "name": "REJOIN_COUNT_32768", + "number": "11", + "description": "" + }, + { + "name": "REJOIN_COUNT_65536", + "number": "12", + "description": "" + }, + { + "name": "REJOIN_COUNT_131072", + "number": "13", + "description": "" + }, + { + "name": "REJOIN_COUNT_262144", + "number": "14", + "description": "" + }, + { + "name": "REJOIN_COUNT_524288", + "number": "15", + "description": "" + } + ] + }, + { + "name": "RejoinPeriodExponent", + "longName": "RejoinPeriodExponent", + "fullName": "ttn.lorawan.v3.RejoinPeriodExponent", + "description": "", + "values": [ + { + "name": "REJOIN_PERIOD_0", + "number": "0", + "description": "Every 32 to 64 seconds." + }, + { + "name": "REJOIN_PERIOD_1", + "number": "1", + "description": "Every 64 to 96 seconds." + }, + { + "name": "REJOIN_PERIOD_2", + "number": "2", + "description": "Every 128 to 160 seconds." + }, + { + "name": "REJOIN_PERIOD_3", + "number": "3", + "description": "Every 256 to 288 seconds." + }, + { + "name": "REJOIN_PERIOD_4", + "number": "4", + "description": "Every 512 to 544 seconds." + }, + { + "name": "REJOIN_PERIOD_5", + "number": "5", + "description": "Every 1024 to 1056 seconds." + }, + { + "name": "REJOIN_PERIOD_6", + "number": "6", + "description": "Every 2048 to 2080 seconds." + }, + { + "name": "REJOIN_PERIOD_7", + "number": "7", + "description": "Every 4096 to 4128 seconds." + } + ] + }, + { + "name": "RejoinRequestType", + "longName": "RejoinRequestType", + "fullName": "ttn.lorawan.v3.RejoinRequestType", + "description": "", + "values": [ + { + "name": "CONTEXT", + "number": "0", + "description": "Resets DevAddr, Session Keys, Frame Counters, Radio Parameters." + }, + { + "name": "SESSION", + "number": "1", + "description": "Equivalent to the initial JoinRequest." + }, + { + "name": "KEYS", + "number": "2", + "description": "Resets DevAddr, Session Keys, Frame Counters, while keeping the Radio Parameters." + } + ] + }, + { + "name": "RejoinTimeExponent", + "longName": "RejoinTimeExponent", + "fullName": "ttn.lorawan.v3.RejoinTimeExponent", + "description": "", + "values": [ + { + "name": "REJOIN_TIME_0", + "number": "0", + "description": "Every ~17.1 minutes." + }, + { + "name": "REJOIN_TIME_1", + "number": "1", + "description": "Every ~34.1 minutes." + }, + { + "name": "REJOIN_TIME_2", + "number": "2", + "description": "Every ~1.1 hours." + }, + { + "name": "REJOIN_TIME_3", + "number": "3", + "description": "Every ~2.3 hours." + }, + { + "name": "REJOIN_TIME_4", + "number": "4", + "description": "Every ~4.6 hours." + }, + { + "name": "REJOIN_TIME_5", + "number": "5", + "description": "Every ~9.1 hours." + }, + { + "name": "REJOIN_TIME_6", + "number": "6", + "description": "Every ~18.2 hours." + }, + { + "name": "REJOIN_TIME_7", + "number": "7", + "description": "Every ~1.5 days." + }, + { + "name": "REJOIN_TIME_8", + "number": "8", + "description": "Every ~3.0 days." + }, + { + "name": "REJOIN_TIME_9", + "number": "9", + "description": "Every ~6.1 days." + }, + { + "name": "REJOIN_TIME_10", + "number": "10", + "description": "Every ~12.1 days." + }, + { + "name": "REJOIN_TIME_11", + "number": "11", + "description": "Every ~3.5 weeks." + }, + { + "name": "REJOIN_TIME_12", + "number": "12", + "description": "Every ~1.6 months." + }, + { + "name": "REJOIN_TIME_13", + "number": "13", + "description": "Every ~3.2 months." + }, + { + "name": "REJOIN_TIME_14", + "number": "14", + "description": "Every ~6.4 months." + }, + { + "name": "REJOIN_TIME_15", + "number": "15", + "description": "Every ~1.1 year." + } + ] + }, + { + "name": "RelayCADPeriodicity", + "longName": "RelayCADPeriodicity", + "fullName": "ttn.lorawan.v3.RelayCADPeriodicity", + "description": "", + "values": [ + { + "name": "RELAY_CAD_PERIODICITY_1_SECOND", + "number": "0", + "description": "" + }, + { + "name": "RELAY_CAD_PERIODICITY_500_MILLISECONDS", + "number": "1", + "description": "" + }, + { + "name": "RELAY_CAD_PERIODICITY_250_MILLISECONDS", + "number": "2", + "description": "" + }, + { + "name": "RELAY_CAD_PERIODICITY_100_MILLISECONDS", + "number": "3", + "description": "" + }, + { + "name": "RELAY_CAD_PERIODICITY_50_MILLISECONDS", + "number": "4", + "description": "" + }, + { + "name": "RELAY_CAD_PERIODICITY_20_MILLISECONDS", + "number": "5", + "description": "sic" + } + ] + }, + { + "name": "RelayCtrlUplinkListAction", + "longName": "RelayCtrlUplinkListAction", + "fullName": "ttn.lorawan.v3.RelayCtrlUplinkListAction", + "description": "", + "values": [ + { + "name": "RELAY_CTRL_UPLINK_LIST_ACTION_READ_W_F_CNT", + "number": "0", + "description": "" + }, + { + "name": "RELAY_CTRL_UPLINK_LIST_ACTION_REMOVE_TRUSTED_END_DEVICE", + "number": "1", + "description": "" + } + ] + }, + { + "name": "RelayLimitBucketSize", + "longName": "RelayLimitBucketSize", + "fullName": "ttn.lorawan.v3.RelayLimitBucketSize", + "description": "", + "values": [ + { + "name": "RELAY_LIMIT_BUCKET_SIZE_1", + "number": "0", + "description": "" + }, + { + "name": "RELAY_LIMIT_BUCKET_SIZE_2", + "number": "1", + "description": "" + }, + { + "name": "RELAY_LIMIT_BUCKET_SIZE_4", + "number": "2", + "description": "" + }, + { + "name": "RELAY_LIMIT_BUCKET_SIZE_12", + "number": "3", + "description": "sic" + } + ] + }, + { + "name": "RelayResetLimitCounter", + "longName": "RelayResetLimitCounter", + "fullName": "ttn.lorawan.v3.RelayResetLimitCounter", + "description": "", + "values": [ + { + "name": "RELAY_RESET_LIMIT_COUNTER_ZERO", + "number": "0", + "description": "" + }, + { + "name": "RELAY_RESET_LIMIT_COUNTER_RELOAD_RATE", + "number": "1", + "description": "" + }, + { + "name": "RELAY_RESET_LIMIT_COUNTER_MAX_VALUE", + "number": "2", + "description": "" + }, + { + "name": "RELAY_RESET_LIMIT_COUNTER_NO_RESET", + "number": "3", + "description": "" + } + ] + }, + { + "name": "RelaySecondChAckOffset", + "longName": "RelaySecondChAckOffset", + "fullName": "ttn.lorawan.v3.RelaySecondChAckOffset", + "description": "", + "values": [ + { + "name": "RELAY_SECOND_CH_ACK_OFFSET_0", + "number": "0", + "description": "0 kHz" + }, + { + "name": "RELAY_SECOND_CH_ACK_OFFSET_200", + "number": "1", + "description": "200 kHz" + }, + { + "name": "RELAY_SECOND_CH_ACK_OFFSET_400", + "number": "2", + "description": "400 kHz" + }, + { + "name": "RELAY_SECOND_CH_ACK_OFFSET_800", + "number": "3", + "description": "800 kHz" + }, + { + "name": "RELAY_SECOND_CH_ACK_OFFSET_1600", + "number": "4", + "description": "1.6 MHz" + }, + { + "name": "RELAY_SECOND_CH_ACK_OFFSET_3200", + "number": "5", + "description": "3.2 MHz" + } + ] + }, + { + "name": "RelaySmartEnableLevel", + "longName": "RelaySmartEnableLevel", + "fullName": "ttn.lorawan.v3.RelaySmartEnableLevel", + "description": "", + "values": [ + { + "name": "RELAY_SMART_ENABLE_LEVEL_8", + "number": "0", + "description": "" + }, + { + "name": "RELAY_SMART_ENABLE_LEVEL_16", + "number": "1", + "description": "" + }, + { + "name": "RELAY_SMART_ENABLE_LEVEL_32", + "number": "2", + "description": "" + }, + { + "name": "RELAY_SMART_ENABLE_LEVEL_64", + "number": "3", + "description": "" + } + ] + }, + { + "name": "RelayWORChannel", + "longName": "RelayWORChannel", + "fullName": "ttn.lorawan.v3.RelayWORChannel", + "description": "", + "values": [ + { + "name": "RELAY_WOR_CHANNEL_DEFAULT", + "number": "0", + "description": "" + }, + { + "name": "RELAY_WOR_CHANNEL_SECONDARY", + "number": "1", + "description": "" + } + ] + }, + { + "name": "RxDelay", + "longName": "RxDelay", + "fullName": "ttn.lorawan.v3.RxDelay", + "description": "", + "values": [ + { + "name": "RX_DELAY_0", + "number": "0", + "description": "1 second." + }, + { + "name": "RX_DELAY_1", + "number": "1", + "description": "1 second." + }, + { + "name": "RX_DELAY_2", + "number": "2", + "description": "2 seconds." + }, + { + "name": "RX_DELAY_3", + "number": "3", + "description": "3 seconds." + }, + { + "name": "RX_DELAY_4", + "number": "4", + "description": "4 seconds." + }, + { + "name": "RX_DELAY_5", + "number": "5", + "description": "5 seconds." + }, + { + "name": "RX_DELAY_6", + "number": "6", + "description": "6 seconds." + }, + { + "name": "RX_DELAY_7", + "number": "7", + "description": "7 seconds." + }, + { + "name": "RX_DELAY_8", + "number": "8", + "description": "8 seconds." + }, + { + "name": "RX_DELAY_9", + "number": "9", + "description": "9 seconds." + }, + { + "name": "RX_DELAY_10", + "number": "10", + "description": "10 seconds." + }, + { + "name": "RX_DELAY_11", + "number": "11", + "description": "11 seconds." + }, + { + "name": "RX_DELAY_12", + "number": "12", + "description": "12 seconds." + }, + { + "name": "RX_DELAY_13", + "number": "13", + "description": "13 seconds." + }, + { + "name": "RX_DELAY_14", + "number": "14", + "description": "14 seconds." + }, + { + "name": "RX_DELAY_15", + "number": "15", + "description": "15 seconds." + } + ] + }, + { + "name": "TxSchedulePriority", + "longName": "TxSchedulePriority", + "fullName": "ttn.lorawan.v3.TxSchedulePriority", + "description": "", + "values": [ + { + "name": "LOWEST", + "number": "0", + "description": "" + }, + { + "name": "LOW", + "number": "1", + "description": "" + }, + { + "name": "BELOW_NORMAL", + "number": "2", + "description": "" + }, + { + "name": "NORMAL", + "number": "3", + "description": "" + }, + { + "name": "ABOVE_NORMAL", + "number": "4", + "description": "" + }, + { + "name": "HIGH", + "number": "5", + "description": "" + }, + { + "name": "HIGHEST", + "number": "6", + "description": "" + } + ] + } + ], + "extensions": [], + "messages": [ + { + "name": "ADRAckDelayExponentValue", + "longName": "ADRAckDelayExponentValue", + "fullName": "ttn.lorawan.v3.ADRAckDelayExponentValue", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "value", + "description": "", + "label": "", + "type": "ADRAckDelayExponent", + "longType": "ADRAckDelayExponent", + "fullType": "ttn.lorawan.v3.ADRAckDelayExponent", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } + } + ] + }, + { + "name": "ADRAckLimitExponentValue", + "longName": "ADRAckLimitExponentValue", + "fullName": "ttn.lorawan.v3.ADRAckLimitExponentValue", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "value", + "description": "", + "label": "", + "type": "ADRAckLimitExponent", + "longType": "ADRAckLimitExponent", + "fullType": "ttn.lorawan.v3.ADRAckLimitExponent", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } + } + ] + }, + { + "name": "AggregatedDutyCycleValue", + "longName": "AggregatedDutyCycleValue", + "fullName": "ttn.lorawan.v3.AggregatedDutyCycleValue", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "value", + "description": "", + "label": "", + "type": "AggregatedDutyCycle", + "longType": "AggregatedDutyCycle", + "fullType": "ttn.lorawan.v3.AggregatedDutyCycle", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } + } + ] + }, + { + "name": "CFList", + "longName": "CFList", + "fullName": "ttn.lorawan.v3.CFList", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "type", + "description": "", + "label": "", + "type": "CFListType", + "longType": "CFListType", + "fullType": "ttn.lorawan.v3.CFListType", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } + }, + { + "name": "freq", + "description": "Frequencies to be broadcasted, in hecto-Hz.\nThese values are broadcasted as 24 bits unsigned integers.\nThis field should not contain default values.", + "label": "repeated", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "ch_masks", + "description": "ChMasks controlling the channels to be used.\nLength of this field must be equal to the amount of uplink channels\ndefined by the selected frequency plan.", + "label": "repeated", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "ClassBCGatewayIdentifiers", + "longName": "ClassBCGatewayIdentifiers", + "fullName": "ttn.lorawan.v3.ClassBCGatewayIdentifiers", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "gateway_ids", + "description": "", + "label": "", + "type": "GatewayIdentifiers", + "longType": "GatewayIdentifiers", + "fullType": "ttn.lorawan.v3.GatewayIdentifiers", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "message.required", + "value": true + } + ] + } + }, + { + "name": "antenna_index", + "description": "", + "label": "", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "group_index", + "description": "", + "label": "", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "DLSettings", + "longName": "DLSettings", + "fullName": "ttn.lorawan.v3.DLSettings", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "rx1_dr_offset", + "description": "", + "label": "", + "type": "DataRateOffset", + "longType": "DataRateOffset", + "fullType": "ttn.lorawan.v3.DataRateOffset", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } + }, + { + "name": "rx2_dr", + "description": "", + "label": "", + "type": "DataRateIndex", + "longType": "DataRateIndex", + "fullType": "ttn.lorawan.v3.DataRateIndex", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } + }, + { + "name": "opt_neg", + "description": "OptNeg is set if Network Server implements LoRaWAN 1.1 or greater.", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "DataRate", + "longName": "DataRate", + "fullName": "ttn.lorawan.v3.DataRate", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": true, + "extensions": [], + "fields": [ + { + "name": "lora", + "description": "", + "label": "", + "type": "LoRaDataRate", + "longType": "LoRaDataRate", + "fullType": "ttn.lorawan.v3.LoRaDataRate", + "ismap": false, + "isoneof": true, + "oneofdecl": "modulation", + "defaultValue": "" + }, + { + "name": "fsk", + "description": "", + "label": "", + "type": "FSKDataRate", + "longType": "FSKDataRate", + "fullType": "ttn.lorawan.v3.FSKDataRate", + "ismap": false, + "isoneof": true, + "oneofdecl": "modulation", + "defaultValue": "" + }, + { + "name": "lrfhss", + "description": "", + "label": "", + "type": "LRFHSSDataRate", + "longType": "LRFHSSDataRate", + "fullType": "ttn.lorawan.v3.LRFHSSDataRate", + "ismap": false, + "isoneof": true, + "oneofdecl": "modulation", + "defaultValue": "" + } + ] + }, + { + "name": "DataRateIndexValue", + "longName": "DataRateIndexValue", + "fullName": "ttn.lorawan.v3.DataRateIndexValue", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "value", + "description": "", + "label": "", + "type": "DataRateIndex", + "longType": "DataRateIndex", + "fullType": "ttn.lorawan.v3.DataRateIndex", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } + } + ] + }, + { + "name": "DataRateOffsetValue", + "longName": "DataRateOffsetValue", + "fullName": "ttn.lorawan.v3.DataRateOffsetValue", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "value", + "description": "", + "label": "", + "type": "DataRateOffset", + "longType": "DataRateOffset", + "fullType": "ttn.lorawan.v3.DataRateOffset", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } + } + ] + }, + { + "name": "DeviceEIRPValue", + "longName": "DeviceEIRPValue", + "fullName": "ttn.lorawan.v3.DeviceEIRPValue", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "value", + "description": "", + "label": "", + "type": "DeviceEIRP", + "longType": "DeviceEIRP", + "fullType": "ttn.lorawan.v3.DeviceEIRP", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } + } + ] + }, + { + "name": "DownlinkPath", + "longName": "DownlinkPath", + "fullName": "ttn.lorawan.v3.DownlinkPath", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": true, + "extensions": [], + "fields": [ + { + "name": "uplink_token", + "description": "", + "label": "", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", + "ismap": false, + "isoneof": true, + "oneofdecl": "path", + "defaultValue": "" }, { - "name": "RP001_V1_0_3_REV_A", - "number": "7", - "description": "" - }, + "name": "fixed", + "description": "", + "label": "", + "type": "GatewayAntennaIdentifiers", + "longType": "GatewayAntennaIdentifiers", + "fullType": "ttn.lorawan.v3.GatewayAntennaIdentifiers", + "ismap": false, + "isoneof": true, + "oneofdecl": "path", + "defaultValue": "" + } + ] + }, + { + "name": "FCtrl", + "longName": "FCtrl", + "fullName": "ttn.lorawan.v3.FCtrl", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "RP002_V1_0_0", - "number": "8", - "description": "" + "name": "adr", + "description": "", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" }, { - "name": "RP002_V1_0_1", - "number": "9", - "description": "" + "name": "adr_ack_req", + "description": "Only on uplink.", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" }, { - "name": "RP002_V1_0_2", - "number": "10", - "description": "" + "name": "ack", + "description": "", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" }, { - "name": "RP002_V1_0_3", - "number": "11", - "description": "" + "name": "f_pending", + "description": "Only on downlink.", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" }, { - "name": "RP002_V1_0_4", - "number": "12", - "description": "" + "name": "class_b", + "description": "Only on uplink.", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" } ] }, { - "name": "PingSlotPeriod", - "longName": "PingSlotPeriod", - "fullName": "ttn.lorawan.v3.PingSlotPeriod", + "name": "FHDR", + "longName": "FHDR", + "fullName": "ttn.lorawan.v3.FHDR", "description": "", - "values": [ - { - "name": "PING_EVERY_1S", - "number": "0", - "description": "Every second." - }, - { - "name": "PING_EVERY_2S", - "number": "1", - "description": "Every 2 seconds." - }, + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "PING_EVERY_4S", - "number": "2", - "description": "Every 4 seconds." + "name": "dev_addr", + "description": "", + "label": "", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "bytes.len", + "value": 4 + } + ] + } }, { - "name": "PING_EVERY_8S", - "number": "3", - "description": "Every 8 seconds." + "name": "f_ctrl", + "description": "", + "label": "", + "type": "FCtrl", + "longType": "FCtrl", + "fullType": "ttn.lorawan.v3.FCtrl", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "message.required", + "value": true + } + ] + } }, { - "name": "PING_EVERY_16S", - "number": "4", - "description": "Every 16 seconds." + "name": "f_cnt", + "description": "", + "label": "", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "uint32.lte", + "value": 65535 + } + ] + } }, { - "name": "PING_EVERY_32S", - "number": "5", - "description": "Every 32 seconds." - }, + "name": "f_opts", + "description": "", + "label": "", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "bytes.max_len", + "value": 15 + } + ] + } + } + ] + }, + { + "name": "FSKDataRate", + "longName": "FSKDataRate", + "fullName": "ttn.lorawan.v3.FSKDataRate", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "PING_EVERY_64S", - "number": "6", - "description": "Every 64 seconds." - }, + "name": "bit_rate", + "description": "Bit rate (bps).", + "label": "", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "FrequencyValue", + "longName": "FrequencyValue", + "fullName": "ttn.lorawan.v3.FrequencyValue", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "PING_EVERY_128S", - "number": "7", - "description": "Every 128 seconds." + "name": "value", + "description": "", + "label": "", + "type": "uint64", + "longType": "uint64", + "fullType": "uint64", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "uint64.gte", + "value": 100000 + } + ] + } } ] }, { - "name": "RejoinCountExponent", - "longName": "RejoinCountExponent", - "fullName": "ttn.lorawan.v3.RejoinCountExponent", + "name": "GatewayAntennaIdentifiers", + "longName": "GatewayAntennaIdentifiers", + "fullName": "ttn.lorawan.v3.GatewayAntennaIdentifiers", "description": "", - "values": [ - { - "name": "REJOIN_COUNT_16", - "number": "0", - "description": "" - }, - { - "name": "REJOIN_COUNT_32", - "number": "1", - "description": "" - }, - { - "name": "REJOIN_COUNT_64", - "number": "2", - "description": "" - }, - { - "name": "REJOIN_COUNT_128", - "number": "3", - "description": "" - }, - { - "name": "REJOIN_COUNT_256", - "number": "4", - "description": "" - }, - { - "name": "REJOIN_COUNT_512", - "number": "5", - "description": "" - }, - { - "name": "REJOIN_COUNT_1024", - "number": "6", - "description": "" - }, - { - "name": "REJOIN_COUNT_2048", - "number": "7", - "description": "" - }, - { - "name": "REJOIN_COUNT_4096", - "number": "8", - "description": "" - }, - { - "name": "REJOIN_COUNT_8192", - "number": "9", - "description": "" - }, - { - "name": "REJOIN_COUNT_16384", - "number": "10", - "description": "" - }, - { - "name": "REJOIN_COUNT_32768", - "number": "11", - "description": "" - }, - { - "name": "REJOIN_COUNT_65536", - "number": "12", - "description": "" - }, - { - "name": "REJOIN_COUNT_131072", - "number": "13", - "description": "" - }, + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "REJOIN_COUNT_262144", - "number": "14", - "description": "" + "name": "gateway_ids", + "description": "", + "label": "", + "type": "GatewayIdentifiers", + "longType": "GatewayIdentifiers", + "fullType": "ttn.lorawan.v3.GatewayIdentifiers", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "message.required", + "value": true + } + ] + } }, { - "name": "REJOIN_COUNT_524288", - "number": "15", - "description": "" + "name": "antenna_index", + "description": "", + "label": "", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" } ] }, { - "name": "RejoinPeriodExponent", - "longName": "RejoinPeriodExponent", - "fullName": "ttn.lorawan.v3.RejoinPeriodExponent", + "name": "JoinAcceptPayload", + "longName": "JoinAcceptPayload", + "fullName": "ttn.lorawan.v3.JoinAcceptPayload", "description": "", - "values": [ - { - "name": "REJOIN_PERIOD_0", - "number": "0", - "description": "Every 32 to 64 seconds." - }, + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "REJOIN_PERIOD_1", - "number": "1", - "description": "Every 64 to 96 seconds." + "name": "encrypted", + "description": "", + "label": "", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" }, { - "name": "REJOIN_PERIOD_2", - "number": "2", - "description": "Every 128 to 160 seconds." + "name": "join_nonce", + "description": "", + "label": "", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "bytes.len", + "value": 3 + } + ] + } }, { - "name": "REJOIN_PERIOD_3", - "number": "3", - "description": "Every 256 to 288 seconds." + "name": "net_id", + "description": "", + "label": "", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "bytes.len", + "value": 3 + } + ] + } }, { - "name": "REJOIN_PERIOD_4", - "number": "4", - "description": "Every 512 to 544 seconds." + "name": "dev_addr", + "description": "", + "label": "", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "bytes.len", + "value": 4 + } + ] + } }, { - "name": "REJOIN_PERIOD_5", - "number": "5", - "description": "Every 1024 to 1056 seconds." + "name": "dl_settings", + "description": "", + "label": "", + "type": "DLSettings", + "longType": "DLSettings", + "fullType": "ttn.lorawan.v3.DLSettings", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "message.required", + "value": true + } + ] + } }, { - "name": "REJOIN_PERIOD_6", - "number": "6", - "description": "Every 2048 to 2080 seconds." + "name": "rx_delay", + "description": "", + "label": "", + "type": "RxDelay", + "longType": "RxDelay", + "fullType": "ttn.lorawan.v3.RxDelay", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } }, { - "name": "REJOIN_PERIOD_7", - "number": "7", - "description": "Every 4096 to 4128 seconds." + "name": "cf_list", + "description": "", + "label": "", + "type": "CFList", + "longType": "CFList", + "fullType": "ttn.lorawan.v3.CFList", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" } ] }, { - "name": "RejoinRequestType", - "longName": "RejoinRequestType", - "fullName": "ttn.lorawan.v3.RejoinRequestType", + "name": "JoinRequestPayload", + "longName": "JoinRequestPayload", + "fullName": "ttn.lorawan.v3.JoinRequestPayload", "description": "", - "values": [ + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "CONTEXT", - "number": "0", - "description": "Resets DevAddr, Session Keys, Frame Counters, Radio Parameters." + "name": "join_eui", + "description": "", + "label": "", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "bytes.len", + "value": 8 + } + ] + } }, { - "name": "SESSION", - "number": "1", - "description": "Equivalent to the initial JoinRequest." + "name": "dev_eui", + "description": "", + "label": "", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "bytes.len", + "value": 8 + } + ] + } }, { - "name": "KEYS", - "number": "2", - "description": "Resets DevAddr, Session Keys, Frame Counters, while keeping the Radio Parameters." + "name": "dev_nonce", + "description": "", + "label": "", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "bytes.len", + "value": 2 + } + ] + } } ] }, { - "name": "RejoinTimeExponent", - "longName": "RejoinTimeExponent", - "fullName": "ttn.lorawan.v3.RejoinTimeExponent", + "name": "LRFHSSDataRate", + "longName": "LRFHSSDataRate", + "fullName": "ttn.lorawan.v3.LRFHSSDataRate", "description": "", - "values": [ - { - "name": "REJOIN_TIME_0", - "number": "0", - "description": "Every ~17.1 minutes." - }, - { - "name": "REJOIN_TIME_1", - "number": "1", - "description": "Every ~34.1 minutes." - }, - { - "name": "REJOIN_TIME_2", - "number": "2", - "description": "Every ~1.1 hours." - }, - { - "name": "REJOIN_TIME_3", - "number": "3", - "description": "Every ~2.3 hours." - }, - { - "name": "REJOIN_TIME_4", - "number": "4", - "description": "Every ~4.6 hours." - }, - { - "name": "REJOIN_TIME_5", - "number": "5", - "description": "Every ~9.1 hours." - }, - { - "name": "REJOIN_TIME_6", - "number": "6", - "description": "Every ~18.2 hours." - }, - { - "name": "REJOIN_TIME_7", - "number": "7", - "description": "Every ~1.5 days." - }, - { - "name": "REJOIN_TIME_8", - "number": "8", - "description": "Every ~3.0 days." - }, - { - "name": "REJOIN_TIME_9", - "number": "9", - "description": "Every ~6.1 days." - }, + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "REJOIN_TIME_10", - "number": "10", - "description": "Every ~12.1 days." + "name": "modulation_type", + "description": "", + "label": "", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" }, { - "name": "REJOIN_TIME_11", - "number": "11", - "description": "Every ~3.5 weeks." + "name": "operating_channel_width", + "description": "Operating Channel Width (Hz).", + "label": "", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" }, { - "name": "REJOIN_TIME_12", - "number": "12", - "description": "Every ~1.6 months." - }, + "name": "coding_rate", + "description": "", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "LoRaDataRate", + "longName": "LoRaDataRate", + "fullName": "ttn.lorawan.v3.LoRaDataRate", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "REJOIN_TIME_13", - "number": "13", - "description": "Every ~3.2 months." + "name": "bandwidth", + "description": "Bandwidth (Hz).", + "label": "", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" }, { - "name": "REJOIN_TIME_14", - "number": "14", - "description": "Every ~6.4 months." + "name": "spreading_factor", + "description": "", + "label": "", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" }, { - "name": "REJOIN_TIME_15", - "number": "15", - "description": "Every ~1.1 year." + "name": "coding_rate", + "description": "", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" } ] }, { - "name": "RxDelay", - "longName": "RxDelay", - "fullName": "ttn.lorawan.v3.RxDelay", + "name": "MACCommand", + "longName": "MACCommand", + "fullName": "ttn.lorawan.v3.MACCommand", "description": "", - "values": [ - { - "name": "RX_DELAY_0", - "number": "0", - "description": "1 second." - }, - { - "name": "RX_DELAY_1", - "number": "1", - "description": "1 second." - }, - { - "name": "RX_DELAY_2", - "number": "2", - "description": "2 seconds." - }, + "hasExtensions": false, + "hasFields": true, + "hasOneofs": true, + "extensions": [], + "fields": [ { - "name": "RX_DELAY_3", - "number": "3", - "description": "3 seconds." + "name": "cid", + "description": "", + "label": "", + "type": "MACCommandIdentifier", + "longType": "MACCommandIdentifier", + "fullType": "ttn.lorawan.v3.MACCommandIdentifier", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + }, + { + "name": "enum.not_in", + "value": [ + 0 + ] + } + ] + } }, { - "name": "RX_DELAY_4", - "number": "4", - "description": "4 seconds." + "name": "raw_payload", + "description": "", + "label": "", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", + "ismap": false, + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" }, { - "name": "RX_DELAY_5", - "number": "5", - "description": "5 seconds." + "name": "reset_ind", + "description": "", + "label": "", + "type": "ResetInd", + "longType": "MACCommand.ResetInd", + "fullType": "ttn.lorawan.v3.MACCommand.ResetInd", + "ismap": false, + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" }, { - "name": "RX_DELAY_6", - "number": "6", - "description": "6 seconds." + "name": "reset_conf", + "description": "", + "label": "", + "type": "ResetConf", + "longType": "MACCommand.ResetConf", + "fullType": "ttn.lorawan.v3.MACCommand.ResetConf", + "ismap": false, + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" }, { - "name": "RX_DELAY_7", - "number": "7", - "description": "7 seconds." + "name": "link_check_ans", + "description": "", + "label": "", + "type": "LinkCheckAns", + "longType": "MACCommand.LinkCheckAns", + "fullType": "ttn.lorawan.v3.MACCommand.LinkCheckAns", + "ismap": false, + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" }, { - "name": "RX_DELAY_8", - "number": "8", - "description": "8 seconds." + "name": "link_adr_req", + "description": "", + "label": "", + "type": "LinkADRReq", + "longType": "MACCommand.LinkADRReq", + "fullType": "ttn.lorawan.v3.MACCommand.LinkADRReq", + "ismap": false, + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" }, { - "name": "RX_DELAY_9", - "number": "9", - "description": "9 seconds." + "name": "link_adr_ans", + "description": "", + "label": "", + "type": "LinkADRAns", + "longType": "MACCommand.LinkADRAns", + "fullType": "ttn.lorawan.v3.MACCommand.LinkADRAns", + "ismap": false, + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" }, { - "name": "RX_DELAY_10", - "number": "10", - "description": "10 seconds." + "name": "duty_cycle_req", + "description": "", + "label": "", + "type": "DutyCycleReq", + "longType": "MACCommand.DutyCycleReq", + "fullType": "ttn.lorawan.v3.MACCommand.DutyCycleReq", + "ismap": false, + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" }, { - "name": "RX_DELAY_11", - "number": "11", - "description": "11 seconds." + "name": "rx_param_setup_req", + "description": "", + "label": "", + "type": "RxParamSetupReq", + "longType": "MACCommand.RxParamSetupReq", + "fullType": "ttn.lorawan.v3.MACCommand.RxParamSetupReq", + "ismap": false, + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" }, { - "name": "RX_DELAY_12", - "number": "12", - "description": "12 seconds." + "name": "rx_param_setup_ans", + "description": "", + "label": "", + "type": "RxParamSetupAns", + "longType": "MACCommand.RxParamSetupAns", + "fullType": "ttn.lorawan.v3.MACCommand.RxParamSetupAns", + "ismap": false, + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" }, { - "name": "RX_DELAY_13", - "number": "13", - "description": "13 seconds." + "name": "dev_status_ans", + "description": "", + "label": "", + "type": "DevStatusAns", + "longType": "MACCommand.DevStatusAns", + "fullType": "ttn.lorawan.v3.MACCommand.DevStatusAns", + "ismap": false, + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" }, { - "name": "RX_DELAY_14", - "number": "14", - "description": "14 seconds." + "name": "new_channel_req", + "description": "", + "label": "", + "type": "NewChannelReq", + "longType": "MACCommand.NewChannelReq", + "fullType": "ttn.lorawan.v3.MACCommand.NewChannelReq", + "ismap": false, + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" }, { - "name": "RX_DELAY_15", - "number": "15", - "description": "15 seconds." - } - ] - }, - { - "name": "TxSchedulePriority", - "longName": "TxSchedulePriority", - "fullName": "ttn.lorawan.v3.TxSchedulePriority", - "description": "", - "values": [ - { - "name": "LOWEST", - "number": "0", - "description": "" + "name": "new_channel_ans", + "description": "", + "label": "", + "type": "NewChannelAns", + "longType": "MACCommand.NewChannelAns", + "fullType": "ttn.lorawan.v3.MACCommand.NewChannelAns", + "ismap": false, + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" }, { - "name": "LOW", - "number": "1", - "description": "" + "name": "dl_channel_req", + "description": "", + "label": "", + "type": "DLChannelReq", + "longType": "MACCommand.DLChannelReq", + "fullType": "ttn.lorawan.v3.MACCommand.DLChannelReq", + "ismap": false, + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" }, { - "name": "BELOW_NORMAL", - "number": "2", - "description": "" + "name": "dl_channel_ans", + "description": "", + "label": "", + "type": "DLChannelAns", + "longType": "MACCommand.DLChannelAns", + "fullType": "ttn.lorawan.v3.MACCommand.DLChannelAns", + "ismap": false, + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" }, { - "name": "NORMAL", - "number": "3", - "description": "" + "name": "rx_timing_setup_req", + "description": "", + "label": "", + "type": "RxTimingSetupReq", + "longType": "MACCommand.RxTimingSetupReq", + "fullType": "ttn.lorawan.v3.MACCommand.RxTimingSetupReq", + "ismap": false, + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" }, { - "name": "ABOVE_NORMAL", - "number": "4", - "description": "" + "name": "tx_param_setup_req", + "description": "", + "label": "", + "type": "TxParamSetupReq", + "longType": "MACCommand.TxParamSetupReq", + "fullType": "ttn.lorawan.v3.MACCommand.TxParamSetupReq", + "ismap": false, + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" }, { - "name": "HIGH", - "number": "5", - "description": "" + "name": "rekey_ind", + "description": "", + "label": "", + "type": "RekeyInd", + "longType": "MACCommand.RekeyInd", + "fullType": "ttn.lorawan.v3.MACCommand.RekeyInd", + "ismap": false, + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" }, { - "name": "HIGHEST", - "number": "6", - "description": "" - } - ] - } - ], - "extensions": [], - "messages": [ - { - "name": "ADRAckDelayExponentValue", - "longName": "ADRAckDelayExponentValue", - "fullName": "ttn.lorawan.v3.ADRAckDelayExponentValue", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ - { - "name": "value", + "name": "rekey_conf", "description": "", "label": "", - "type": "ADRAckDelayExponent", - "longType": "ADRAckDelayExponent", - "fullType": "ttn.lorawan.v3.ADRAckDelayExponent", + "type": "RekeyConf", + "longType": "MACCommand.RekeyConf", + "fullType": "ttn.lorawan.v3.MACCommand.RekeyConf", "ismap": false, - "isoneof": false, - "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "enum.defined_only", - "value": true - } - ] - } - } - ] - }, - { - "name": "ADRAckLimitExponentValue", - "longName": "ADRAckLimitExponentValue", - "fullName": "ttn.lorawan.v3.ADRAckLimitExponentValue", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" + }, { - "name": "value", + "name": "adr_param_setup_req", "description": "", "label": "", - "type": "ADRAckLimitExponent", - "longType": "ADRAckLimitExponent", - "fullType": "ttn.lorawan.v3.ADRAckLimitExponent", + "type": "ADRParamSetupReq", + "longType": "MACCommand.ADRParamSetupReq", + "fullType": "ttn.lorawan.v3.MACCommand.ADRParamSetupReq", "ismap": false, - "isoneof": false, - "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "enum.defined_only", - "value": true - } - ] - } - } - ] - }, - { - "name": "AggregatedDutyCycleValue", - "longName": "AggregatedDutyCycleValue", - "fullName": "ttn.lorawan.v3.AggregatedDutyCycleValue", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" + }, { - "name": "value", + "name": "device_time_ans", "description": "", "label": "", - "type": "AggregatedDutyCycle", - "longType": "AggregatedDutyCycle", - "fullType": "ttn.lorawan.v3.AggregatedDutyCycle", + "type": "DeviceTimeAns", + "longType": "MACCommand.DeviceTimeAns", + "fullType": "ttn.lorawan.v3.MACCommand.DeviceTimeAns", "ismap": false, - "isoneof": false, - "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "enum.defined_only", - "value": true - } - ] - } - } - ] - }, - { - "name": "CFList", - "longName": "CFList", - "fullName": "ttn.lorawan.v3.CFList", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" + }, { - "name": "type", + "name": "force_rejoin_req", "description": "", "label": "", - "type": "CFListType", - "longType": "CFListType", - "fullType": "ttn.lorawan.v3.CFListType", + "type": "ForceRejoinReq", + "longType": "MACCommand.ForceRejoinReq", + "fullType": "ttn.lorawan.v3.MACCommand.ForceRejoinReq", "ismap": false, - "isoneof": false, - "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "enum.defined_only", - "value": true - } - ] - } + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" }, { - "name": "freq", - "description": "Frequencies to be broadcasted, in hecto-Hz.\nThese values are broadcasted as 24 bits unsigned integers.\nThis field should not contain default values.", - "label": "repeated", - "type": "uint32", - "longType": "uint32", - "fullType": "uint32", + "name": "rejoin_param_setup_req", + "description": "", + "label": "", + "type": "RejoinParamSetupReq", + "longType": "MACCommand.RejoinParamSetupReq", + "fullType": "ttn.lorawan.v3.MACCommand.RejoinParamSetupReq", "ismap": false, - "isoneof": false, - "oneofdecl": "", + "isoneof": true, + "oneofdecl": "payload", "defaultValue": "" }, { - "name": "ch_masks", - "description": "ChMasks controlling the channels to be used.\nLength of this field must be equal to the amount of uplink channels\ndefined by the selected frequency plan.", - "label": "repeated", - "type": "bool", - "longType": "bool", - "fullType": "bool", + "name": "rejoin_param_setup_ans", + "description": "", + "label": "", + "type": "RejoinParamSetupAns", + "longType": "MACCommand.RejoinParamSetupAns", + "fullType": "ttn.lorawan.v3.MACCommand.RejoinParamSetupAns", "ismap": false, - "isoneof": false, - "oneofdecl": "", + "isoneof": true, + "oneofdecl": "payload", "defaultValue": "" - } - ] - }, - { - "name": "ClassBCGatewayIdentifiers", - "longName": "ClassBCGatewayIdentifiers", - "fullName": "ttn.lorawan.v3.ClassBCGatewayIdentifiers", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ + }, { - "name": "gateway_ids", + "name": "ping_slot_info_req", "description": "", "label": "", - "type": "GatewayIdentifiers", - "longType": "GatewayIdentifiers", - "fullType": "ttn.lorawan.v3.GatewayIdentifiers", - "ismap": false, - "isoneof": false, - "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "message.required", - "value": true - } - ] - } + "type": "PingSlotInfoReq", + "longType": "MACCommand.PingSlotInfoReq", + "fullType": "ttn.lorawan.v3.MACCommand.PingSlotInfoReq", + "ismap": false, + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" }, { - "name": "antenna_index", + "name": "ping_slot_channel_req", "description": "", "label": "", - "type": "uint32", - "longType": "uint32", - "fullType": "uint32", + "type": "PingSlotChannelReq", + "longType": "MACCommand.PingSlotChannelReq", + "fullType": "ttn.lorawan.v3.MACCommand.PingSlotChannelReq", "ismap": false, - "isoneof": false, - "oneofdecl": "", + "isoneof": true, + "oneofdecl": "payload", "defaultValue": "" }, { - "name": "group_index", + "name": "ping_slot_channel_ans", "description": "", "label": "", - "type": "uint32", - "longType": "uint32", - "fullType": "uint32", + "type": "PingSlotChannelAns", + "longType": "MACCommand.PingSlotChannelAns", + "fullType": "ttn.lorawan.v3.MACCommand.PingSlotChannelAns", "ismap": false, - "isoneof": false, - "oneofdecl": "", + "isoneof": true, + "oneofdecl": "payload", "defaultValue": "" - } - ] - }, - { - "name": "DLSettings", - "longName": "DLSettings", - "fullName": "ttn.lorawan.v3.DLSettings", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ + }, { - "name": "rx1_dr_offset", + "name": "beacon_timing_ans", "description": "", "label": "", - "type": "DataRateOffset", - "longType": "DataRateOffset", - "fullType": "ttn.lorawan.v3.DataRateOffset", + "type": "BeaconTimingAns", + "longType": "MACCommand.BeaconTimingAns", + "fullType": "ttn.lorawan.v3.MACCommand.BeaconTimingAns", "ismap": false, - "isoneof": false, - "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "enum.defined_only", - "value": true - } - ] - } + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" }, { - "name": "rx2_dr", + "name": "beacon_freq_req", "description": "", "label": "", - "type": "DataRateIndex", - "longType": "DataRateIndex", - "fullType": "ttn.lorawan.v3.DataRateIndex", + "type": "BeaconFreqReq", + "longType": "MACCommand.BeaconFreqReq", + "fullType": "ttn.lorawan.v3.MACCommand.BeaconFreqReq", "ismap": false, - "isoneof": false, - "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "enum.defined_only", - "value": true - } - ] - } + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" }, { - "name": "opt_neg", - "description": "OptNeg is set if Network Server implements LoRaWAN 1.1 or greater.", + "name": "beacon_freq_ans", + "description": "", "label": "", - "type": "bool", - "longType": "bool", - "fullType": "bool", + "type": "BeaconFreqAns", + "longType": "MACCommand.BeaconFreqAns", + "fullType": "ttn.lorawan.v3.MACCommand.BeaconFreqAns", "ismap": false, - "isoneof": false, - "oneofdecl": "", + "isoneof": true, + "oneofdecl": "payload", "defaultValue": "" - } - ] - }, - { - "name": "DataRate", - "longName": "DataRate", - "fullName": "ttn.lorawan.v3.DataRate", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": true, - "extensions": [], - "fields": [ + }, { - "name": "lora", + "name": "device_mode_ind", "description": "", "label": "", - "type": "LoRaDataRate", - "longType": "LoRaDataRate", - "fullType": "ttn.lorawan.v3.LoRaDataRate", + "type": "DeviceModeInd", + "longType": "MACCommand.DeviceModeInd", + "fullType": "ttn.lorawan.v3.MACCommand.DeviceModeInd", "ismap": false, "isoneof": true, - "oneofdecl": "modulation", + "oneofdecl": "payload", "defaultValue": "" }, { - "name": "fsk", + "name": "device_mode_conf", "description": "", "label": "", - "type": "FSKDataRate", - "longType": "FSKDataRate", - "fullType": "ttn.lorawan.v3.FSKDataRate", + "type": "DeviceModeConf", + "longType": "MACCommand.DeviceModeConf", + "fullType": "ttn.lorawan.v3.MACCommand.DeviceModeConf", "ismap": false, "isoneof": true, - "oneofdecl": "modulation", + "oneofdecl": "payload", "defaultValue": "" }, { - "name": "lrfhss", + "name": "relay_conf_req", "description": "", "label": "", - "type": "LRFHSSDataRate", - "longType": "LRFHSSDataRate", - "fullType": "ttn.lorawan.v3.LRFHSSDataRate", + "type": "RelayConfReq", + "longType": "MACCommand.RelayConfReq", + "fullType": "ttn.lorawan.v3.MACCommand.RelayConfReq", "ismap": false, "isoneof": true, - "oneofdecl": "modulation", + "oneofdecl": "payload", "defaultValue": "" - } - ] - }, - { - "name": "DataRateIndexValue", - "longName": "DataRateIndexValue", - "fullName": "ttn.lorawan.v3.DataRateIndexValue", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ + }, { - "name": "value", + "name": "relay_conf_ans", "description": "", "label": "", - "type": "DataRateIndex", - "longType": "DataRateIndex", - "fullType": "ttn.lorawan.v3.DataRateIndex", + "type": "RelayConfAns", + "longType": "MACCommand.RelayConfAns", + "fullType": "ttn.lorawan.v3.MACCommand.RelayConfAns", "ismap": false, - "isoneof": false, - "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "enum.defined_only", - "value": true - } - ] - } - } - ] - }, - { - "name": "DataRateOffsetValue", - "longName": "DataRateOffsetValue", - "fullName": "ttn.lorawan.v3.DataRateOffsetValue", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" + }, { - "name": "value", + "name": "relay_end_device_conf_req", "description": "", "label": "", - "type": "DataRateOffset", - "longType": "DataRateOffset", - "fullType": "ttn.lorawan.v3.DataRateOffset", + "type": "RelayEndDeviceConfReq", + "longType": "MACCommand.RelayEndDeviceConfReq", + "fullType": "ttn.lorawan.v3.MACCommand.RelayEndDeviceConfReq", "ismap": false, - "isoneof": false, - "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "enum.defined_only", - "value": true - } - ] - } - } - ] - }, - { - "name": "DeviceEIRPValue", - "longName": "DeviceEIRPValue", - "fullName": "ttn.lorawan.v3.DeviceEIRPValue", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" + }, { - "name": "value", + "name": "relay_end_device_conf_ans", "description": "", "label": "", - "type": "DeviceEIRP", - "longType": "DeviceEIRP", - "fullType": "ttn.lorawan.v3.DeviceEIRP", + "type": "RelayEndDeviceConfAns", + "longType": "MACCommand.RelayEndDeviceConfAns", + "fullType": "ttn.lorawan.v3.MACCommand.RelayEndDeviceConfAns", "ismap": false, - "isoneof": false, - "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "enum.defined_only", - "value": true - } - ] - } - } - ] - }, - { - "name": "DownlinkPath", - "longName": "DownlinkPath", - "fullName": "ttn.lorawan.v3.DownlinkPath", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": true, - "extensions": [], - "fields": [ + "isoneof": true, + "oneofdecl": "payload", + "defaultValue": "" + }, { - "name": "uplink_token", - "description": "", - "label": "", - "type": "bytes", - "longType": "bytes", - "fullType": "bytes", + "name": "relay_update_uplink_list_req", + "description": "", + "label": "", + "type": "RelayUpdateUplinkListReq", + "longType": "MACCommand.RelayUpdateUplinkListReq", + "fullType": "ttn.lorawan.v3.MACCommand.RelayUpdateUplinkListReq", "ismap": false, "isoneof": true, - "oneofdecl": "path", + "oneofdecl": "payload", "defaultValue": "" }, { - "name": "fixed", + "name": "relay_update_uplink_list_ans", "description": "", "label": "", - "type": "GatewayAntennaIdentifiers", - "longType": "GatewayAntennaIdentifiers", - "fullType": "ttn.lorawan.v3.GatewayAntennaIdentifiers", + "type": "RelayUpdateUplinkListAns", + "longType": "MACCommand.RelayUpdateUplinkListAns", + "fullType": "ttn.lorawan.v3.MACCommand.RelayUpdateUplinkListAns", "ismap": false, "isoneof": true, - "oneofdecl": "path", + "oneofdecl": "payload", "defaultValue": "" - } - ] - }, - { - "name": "FCtrl", - "longName": "FCtrl", - "fullName": "ttn.lorawan.v3.FCtrl", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ + }, { - "name": "adr", + "name": "relay_ctrl_uplink_list_req", "description": "", "label": "", - "type": "bool", - "longType": "bool", - "fullType": "bool", + "type": "RelayCtrlUplinkListReq", + "longType": "MACCommand.RelayCtrlUplinkListReq", + "fullType": "ttn.lorawan.v3.MACCommand.RelayCtrlUplinkListReq", "ismap": false, - "isoneof": false, - "oneofdecl": "", + "isoneof": true, + "oneofdecl": "payload", "defaultValue": "" }, { - "name": "adr_ack_req", - "description": "Only on uplink.", + "name": "relay_ctrl_uplink_list_ans", + "description": "", "label": "", - "type": "bool", - "longType": "bool", - "fullType": "bool", + "type": "RelayCtrlUplinkListAns", + "longType": "MACCommand.RelayCtrlUplinkListAns", + "fullType": "ttn.lorawan.v3.MACCommand.RelayCtrlUplinkListAns", "ismap": false, - "isoneof": false, - "oneofdecl": "", + "isoneof": true, + "oneofdecl": "payload", "defaultValue": "" }, { - "name": "ack", + "name": "relay_configure_fwd_limit_req", "description": "", "label": "", - "type": "bool", - "longType": "bool", - "fullType": "bool", + "type": "RelayConfigureFwdLimitReq", + "longType": "MACCommand.RelayConfigureFwdLimitReq", + "fullType": "ttn.lorawan.v3.MACCommand.RelayConfigureFwdLimitReq", "ismap": false, - "isoneof": false, - "oneofdecl": "", + "isoneof": true, + "oneofdecl": "payload", "defaultValue": "" }, { - "name": "f_pending", - "description": "Only on downlink.", + "name": "relay_configure_fwd_limit_ans", + "description": "", "label": "", - "type": "bool", - "longType": "bool", - "fullType": "bool", + "type": "RelayConfigureFwdLimitAns", + "longType": "MACCommand.RelayConfigureFwdLimitAns", + "fullType": "ttn.lorawan.v3.MACCommand.RelayConfigureFwdLimitAns", "ismap": false, - "isoneof": false, - "oneofdecl": "", + "isoneof": true, + "oneofdecl": "payload", "defaultValue": "" }, { - "name": "class_b", - "description": "Only on uplink.", + "name": "relay_notify_new_end_device_req", + "description": "", "label": "", - "type": "bool", - "longType": "bool", - "fullType": "bool", + "type": "RelayNotifyNewEndDeviceReq", + "longType": "MACCommand.RelayNotifyNewEndDeviceReq", + "fullType": "ttn.lorawan.v3.MACCommand.RelayNotifyNewEndDeviceReq", "ismap": false, - "isoneof": false, - "oneofdecl": "", + "isoneof": true, + "oneofdecl": "payload", "defaultValue": "" } ] }, { - "name": "FHDR", - "longName": "FHDR", - "fullName": "ttn.lorawan.v3.FHDR", + "name": "ADRParamSetupReq", + "longName": "MACCommand.ADRParamSetupReq", + "fullName": "ttn.lorawan.v3.MACCommand.ADRParamSetupReq", "description": "", "hasExtensions": false, "hasFields": true, @@ -29769,32 +31489,12 @@ "extensions": [], "fields": [ { - "name": "dev_addr", - "description": "", - "label": "", - "type": "bytes", - "longType": "bytes", - "fullType": "bytes", - "ismap": false, - "isoneof": false, - "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "bytes.len", - "value": 4 - } - ] - } - }, - { - "name": "f_ctrl", - "description": "", + "name": "adr_ack_limit_exponent", + "description": "Exponent e that configures the ADR_ACK_LIMIT = 2^e messages.", "label": "", - "type": "FCtrl", - "longType": "FCtrl", - "fullType": "ttn.lorawan.v3.FCtrl", + "type": "ADRAckLimitExponent", + "longType": "ADRAckLimitExponent", + "fullType": "ttn.lorawan.v3.ADRAckLimitExponent", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -29802,39 +31502,19 @@ "options": { "validate.rules": [ { - "name": "message.required", + "name": "enum.defined_only", "value": true } ] } }, { - "name": "f_cnt", - "description": "", - "label": "", - "type": "uint32", - "longType": "uint32", - "fullType": "uint32", - "ismap": false, - "isoneof": false, - "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "uint32.lte", - "value": 65535 - } - ] - } - }, - { - "name": "f_opts", - "description": "", + "name": "adr_ack_delay_exponent", + "description": "Exponent e that configures the ADR_ACK_DELAY = 2^e messages.", "label": "", - "type": "bytes", - "longType": "bytes", - "fullType": "bytes", + "type": "ADRAckDelayExponent", + "longType": "ADRAckDelayExponent", + "fullType": "ttn.lorawan.v3.ADRAckDelayExponent", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -29842,8 +31522,8 @@ "options": { "validate.rules": [ { - "name": "bytes.max_len", - "value": 15 + "name": "enum.defined_only", + "value": true } ] } @@ -29851,9 +31531,9 @@ ] }, { - "name": "FSKDataRate", - "longName": "FSKDataRate", - "fullName": "ttn.lorawan.v3.FSKDataRate", + "name": "BeaconFreqAns", + "longName": "MACCommand.BeaconFreqAns", + "fullName": "ttn.lorawan.v3.MACCommand.BeaconFreqAns", "description": "", "hasExtensions": false, "hasFields": true, @@ -29861,12 +31541,12 @@ "extensions": [], "fields": [ { - "name": "bit_rate", - "description": "Bit rate (bps).", + "name": "frequency_ack", + "description": "", "label": "", - "type": "uint32", - "longType": "uint32", - "fullType": "uint32", + "type": "bool", + "longType": "bool", + "fullType": "bool", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -29875,9 +31555,9 @@ ] }, { - "name": "FrequencyValue", - "longName": "FrequencyValue", - "fullName": "ttn.lorawan.v3.FrequencyValue", + "name": "BeaconFreqReq", + "longName": "MACCommand.BeaconFreqReq", + "fullName": "ttn.lorawan.v3.MACCommand.BeaconFreqReq", "description": "", "hasExtensions": false, "hasFields": true, @@ -29885,8 +31565,8 @@ "extensions": [], "fields": [ { - "name": "value", - "description": "", + "name": "frequency", + "description": "Frequency of the Class B beacons (Hz).", "label": "", "type": "uint64", "longType": "uint64", @@ -29897,6 +31577,10 @@ "defaultValue": "", "options": { "validate.rules": [ + { + "name": "uint64.lte", + "value": 0 + }, { "name": "uint64.gte", "value": 100000 @@ -29907,9 +31591,9 @@ ] }, { - "name": "GatewayAntennaIdentifiers", - "longName": "GatewayAntennaIdentifiers", - "fullName": "ttn.lorawan.v3.GatewayAntennaIdentifiers", + "name": "BeaconTimingAns", + "longName": "MACCommand.BeaconTimingAns", + "fullName": "ttn.lorawan.v3.MACCommand.BeaconTimingAns", "description": "", "hasExtensions": false, "hasFields": true, @@ -29917,12 +31601,12 @@ "extensions": [], "fields": [ { - "name": "gateway_ids", - "description": "", + "name": "delay", + "description": "(uint16) See LoRaWAN specification.", "label": "", - "type": "GatewayIdentifiers", - "longType": "GatewayIdentifiers", - "fullType": "ttn.lorawan.v3.GatewayIdentifiers", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -29930,14 +31614,14 @@ "options": { "validate.rules": [ { - "name": "message.required", - "value": true + "name": "uint32.lte", + "value": 65535 } ] } }, { - "name": "antenna_index", + "name": "channel_index", "description": "", "label": "", "type": "uint32", @@ -29946,14 +31630,22 @@ "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "" + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "uint32.lte", + "value": 255 + } + ] + } } ] }, { - "name": "JoinAcceptPayload", - "longName": "JoinAcceptPayload", - "fullName": "ttn.lorawan.v3.JoinAcceptPayload", + "name": "DLChannelAns", + "longName": "MACCommand.DLChannelAns", + "fullName": "ttn.lorawan.v3.MACCommand.DLChannelAns", "description": "", "hasExtensions": false, "hasFields": true, @@ -29961,24 +31653,48 @@ "extensions": [], "fields": [ { - "name": "encrypted", + "name": "channel_index_ack", "description": "", "label": "", - "type": "bytes", - "longType": "bytes", - "fullType": "bytes", + "type": "bool", + "longType": "bool", + "fullType": "bool", "ismap": false, "isoneof": false, "oneofdecl": "", "defaultValue": "" }, { - "name": "join_nonce", + "name": "frequency_ack", "description": "", "label": "", - "type": "bytes", - "longType": "bytes", - "fullType": "bytes", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "DLChannelReq", + "longName": "MACCommand.DLChannelReq", + "fullName": "ttn.lorawan.v3.MACCommand.DLChannelReq", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "channel_index", + "description": "", + "label": "", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -29986,19 +31702,19 @@ "options": { "validate.rules": [ { - "name": "bytes.len", - "value": 3 + "name": "uint32.lte", + "value": 255 } ] } }, { - "name": "net_id", - "description": "", + "name": "frequency", + "description": "Downlink channel frequency (Hz).", "label": "", - "type": "bytes", - "longType": "bytes", - "fullType": "bytes", + "type": "uint64", + "longType": "uint64", + "fullType": "uint64", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -30006,19 +31722,31 @@ "options": { "validate.rules": [ { - "name": "bytes.len", - "value": 3 + "name": "uint64.gte", + "value": 100000 } ] } - }, + } + ] + }, + { + "name": "DevStatusAns", + "longName": "MACCommand.DevStatusAns", + "fullName": "ttn.lorawan.v3.MACCommand.DevStatusAns", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "dev_addr", - "description": "", + "name": "battery", + "description": "Device battery status.\n0 indicates that the device is connected to an external power source.\n1..254 indicates a battery level.\n255 indicates that the device was not able to measure the battery level.", "label": "", - "type": "bytes", - "longType": "bytes", - "fullType": "bytes", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -30026,19 +31754,19 @@ "options": { "validate.rules": [ { - "name": "bytes.len", - "value": 4 + "name": "uint32.lte", + "value": 255 } ] } }, { - "name": "dl_settings", - "description": "", + "name": "margin", + "description": "SNR of the last downlink (dB; [-32, +31]).", "label": "", - "type": "DLSettings", - "longType": "DLSettings", - "fullType": "ttn.lorawan.v3.DLSettings", + "type": "int32", + "longType": "int32", + "fullType": "int32", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -30046,19 +31774,35 @@ "options": { "validate.rules": [ { - "name": "message.required", - "value": true + "name": "int32.lte", + "value": 31 + }, + { + "name": "int32.gte", + "value": -32 } ] } - }, + } + ] + }, + { + "name": "DeviceModeConf", + "longName": "MACCommand.DeviceModeConf", + "fullName": "ttn.lorawan.v3.MACCommand.DeviceModeConf", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "rx_delay", + "name": "class", "description": "", "label": "", - "type": "RxDelay", - "longType": "RxDelay", - "fullType": "ttn.lorawan.v3.RxDelay", + "type": "Class", + "longType": "Class", + "fullType": "ttn.lorawan.v3.Class", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -30071,25 +31815,13 @@ } ] } - }, - { - "name": "cf_list", - "description": "", - "label": "", - "type": "CFList", - "longType": "CFList", - "fullType": "ttn.lorawan.v3.CFList", - "ismap": false, - "isoneof": false, - "oneofdecl": "", - "defaultValue": "" } ] }, { - "name": "JoinRequestPayload", - "longName": "JoinRequestPayload", - "fullName": "ttn.lorawan.v3.JoinRequestPayload", + "name": "DeviceModeInd", + "longName": "MACCommand.DeviceModeInd", + "fullName": "ttn.lorawan.v3.MACCommand.DeviceModeInd", "description": "", "hasExtensions": false, "hasFields": true, @@ -30097,12 +31829,12 @@ "extensions": [], "fields": [ { - "name": "join_eui", + "name": "class", "description": "", "label": "", - "type": "bytes", - "longType": "bytes", - "fullType": "bytes", + "type": "Class", + "longType": "Class", + "fullType": "ttn.lorawan.v3.Class", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -30110,19 +31842,31 @@ "options": { "validate.rules": [ { - "name": "bytes.len", - "value": 8 + "name": "enum.defined_only", + "value": true } ] } - }, + } + ] + }, + { + "name": "DeviceTimeAns", + "longName": "MACCommand.DeviceTimeAns", + "fullName": "ttn.lorawan.v3.MACCommand.DeviceTimeAns", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "dev_eui", + "name": "time", "description": "", "label": "", - "type": "bytes", - "longType": "bytes", - "fullType": "bytes", + "type": "Timestamp", + "longType": "google.protobuf.Timestamp", + "fullType": "google.protobuf.Timestamp", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -30130,19 +31874,31 @@ "options": { "validate.rules": [ { - "name": "bytes.len", - "value": 8 + "name": "timestamp.required", + "value": true } ] } - }, + } + ] + }, + { + "name": "DutyCycleReq", + "longName": "MACCommand.DutyCycleReq", + "fullName": "ttn.lorawan.v3.MACCommand.DutyCycleReq", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "dev_nonce", + "name": "max_duty_cycle", "description": "", "label": "", - "type": "bytes", - "longType": "bytes", - "fullType": "bytes", + "type": "AggregatedDutyCycle", + "longType": "AggregatedDutyCycle", + "fullType": "ttn.lorawan.v3.AggregatedDutyCycle", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -30150,8 +31906,8 @@ "options": { "validate.rules": [ { - "name": "bytes.len", - "value": 2 + "name": "enum.defined_only", + "value": true } ] } @@ -30159,9 +31915,9 @@ ] }, { - "name": "LRFHSSDataRate", - "longName": "LRFHSSDataRate", - "fullName": "ttn.lorawan.v3.LRFHSSDataRate", + "name": "ForceRejoinReq", + "longName": "MACCommand.ForceRejoinReq", + "fullName": "ttn.lorawan.v3.MACCommand.ForceRejoinReq", "description": "", "hasExtensions": false, "hasFields": true, @@ -30169,20 +31925,48 @@ "extensions": [], "fields": [ { - "name": "modulation_type", + "name": "rejoin_type", "description": "", "label": "", - "type": "uint32", - "longType": "uint32", - "fullType": "uint32", + "type": "RejoinRequestType", + "longType": "RejoinRequestType", + "fullType": "ttn.lorawan.v3.RejoinRequestType", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "" + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } }, { - "name": "operating_channel_width", - "description": "Operating Channel Width (Hz).", + "name": "data_rate_index", + "description": "", + "label": "", + "type": "DataRateIndex", + "longType": "DataRateIndex", + "fullType": "ttn.lorawan.v3.DataRateIndex", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } + }, + { + "name": "max_retries", + "description": "", "label": "", "type": "uint32", "longType": "uint32", @@ -30190,26 +31974,42 @@ "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "" + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "uint32.lte", + "value": 7 + } + ] + } }, { - "name": "coding_rate", - "description": "", + "name": "period_exponent", + "description": "Exponent e that configures the rejoin period = 32 * 2^e + rand(0,32) seconds.", "label": "", - "type": "string", - "longType": "string", - "fullType": "string", + "type": "RejoinPeriodExponent", + "longType": "RejoinPeriodExponent", + "fullType": "ttn.lorawan.v3.RejoinPeriodExponent", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "" + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } } ] }, { - "name": "LoRaDataRate", - "longName": "LoRaDataRate", - "fullName": "ttn.lorawan.v3.LoRaDataRate", + "name": "LinkADRAns", + "longName": "MACCommand.LinkADRAns", + "fullName": "ttn.lorawan.v3.MACCommand.LinkADRAns", "description": "", "hasExtensions": false, "hasFields": true, @@ -30217,36 +32017,36 @@ "extensions": [], "fields": [ { - "name": "bandwidth", - "description": "Bandwidth (Hz).", + "name": "channel_mask_ack", + "description": "", "label": "", - "type": "uint32", - "longType": "uint32", - "fullType": "uint32", + "type": "bool", + "longType": "bool", + "fullType": "bool", "ismap": false, "isoneof": false, "oneofdecl": "", "defaultValue": "" }, { - "name": "spreading_factor", + "name": "data_rate_index_ack", "description": "", "label": "", - "type": "uint32", - "longType": "uint32", - "fullType": "uint32", + "type": "bool", + "longType": "bool", + "fullType": "bool", "ismap": false, "isoneof": false, "oneofdecl": "", "defaultValue": "" }, { - "name": "coding_rate", + "name": "tx_power_index_ack", "description": "", "label": "", - "type": "string", - "longType": "string", - "fullType": "string", + "type": "bool", + "longType": "bool", + "fullType": "bool", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -30255,22 +32055,22 @@ ] }, { - "name": "MACCommand", - "longName": "MACCommand", - "fullName": "ttn.lorawan.v3.MACCommand", + "name": "LinkADRReq", + "longName": "MACCommand.LinkADRReq", + "fullName": "ttn.lorawan.v3.MACCommand.LinkADRReq", "description": "", "hasExtensions": false, "hasFields": true, - "hasOneofs": true, + "hasOneofs": false, "extensions": [], "fields": [ { - "name": "cid", + "name": "data_rate_index", "description": "", "label": "", - "type": "MACCommandIdentifier", - "longType": "MACCommandIdentifier", - "fullType": "ttn.lorawan.v3.MACCommandIdentifier", + "type": "DataRateIndex", + "longType": "DataRateIndex", + "fullType": "ttn.lorawan.v3.DataRateIndex", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -30280,394 +32080,480 @@ { "name": "enum.defined_only", "value": true - }, - { - "name": "enum.not_in", - "value": [ - 0 - ] } ] } }, { - "name": "raw_payload", - "description": "", - "label": "", - "type": "bytes", - "longType": "bytes", - "fullType": "bytes", - "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" - }, - { - "name": "reset_ind", - "description": "", - "label": "", - "type": "ResetInd", - "longType": "MACCommand.ResetInd", - "fullType": "ttn.lorawan.v3.MACCommand.ResetInd", - "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" - }, - { - "name": "reset_conf", - "description": "", - "label": "", - "type": "ResetConf", - "longType": "MACCommand.ResetConf", - "fullType": "ttn.lorawan.v3.MACCommand.ResetConf", - "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" - }, - { - "name": "link_check_ans", - "description": "", - "label": "", - "type": "LinkCheckAns", - "longType": "MACCommand.LinkCheckAns", - "fullType": "ttn.lorawan.v3.MACCommand.LinkCheckAns", - "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" - }, - { - "name": "link_adr_req", - "description": "", - "label": "", - "type": "LinkADRReq", - "longType": "MACCommand.LinkADRReq", - "fullType": "ttn.lorawan.v3.MACCommand.LinkADRReq", - "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" - }, - { - "name": "link_adr_ans", - "description": "", - "label": "", - "type": "LinkADRAns", - "longType": "MACCommand.LinkADRAns", - "fullType": "ttn.lorawan.v3.MACCommand.LinkADRAns", - "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" - }, - { - "name": "duty_cycle_req", - "description": "", - "label": "", - "type": "DutyCycleReq", - "longType": "MACCommand.DutyCycleReq", - "fullType": "ttn.lorawan.v3.MACCommand.DutyCycleReq", - "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" - }, - { - "name": "rx_param_setup_req", - "description": "", - "label": "", - "type": "RxParamSetupReq", - "longType": "MACCommand.RxParamSetupReq", - "fullType": "ttn.lorawan.v3.MACCommand.RxParamSetupReq", - "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" - }, - { - "name": "rx_param_setup_ans", - "description": "", - "label": "", - "type": "RxParamSetupAns", - "longType": "MACCommand.RxParamSetupAns", - "fullType": "ttn.lorawan.v3.MACCommand.RxParamSetupAns", - "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" - }, - { - "name": "dev_status_ans", - "description": "", - "label": "", - "type": "DevStatusAns", - "longType": "MACCommand.DevStatusAns", - "fullType": "ttn.lorawan.v3.MACCommand.DevStatusAns", - "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" - }, - { - "name": "new_channel_req", - "description": "", - "label": "", - "type": "NewChannelReq", - "longType": "MACCommand.NewChannelReq", - "fullType": "ttn.lorawan.v3.MACCommand.NewChannelReq", - "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" - }, - { - "name": "new_channel_ans", + "name": "tx_power_index", "description": "", "label": "", - "type": "NewChannelAns", - "longType": "MACCommand.NewChannelAns", - "fullType": "ttn.lorawan.v3.MACCommand.NewChannelAns", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "uint32.lte", + "value": 15 + } + ] + } }, { - "name": "dl_channel_req", + "name": "channel_mask", "description": "", - "label": "", - "type": "DLChannelReq", - "longType": "MACCommand.DLChannelReq", - "fullType": "ttn.lorawan.v3.MACCommand.DLChannelReq", + "label": "repeated", + "type": "bool", + "longType": "bool", + "fullType": "bool", "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "repeated.max_items", + "value": 16 + } + ] + } }, { - "name": "dl_channel_ans", + "name": "channel_mask_control", "description": "", "label": "", - "type": "DLChannelAns", - "longType": "MACCommand.DLChannelAns", - "fullType": "ttn.lorawan.v3.MACCommand.DLChannelAns", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "uint32.lte", + "value": 7 + } + ] + } }, { - "name": "rx_timing_setup_req", + "name": "nb_trans", "description": "", "label": "", - "type": "RxTimingSetupReq", - "longType": "MACCommand.RxTimingSetupReq", - "fullType": "ttn.lorawan.v3.MACCommand.RxTimingSetupReq", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" - }, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "uint32.lte", + "value": 15 + } + ] + } + } + ] + }, + { + "name": "LinkCheckAns", + "longName": "MACCommand.LinkCheckAns", + "fullName": "ttn.lorawan.v3.MACCommand.LinkCheckAns", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "tx_param_setup_req", - "description": "", + "name": "margin", + "description": "Indicates the link margin in dB of the received LinkCheckReq, relative to the demodulation floor.", "label": "", - "type": "TxParamSetupReq", - "longType": "MACCommand.TxParamSetupReq", - "fullType": "ttn.lorawan.v3.MACCommand.TxParamSetupReq", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "uint32.lte", + "value": 254 + } + ] + } }, { - "name": "rekey_ind", + "name": "gateway_count", "description": "", "label": "", - "type": "RekeyInd", - "longType": "MACCommand.RekeyInd", - "fullType": "ttn.lorawan.v3.MACCommand.RekeyInd", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" - }, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "uint32.lte", + "value": 255 + } + ] + } + } + ] + }, + { + "name": "NewChannelAns", + "longName": "MACCommand.NewChannelAns", + "fullName": "ttn.lorawan.v3.MACCommand.NewChannelAns", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "rekey_conf", + "name": "frequency_ack", "description": "", "label": "", - "type": "RekeyConf", - "longType": "MACCommand.RekeyConf", - "fullType": "ttn.lorawan.v3.MACCommand.RekeyConf", + "type": "bool", + "longType": "bool", + "fullType": "bool", "ismap": false, - "isoneof": true, - "oneofdecl": "payload", + "isoneof": false, + "oneofdecl": "", "defaultValue": "" }, { - "name": "adr_param_setup_req", + "name": "data_rate_ack", "description": "", "label": "", - "type": "ADRParamSetupReq", - "longType": "MACCommand.ADRParamSetupReq", - "fullType": "ttn.lorawan.v3.MACCommand.ADRParamSetupReq", + "type": "bool", + "longType": "bool", + "fullType": "bool", "ismap": false, - "isoneof": true, - "oneofdecl": "payload", + "isoneof": false, + "oneofdecl": "", "defaultValue": "" - }, + } + ] + }, + { + "name": "NewChannelReq", + "longName": "MACCommand.NewChannelReq", + "fullName": "ttn.lorawan.v3.MACCommand.NewChannelReq", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "device_time_ans", + "name": "channel_index", "description": "", "label": "", - "type": "DeviceTimeAns", - "longType": "MACCommand.DeviceTimeAns", - "fullType": "ttn.lorawan.v3.MACCommand.DeviceTimeAns", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "uint32.lte", + "value": 255 + } + ] + } }, { - "name": "force_rejoin_req", - "description": "", + "name": "frequency", + "description": "Channel frequency (Hz).", "label": "", - "type": "ForceRejoinReq", - "longType": "MACCommand.ForceRejoinReq", - "fullType": "ttn.lorawan.v3.MACCommand.ForceRejoinReq", + "type": "uint64", + "longType": "uint64", + "fullType": "uint64", "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "uint64.lte", + "value": 0 + }, + { + "name": "uint64.gte", + "value": 100000 + } + ] + } }, { - "name": "rejoin_param_setup_req", + "name": "min_data_rate_index", "description": "", "label": "", - "type": "RejoinParamSetupReq", - "longType": "MACCommand.RejoinParamSetupReq", - "fullType": "ttn.lorawan.v3.MACCommand.RejoinParamSetupReq", + "type": "DataRateIndex", + "longType": "DataRateIndex", + "fullType": "ttn.lorawan.v3.DataRateIndex", "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } }, { - "name": "rejoin_param_setup_ans", + "name": "max_data_rate_index", "description": "", "label": "", - "type": "RejoinParamSetupAns", - "longType": "MACCommand.RejoinParamSetupAns", - "fullType": "ttn.lorawan.v3.MACCommand.RejoinParamSetupAns", + "type": "DataRateIndex", + "longType": "DataRateIndex", + "fullType": "ttn.lorawan.v3.DataRateIndex", "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" - }, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } + } + ] + }, + { + "name": "PingSlotChannelAns", + "longName": "MACCommand.PingSlotChannelAns", + "fullName": "ttn.lorawan.v3.MACCommand.PingSlotChannelAns", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "ping_slot_info_req", + "name": "frequency_ack", "description": "", "label": "", - "type": "PingSlotInfoReq", - "longType": "MACCommand.PingSlotInfoReq", - "fullType": "ttn.lorawan.v3.MACCommand.PingSlotInfoReq", + "type": "bool", + "longType": "bool", + "fullType": "bool", "ismap": false, - "isoneof": true, - "oneofdecl": "payload", + "isoneof": false, + "oneofdecl": "", "defaultValue": "" }, { - "name": "ping_slot_channel_req", + "name": "data_rate_index_ack", "description": "", "label": "", - "type": "PingSlotChannelReq", - "longType": "MACCommand.PingSlotChannelReq", - "fullType": "ttn.lorawan.v3.MACCommand.PingSlotChannelReq", + "type": "bool", + "longType": "bool", + "fullType": "bool", "ismap": false, - "isoneof": true, - "oneofdecl": "payload", + "isoneof": false, + "oneofdecl": "", "defaultValue": "" - }, + } + ] + }, + { + "name": "PingSlotChannelReq", + "longName": "MACCommand.PingSlotChannelReq", + "fullName": "ttn.lorawan.v3.MACCommand.PingSlotChannelReq", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "ping_slot_channel_ans", - "description": "", + "name": "frequency", + "description": "Ping slot channel frequency (Hz).", "label": "", - "type": "PingSlotChannelAns", - "longType": "MACCommand.PingSlotChannelAns", - "fullType": "ttn.lorawan.v3.MACCommand.PingSlotChannelAns", + "type": "uint64", + "longType": "uint64", + "fullType": "uint64", "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "uint64.lte", + "value": 0 + }, + { + "name": "uint64.gte", + "value": 100000 + } + ] + } }, { - "name": "beacon_timing_ans", + "name": "data_rate_index", "description": "", "label": "", - "type": "BeaconTimingAns", - "longType": "MACCommand.BeaconTimingAns", - "fullType": "ttn.lorawan.v3.MACCommand.BeaconTimingAns", + "type": "DataRateIndex", + "longType": "DataRateIndex", + "fullType": "ttn.lorawan.v3.DataRateIndex", "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" - }, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } + } + ] + }, + { + "name": "PingSlotInfoReq", + "longName": "MACCommand.PingSlotInfoReq", + "fullName": "ttn.lorawan.v3.MACCommand.PingSlotInfoReq", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "beacon_freq_req", + "name": "period", "description": "", "label": "", - "type": "BeaconFreqReq", - "longType": "MACCommand.BeaconFreqReq", - "fullType": "ttn.lorawan.v3.MACCommand.BeaconFreqReq", + "type": "PingSlotPeriod", + "longType": "PingSlotPeriod", + "fullType": "ttn.lorawan.v3.PingSlotPeriod", "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" - }, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } + } + ] + }, + { + "name": "RejoinParamSetupAns", + "longName": "MACCommand.RejoinParamSetupAns", + "fullName": "ttn.lorawan.v3.MACCommand.RejoinParamSetupAns", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "beacon_freq_ans", + "name": "max_time_exponent_ack", "description": "", "label": "", - "type": "BeaconFreqAns", - "longType": "MACCommand.BeaconFreqAns", - "fullType": "ttn.lorawan.v3.MACCommand.BeaconFreqAns", + "type": "bool", + "longType": "bool", + "fullType": "bool", "ismap": false, - "isoneof": true, - "oneofdecl": "payload", + "isoneof": false, + "oneofdecl": "", "defaultValue": "" - }, + } + ] + }, + { + "name": "RejoinParamSetupReq", + "longName": "MACCommand.RejoinParamSetupReq", + "fullName": "ttn.lorawan.v3.MACCommand.RejoinParamSetupReq", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "device_mode_ind", - "description": "", + "name": "max_count_exponent", + "description": "Exponent e that configures the rejoin counter = 2^(e+4) messages.", "label": "", - "type": "DeviceModeInd", - "longType": "MACCommand.DeviceModeInd", - "fullType": "ttn.lorawan.v3.MACCommand.DeviceModeInd", + "type": "RejoinCountExponent", + "longType": "RejoinCountExponent", + "fullType": "ttn.lorawan.v3.RejoinCountExponent", "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } }, { - "name": "device_mode_conf", - "description": "", + "name": "max_time_exponent", + "description": "Exponent e that configures the rejoin timer = 2^(e+10) seconds.", "label": "", - "type": "DeviceModeConf", - "longType": "MACCommand.DeviceModeConf", - "fullType": "ttn.lorawan.v3.MACCommand.DeviceModeConf", + "type": "RejoinTimeExponent", + "longType": "RejoinTimeExponent", + "fullType": "ttn.lorawan.v3.RejoinTimeExponent", "ismap": false, - "isoneof": true, - "oneofdecl": "payload", - "defaultValue": "" + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } } ] }, { - "name": "ADRParamSetupReq", - "longName": "MACCommand.ADRParamSetupReq", - "fullName": "ttn.lorawan.v3.MACCommand.ADRParamSetupReq", + "name": "RekeyConf", + "longName": "MACCommand.RekeyConf", + "fullName": "ttn.lorawan.v3.MACCommand.RekeyConf", "description": "", "hasExtensions": false, "hasFields": true, @@ -30675,12 +32561,12 @@ "extensions": [], "fields": [ { - "name": "adr_ack_limit_exponent", - "description": "Exponent e that configures the ADR_ACK_LIMIT = 2^e messages.", + "name": "minor_version", + "description": "", "label": "", - "type": "ADRAckLimitExponent", - "longType": "ADRAckLimitExponent", - "fullType": "ttn.lorawan.v3.ADRAckLimitExponent", + "type": "Minor", + "longType": "Minor", + "fullType": "ttn.lorawan.v3.Minor", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -30693,14 +32579,26 @@ } ] } - }, + } + ] + }, + { + "name": "RekeyInd", + "longName": "MACCommand.RekeyInd", + "fullName": "ttn.lorawan.v3.MACCommand.RekeyInd", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "adr_ack_delay_exponent", - "description": "Exponent e that configures the ADR_ACK_DELAY = 2^e messages.", + "name": "minor_version", + "description": "", "label": "", - "type": "ADRAckDelayExponent", - "longType": "ADRAckDelayExponent", - "fullType": "ttn.lorawan.v3.ADRAckDelayExponent", + "type": "Minor", + "longType": "Minor", + "fullType": "ttn.lorawan.v3.Minor", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -30717,9 +32615,9 @@ ] }, { - "name": "BeaconFreqAns", - "longName": "MACCommand.BeaconFreqAns", - "fullName": "ttn.lorawan.v3.MACCommand.BeaconFreqAns", + "name": "RelayConfAns", + "longName": "MACCommand.RelayConfAns", + "fullName": "ttn.lorawan.v3.MACCommand.RelayConfAns", "description": "", "hasExtensions": false, "hasFields": true, @@ -30727,7 +32625,67 @@ "extensions": [], "fields": [ { - "name": "frequency_ack", + "name": "second_channel_frequency_ack", + "description": "", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "second_channel_ack_offset_ack", + "description": "", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "second_channel_data_rate_index_ack", + "description": "", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "second_channel_index_ack", + "description": "", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "default_channel_index_ack", + "description": "", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "cad_periodicity_ack", "description": "", "label": "", "type": "bool", @@ -30741,9 +32699,9 @@ ] }, { - "name": "BeaconFreqReq", - "longName": "MACCommand.BeaconFreqReq", - "fullName": "ttn.lorawan.v3.MACCommand.BeaconFreqReq", + "name": "RelayConfReq", + "longName": "MACCommand.RelayConfReq", + "fullName": "ttn.lorawan.v3.MACCommand.RelayConfReq", "description": "", "hasExtensions": false, "hasFields": true, @@ -30751,35 +32709,23 @@ "extensions": [], "fields": [ { - "name": "frequency", - "description": "Frequency of the Class B beacons (Hz).", + "name": "configuration", + "description": "", "label": "", - "type": "uint64", - "longType": "uint64", - "fullType": "uint64", + "type": "Configuration", + "longType": "MACCommand.RelayConfReq.Configuration", + "fullType": "ttn.lorawan.v3.MACCommand.RelayConfReq.Configuration", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "uint64.lte", - "value": 0 - }, - { - "name": "uint64.gte", - "value": 100000 - } - ] - } + "defaultValue": "" } ] }, { - "name": "BeaconTimingAns", - "longName": "MACCommand.BeaconTimingAns", - "fullName": "ttn.lorawan.v3.MACCommand.BeaconTimingAns", + "name": "Configuration", + "longName": "MACCommand.RelayConfReq.Configuration", + "fullName": "ttn.lorawan.v3.MACCommand.RelayConfReq.Configuration", "description": "", "hasExtensions": false, "hasFields": true, @@ -30787,8 +32733,20 @@ "extensions": [], "fields": [ { - "name": "delay", - "description": "(uint16) See LoRaWAN specification.", + "name": "second_channel", + "description": "", + "label": "", + "type": "RelaySecondChannel", + "longType": "RelaySecondChannel", + "fullType": "ttn.lorawan.v3.RelaySecondChannel", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "default_channel_index", + "description": "", "label": "", "type": "uint32", "longType": "uint32", @@ -30801,18 +32759,18 @@ "validate.rules": [ { "name": "uint32.lte", - "value": 65535 + "value": 255 } ] } }, { - "name": "channel_index", + "name": "cad_periodicity", "description": "", "label": "", - "type": "uint32", - "longType": "uint32", - "fullType": "uint32", + "type": "RelayCADPeriodicity", + "longType": "RelayCADPeriodicity", + "fullType": "ttn.lorawan.v3.RelayCADPeriodicity", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -30820,8 +32778,8 @@ "options": { "validate.rules": [ { - "name": "uint32.lte", - "value": 255 + "name": "enum.defined_only", + "value": true } ] } @@ -30829,9 +32787,20 @@ ] }, { - "name": "DLChannelAns", - "longName": "MACCommand.DLChannelAns", - "fullName": "ttn.lorawan.v3.MACCommand.DLChannelAns", + "name": "RelayConfigureFwdLimitAns", + "longName": "MACCommand.RelayConfigureFwdLimitAns", + "fullName": "ttn.lorawan.v3.MACCommand.RelayConfigureFwdLimitAns", + "description": "", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, + { + "name": "RelayConfigureFwdLimitReq", + "longName": "MACCommand.RelayConfigureFwdLimitReq", + "fullName": "ttn.lorawan.v3.MACCommand.RelayConfigureFwdLimitReq", "description": "", "hasExtensions": false, "hasFields": true, @@ -30839,24 +32808,60 @@ "extensions": [], "fields": [ { - "name": "channel_index_ack", + "name": "reset_limit_counter", "description": "", "label": "", - "type": "bool", - "longType": "bool", - "fullType": "bool", + "type": "RelayResetLimitCounter", + "longType": "RelayResetLimitCounter", + "fullType": "ttn.lorawan.v3.RelayResetLimitCounter", "ismap": false, "isoneof": false, "oneofdecl": "", "defaultValue": "" }, { - "name": "frequency_ack", + "name": "join_request_limits", "description": "", "label": "", - "type": "bool", - "longType": "bool", - "fullType": "bool", + "type": "RelayForwardLimits", + "longType": "RelayForwardLimits", + "fullType": "ttn.lorawan.v3.RelayForwardLimits", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "notify_limits", + "description": "", + "label": "", + "type": "RelayForwardLimits", + "longType": "RelayForwardLimits", + "fullType": "ttn.lorawan.v3.RelayForwardLimits", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "global_uplink_limits", + "description": "", + "label": "", + "type": "RelayForwardLimits", + "longType": "RelayForwardLimits", + "fullType": "ttn.lorawan.v3.RelayForwardLimits", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "overall_limits", + "description": "", + "label": "", + "type": "RelayForwardLimits", + "longType": "RelayForwardLimits", + "fullType": "ttn.lorawan.v3.RelayForwardLimits", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -30865,9 +32870,9 @@ ] }, { - "name": "DLChannelReq", - "longName": "MACCommand.DLChannelReq", - "fullName": "ttn.lorawan.v3.MACCommand.DLChannelReq", + "name": "RelayCtrlUplinkListAns", + "longName": "MACCommand.RelayCtrlUplinkListAns", + "fullName": "ttn.lorawan.v3.MACCommand.RelayCtrlUplinkListAns", "description": "", "hasExtensions": false, "hasFields": true, @@ -30875,51 +32880,35 @@ "extensions": [], "fields": [ { - "name": "channel_index", + "name": "rule_index_ack", "description": "", "label": "", - "type": "uint32", - "longType": "uint32", - "fullType": "uint32", + "type": "bool", + "longType": "bool", + "fullType": "bool", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "uint32.lte", - "value": 255 - } - ] - } + "defaultValue": "" }, { - "name": "frequency", - "description": "Downlink channel frequency (Hz).", + "name": "w_f_cnt", + "description": "", "label": "", - "type": "uint64", - "longType": "uint64", - "fullType": "uint64", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "uint64.gte", - "value": 100000 - } - ] - } + "defaultValue": "" } ] }, { - "name": "DevStatusAns", - "longName": "MACCommand.DevStatusAns", - "fullName": "ttn.lorawan.v3.MACCommand.DevStatusAns", + "name": "RelayCtrlUplinkListReq", + "longName": "MACCommand.RelayCtrlUplinkListReq", + "fullName": "ttn.lorawan.v3.MACCommand.RelayCtrlUplinkListReq", "description": "", "hasExtensions": false, "hasFields": true, @@ -30927,8 +32916,8 @@ "extensions": [], "fields": [ { - "name": "battery", - "description": "Device battery status.\n0 indicates that the device is connected to an external power source.\n1..254 indicates a battery level.\n255 indicates that the device was not able to measure the battery level.", + "name": "rule_index", + "description": "", "label": "", "type": "uint32", "longType": "uint32", @@ -30941,41 +32930,29 @@ "validate.rules": [ { "name": "uint32.lte", - "value": 255 + "value": 15 } ] } }, { - "name": "margin", - "description": "SNR of the last downlink (dB; [-32, +31]).", + "name": "action", + "description": "", "label": "", - "type": "int32", - "longType": "int32", - "fullType": "int32", + "type": "RelayCtrlUplinkListAction", + "longType": "RelayCtrlUplinkListAction", + "fullType": "ttn.lorawan.v3.RelayCtrlUplinkListAction", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "int32.lte", - "value": 31 - }, - { - "name": "int32.gte", - "value": -32 - } - ] - } + "defaultValue": "" } ] }, { - "name": "DeviceModeConf", - "longName": "MACCommand.DeviceModeConf", - "fullName": "ttn.lorawan.v3.MACCommand.DeviceModeConf", + "name": "RelayEndDeviceConfAns", + "longName": "MACCommand.RelayEndDeviceConfAns", + "fullName": "ttn.lorawan.v3.MACCommand.RelayEndDeviceConfAns", "description": "", "hasExtensions": false, "hasFields": true, @@ -30983,95 +32960,59 @@ "extensions": [], "fields": [ { - "name": "class", + "name": "second_channel_frequency_ack", "description": "", "label": "", - "type": "Class", - "longType": "Class", - "fullType": "ttn.lorawan.v3.Class", + "type": "bool", + "longType": "bool", + "fullType": "bool", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "enum.defined_only", - "value": true - } - ] - } - } - ] - }, - { - "name": "DeviceModeInd", - "longName": "MACCommand.DeviceModeInd", - "fullName": "ttn.lorawan.v3.MACCommand.DeviceModeInd", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ + "defaultValue": "" + }, { - "name": "class", + "name": "second_channel_data_rate_index_ack", "description": "", "label": "", - "type": "Class", - "longType": "Class", - "fullType": "ttn.lorawan.v3.Class", + "type": "bool", + "longType": "bool", + "fullType": "bool", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "enum.defined_only", - "value": true - } - ] - } - } - ] - }, - { - "name": "DeviceTimeAns", - "longName": "MACCommand.DeviceTimeAns", - "fullName": "ttn.lorawan.v3.MACCommand.DeviceTimeAns", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ + "defaultValue": "" + }, + { + "name": "second_channel_index_ack", + "description": "", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, { - "name": "time", + "name": "backoff_ack", "description": "", "label": "", - "type": "Timestamp", - "longType": "google.protobuf.Timestamp", - "fullType": "google.protobuf.Timestamp", + "type": "bool", + "longType": "bool", + "fullType": "bool", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "timestamp.required", - "value": true - } - ] - } + "defaultValue": "" } ] }, { - "name": "DutyCycleReq", - "longName": "MACCommand.DutyCycleReq", - "fullName": "ttn.lorawan.v3.MACCommand.DutyCycleReq", + "name": "RelayEndDeviceConfReq", + "longName": "MACCommand.RelayEndDeviceConfReq", + "fullName": "ttn.lorawan.v3.MACCommand.RelayEndDeviceConfReq", "description": "", "hasExtensions": false, "hasFields": true, @@ -31079,79 +33020,67 @@ "extensions": [], "fields": [ { - "name": "max_duty_cycle", + "name": "configuration", "description": "", "label": "", - "type": "AggregatedDutyCycle", - "longType": "AggregatedDutyCycle", - "fullType": "ttn.lorawan.v3.AggregatedDutyCycle", + "type": "Configuration", + "longType": "MACCommand.RelayEndDeviceConfReq.Configuration", + "fullType": "ttn.lorawan.v3.MACCommand.RelayEndDeviceConfReq.Configuration", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "enum.defined_only", - "value": true - } - ] - } + "defaultValue": "" } ] }, { - "name": "ForceRejoinReq", - "longName": "MACCommand.ForceRejoinReq", - "fullName": "ttn.lorawan.v3.MACCommand.ForceRejoinReq", + "name": "Configuration", + "longName": "MACCommand.RelayEndDeviceConfReq.Configuration", + "fullName": "ttn.lorawan.v3.MACCommand.RelayEndDeviceConfReq.Configuration", "description": "", "hasExtensions": false, "hasFields": true, - "hasOneofs": false, + "hasOneofs": true, "extensions": [], "fields": [ { - "name": "rejoin_type", + "name": "always", "description": "", "label": "", - "type": "RejoinRequestType", - "longType": "RejoinRequestType", - "fullType": "ttn.lorawan.v3.RejoinRequestType", + "type": "RelayEndDeviceAlwaysMode", + "longType": "RelayEndDeviceAlwaysMode", + "fullType": "ttn.lorawan.v3.RelayEndDeviceAlwaysMode", "ismap": false, - "isoneof": false, - "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "enum.defined_only", - "value": true - } - ] - } + "isoneof": true, + "oneofdecl": "mode", + "defaultValue": "" }, { - "name": "data_rate_index", + "name": "dynamic", "description": "", "label": "", - "type": "DataRateIndex", - "longType": "DataRateIndex", - "fullType": "ttn.lorawan.v3.DataRateIndex", + "type": "RelayEndDeviceDynamicMode", + "longType": "RelayEndDeviceDynamicMode", + "fullType": "ttn.lorawan.v3.RelayEndDeviceDynamicMode", "ismap": false, - "isoneof": false, - "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "enum.defined_only", - "value": true - } - ] - } + "isoneof": true, + "oneofdecl": "mode", + "defaultValue": "" }, { - "name": "max_retries", + "name": "end_device_controlled", + "description": "", + "label": "", + "type": "RelayEndDeviceControlledMode", + "longType": "RelayEndDeviceControlledMode", + "fullType": "ttn.lorawan.v3.RelayEndDeviceControlledMode", + "ismap": false, + "isoneof": true, + "oneofdecl": "mode", + "defaultValue": "" + }, + { + "name": "backoff", "description": "", "label": "", "type": "uint32", @@ -31165,18 +33094,30 @@ "validate.rules": [ { "name": "uint32.lte", - "value": 7 + "value": 63 } ] } }, { - "name": "period_exponent", - "description": "Exponent e that configures the rejoin period = 32 * 2^e + rand(0,32) seconds.", + "name": "second_channel", + "description": "", "label": "", - "type": "RejoinPeriodExponent", - "longType": "RejoinPeriodExponent", - "fullType": "ttn.lorawan.v3.RejoinPeriodExponent", + "type": "RelaySecondChannel", + "longType": "RelaySecondChannel", + "fullType": "ttn.lorawan.v3.RelaySecondChannel", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "serving_device_id", + "description": "", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -31184,8 +33125,12 @@ "options": { "validate.rules": [ { - "name": "enum.defined_only", - "value": true + "name": "string.max_len", + "value": 36 + }, + { + "name": "string.pattern", + "value": "^[a-z0-9](?:[-]?[a-z0-9]){2,}$" } ] } @@ -31193,9 +33138,9 @@ ] }, { - "name": "LinkADRAns", - "longName": "MACCommand.LinkADRAns", - "fullName": "ttn.lorawan.v3.MACCommand.LinkADRAns", + "name": "RelayNotifyNewEndDeviceReq", + "longName": "MACCommand.RelayNotifyNewEndDeviceReq", + "fullName": "ttn.lorawan.v3.MACCommand.RelayNotifyNewEndDeviceReq", "description": "", "hasExtensions": false, "hasFields": true, @@ -31203,47 +33148,90 @@ "extensions": [], "fields": [ { - "name": "channel_mask_ack", + "name": "dev_addr", "description": "", "label": "", - "type": "bool", - "longType": "bool", - "fullType": "bool", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "" + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "bytes.len", + "value": 4 + } + ] + } }, { - "name": "data_rate_index_ack", + "name": "snr", "description": "", "label": "", - "type": "bool", - "longType": "bool", - "fullType": "bool", + "type": "int32", + "longType": "int32", + "fullType": "int32", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "" + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "int32.lte", + "value": 11 + }, + { + "name": "int32.gte", + "value": -20 + } + ] + } }, { - "name": "tx_power_index_ack", + "name": "rssi", "description": "", "label": "", - "type": "bool", - "longType": "bool", - "fullType": "bool", + "type": "int32", + "longType": "int32", + "fullType": "int32", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "" + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "int32.lte", + "value": -15 + }, + { + "name": "int32.gte", + "value": -142 + } + ] + } } ] }, { - "name": "LinkADRReq", - "longName": "MACCommand.LinkADRReq", - "fullName": "ttn.lorawan.v3.MACCommand.LinkADRReq", + "name": "RelayUpdateUplinkListAns", + "longName": "MACCommand.RelayUpdateUplinkListAns", + "fullName": "ttn.lorawan.v3.MACCommand.RelayUpdateUplinkListAns", + "description": "", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, + { + "name": "RelayUpdateUplinkListReq", + "longName": "MACCommand.RelayUpdateUplinkListReq", + "fullName": "ttn.lorawan.v3.MACCommand.RelayUpdateUplinkListReq", "description": "", "hasExtensions": false, "hasFields": true, @@ -31251,12 +33239,12 @@ "extensions": [], "fields": [ { - "name": "data_rate_index", + "name": "rule_index", "description": "", "label": "", - "type": "DataRateIndex", - "longType": "DataRateIndex", - "fullType": "ttn.lorawan.v3.DataRateIndex", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -31264,39 +33252,31 @@ "options": { "validate.rules": [ { - "name": "enum.defined_only", - "value": true + "name": "uint32.lte", + "value": 15 } ] } }, { - "name": "tx_power_index", + "name": "forward_limits", "description": "", "label": "", - "type": "uint32", - "longType": "uint32", - "fullType": "uint32", + "type": "RelayUplinkForwardLimits", + "longType": "RelayUplinkForwardLimits", + "fullType": "ttn.lorawan.v3.RelayUplinkForwardLimits", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "uint32.lte", - "value": 15 - } - ] - } + "defaultValue": "" }, { - "name": "channel_mask", + "name": "dev_addr", "description": "", - "label": "repeated", - "type": "bool", - "longType": "bool", - "fullType": "bool", + "label": "", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -31304,14 +33284,14 @@ "options": { "validate.rules": [ { - "name": "repeated.max_items", - "value": 16 + "name": "bytes.len", + "value": 4 } ] } }, { - "name": "channel_mask_control", + "name": "w_f_cnt", "description": "", "label": "", "type": "uint32", @@ -31320,23 +33300,35 @@ "ismap": false, "isoneof": false, "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "root_wor_s_key", + "description": "", + "label": "", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", + "ismap": false, + "isoneof": false, + "oneofdecl": "", "defaultValue": "", "options": { "validate.rules": [ { - "name": "uint32.lte", - "value": 7 + "name": "bytes.len", + "value": 16 } ] } }, { - "name": "nb_trans", + "name": "device_id", "description": "", "label": "", - "type": "uint32", - "longType": "uint32", - "fullType": "uint32", + "type": "string", + "longType": "string", + "fullType": "string", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -31344,18 +33336,34 @@ "options": { "validate.rules": [ { - "name": "uint32.lte", - "value": 15 + "name": "string.max_len", + "value": 36 + }, + { + "name": "string.pattern", + "value": "^[a-z0-9](?:[-]?[a-z0-9]){2,}$" } ] } + }, + { + "name": "session_key_id", + "description": "", + "label": "", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" } ] }, { - "name": "LinkCheckAns", - "longName": "MACCommand.LinkCheckAns", - "fullName": "ttn.lorawan.v3.MACCommand.LinkCheckAns", + "name": "ResetConf", + "longName": "MACCommand.ResetConf", + "fullName": "ttn.lorawan.v3.MACCommand.ResetConf", "description": "", "hasExtensions": false, "hasFields": true, @@ -31363,12 +33371,12 @@ "extensions": [], "fields": [ { - "name": "margin", - "description": "Indicates the link margin in dB of the received LinkCheckReq, relative to the demodulation floor.", + "name": "minor_version", + "description": "", "label": "", - "type": "uint32", - "longType": "uint32", - "fullType": "uint32", + "type": "Minor", + "longType": "Minor", + "fullType": "ttn.lorawan.v3.Minor", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -31376,19 +33384,37 @@ "options": { "validate.rules": [ { - "name": "uint32.lte", - "value": 254 + "name": "enum.defined_only", + "value": true + }, + { + "name": "enum.in", + "value": [ + 1 + ] } ] } - }, + } + ] + }, + { + "name": "ResetInd", + "longName": "MACCommand.ResetInd", + "fullName": "ttn.lorawan.v3.MACCommand.ResetInd", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "gateway_count", + "name": "minor_version", "description": "", "label": "", - "type": "uint32", - "longType": "uint32", - "fullType": "uint32", + "type": "Minor", + "longType": "Minor", + "fullType": "ttn.lorawan.v3.Minor", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -31396,8 +33422,14 @@ "options": { "validate.rules": [ { - "name": "uint32.lte", - "value": 255 + "name": "enum.defined_only", + "value": true + }, + { + "name": "enum.in", + "value": [ + 1 + ] } ] } @@ -31405,9 +33437,9 @@ ] }, { - "name": "NewChannelAns", - "longName": "MACCommand.NewChannelAns", - "fullName": "ttn.lorawan.v3.MACCommand.NewChannelAns", + "name": "RxParamSetupAns", + "longName": "MACCommand.RxParamSetupAns", + "fullName": "ttn.lorawan.v3.MACCommand.RxParamSetupAns", "description": "", "hasExtensions": false, "hasFields": true, @@ -31415,7 +33447,7 @@ "extensions": [], "fields": [ { - "name": "frequency_ack", + "name": "rx2_data_rate_index_ack", "description": "", "label": "", "type": "bool", @@ -31427,7 +33459,19 @@ "defaultValue": "" }, { - "name": "data_rate_ack", + "name": "rx1_data_rate_offset_ack", + "description": "", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "rx2_frequency_ack", "description": "", "label": "", "type": "bool", @@ -31441,9 +33485,9 @@ ] }, { - "name": "NewChannelReq", - "longName": "MACCommand.NewChannelReq", - "fullName": "ttn.lorawan.v3.MACCommand.NewChannelReq", + "name": "RxParamSetupReq", + "longName": "MACCommand.RxParamSetupReq", + "fullName": "ttn.lorawan.v3.MACCommand.RxParamSetupReq", "description": "", "hasExtensions": false, "hasFields": true, @@ -31451,32 +33495,12 @@ "extensions": [], "fields": [ { - "name": "channel_index", + "name": "rx2_data_rate_index", "description": "", "label": "", - "type": "uint32", - "longType": "uint32", - "fullType": "uint32", - "ismap": false, - "isoneof": false, - "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "uint32.lte", - "value": 255 - } - ] - } - }, - { - "name": "frequency", - "description": "Channel frequency (Hz).", - "label": "", - "type": "uint64", - "longType": "uint64", - "fullType": "uint64", + "type": "DataRateIndex", + "longType": "DataRateIndex", + "fullType": "ttn.lorawan.v3.DataRateIndex", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -31484,23 +33508,19 @@ "options": { "validate.rules": [ { - "name": "uint64.lte", - "value": 0 - }, - { - "name": "uint64.gte", - "value": 100000 + "name": "enum.defined_only", + "value": true } ] } }, { - "name": "min_data_rate_index", + "name": "rx1_data_rate_offset", "description": "", "label": "", - "type": "DataRateIndex", - "longType": "DataRateIndex", - "fullType": "ttn.lorawan.v3.DataRateIndex", + "type": "DataRateOffset", + "longType": "DataRateOffset", + "fullType": "ttn.lorawan.v3.DataRateOffset", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -31515,12 +33535,12 @@ } }, { - "name": "max_data_rate_index", - "description": "", + "name": "rx2_frequency", + "description": "Rx2 frequency (Hz).", "label": "", - "type": "DataRateIndex", - "longType": "DataRateIndex", - "fullType": "ttn.lorawan.v3.DataRateIndex", + "type": "uint64", + "longType": "uint64", + "fullType": "uint64", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -31528,8 +33548,8 @@ "options": { "validate.rules": [ { - "name": "enum.defined_only", - "value": true + "name": "uint64.gte", + "value": 100000 } ] } @@ -31537,9 +33557,9 @@ ] }, { - "name": "PingSlotChannelAns", - "longName": "MACCommand.PingSlotChannelAns", - "fullName": "ttn.lorawan.v3.MACCommand.PingSlotChannelAns", + "name": "RxTimingSetupReq", + "longName": "MACCommand.RxTimingSetupReq", + "fullName": "ttn.lorawan.v3.MACCommand.RxTimingSetupReq", "description": "", "hasExtensions": false, "hasFields": true, @@ -31547,35 +33567,31 @@ "extensions": [], "fields": [ { - "name": "frequency_ack", - "description": "", - "label": "", - "type": "bool", - "longType": "bool", - "fullType": "bool", - "ismap": false, - "isoneof": false, - "oneofdecl": "", - "defaultValue": "" - }, - { - "name": "data_rate_index_ack", + "name": "delay", "description": "", "label": "", - "type": "bool", - "longType": "bool", - "fullType": "bool", + "type": "RxDelay", + "longType": "RxDelay", + "fullType": "ttn.lorawan.v3.RxDelay", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "" + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } } ] }, { - "name": "PingSlotChannelReq", - "longName": "MACCommand.PingSlotChannelReq", - "fullName": "ttn.lorawan.v3.MACCommand.PingSlotChannelReq", + "name": "TxParamSetupReq", + "longName": "MACCommand.TxParamSetupReq", + "fullName": "ttn.lorawan.v3.MACCommand.TxParamSetupReq", "description": "", "hasExtensions": false, "hasFields": true, @@ -31583,12 +33599,12 @@ "extensions": [], "fields": [ { - "name": "frequency", - "description": "Ping slot channel frequency (Hz).", + "name": "max_eirp_index", + "description": "Indicates the maximum EIRP value in dBm, indexed by the following vector:\n[ 8 10 12 13 14 16 18 20 21 24 26 27 29 30 33 36 ]", "label": "", - "type": "uint64", - "longType": "uint64", - "fullType": "uint64", + "type": "DeviceEIRP", + "longType": "DeviceEIRP", + "fullType": "ttn.lorawan.v3.DeviceEIRP", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -31596,74 +33612,42 @@ "options": { "validate.rules": [ { - "name": "uint64.lte", - "value": 0 - }, - { - "name": "uint64.gte", - "value": 100000 + "name": "enum.defined_only", + "value": true } ] } }, { - "name": "data_rate_index", + "name": "uplink_dwell_time", "description": "", "label": "", - "type": "DataRateIndex", - "longType": "DataRateIndex", - "fullType": "ttn.lorawan.v3.DataRateIndex", + "type": "bool", + "longType": "bool", + "fullType": "bool", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "enum.defined_only", - "value": true - } - ] - } - } - ] - }, - { - "name": "PingSlotInfoReq", - "longName": "MACCommand.PingSlotInfoReq", - "fullName": "ttn.lorawan.v3.MACCommand.PingSlotInfoReq", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ + "defaultValue": "" + }, { - "name": "period", + "name": "downlink_dwell_time", "description": "", "label": "", - "type": "PingSlotPeriod", - "longType": "PingSlotPeriod", - "fullType": "ttn.lorawan.v3.PingSlotPeriod", + "type": "bool", + "longType": "bool", + "fullType": "bool", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "enum.defined_only", - "value": true - } - ] - } + "defaultValue": "" } ] }, { - "name": "RejoinParamSetupAns", - "longName": "MACCommand.RejoinParamSetupAns", - "fullName": "ttn.lorawan.v3.MACCommand.RejoinParamSetupAns", + "name": "MACCommands", + "longName": "MACCommands", + "fullName": "ttn.lorawan.v3.MACCommands", "description": "", "hasExtensions": false, "hasFields": true, @@ -31671,12 +33655,12 @@ "extensions": [], "fields": [ { - "name": "max_time_exponent_ack", + "name": "commands", "description": "", - "label": "", - "type": "bool", - "longType": "bool", - "fullType": "bool", + "label": "repeated", + "type": "MACCommand", + "longType": "MACCommand", + "fullType": "ttn.lorawan.v3.MACCommand", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -31685,9 +33669,9 @@ ] }, { - "name": "RejoinParamSetupReq", - "longName": "MACCommand.RejoinParamSetupReq", - "fullName": "ttn.lorawan.v3.MACCommand.RejoinParamSetupReq", + "name": "MACPayload", + "longName": "MACPayload", + "fullName": "ttn.lorawan.v3.MACPayload", "description": "", "hasExtensions": false, "hasFields": true, @@ -31695,12 +33679,12 @@ "extensions": [], "fields": [ { - "name": "max_count_exponent", - "description": "Exponent e that configures the rejoin counter = 2^(e+4) messages.", + "name": "f_hdr", + "description": "", "label": "", - "type": "RejoinCountExponent", - "longType": "RejoinCountExponent", - "fullType": "ttn.lorawan.v3.RejoinCountExponent", + "type": "FHDR", + "longType": "FHDR", + "fullType": "ttn.lorawan.v3.FHDR", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -31708,19 +33692,19 @@ "options": { "validate.rules": [ { - "name": "enum.defined_only", + "name": "message.required", "value": true } ] } }, { - "name": "max_time_exponent", - "description": "Exponent e that configures the rejoin timer = 2^(e+10) seconds.", + "name": "f_port", + "description": "", "label": "", - "type": "RejoinTimeExponent", - "longType": "RejoinTimeExponent", - "fullType": "ttn.lorawan.v3.RejoinTimeExponent", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -31728,18 +33712,54 @@ "options": { "validate.rules": [ { - "name": "enum.defined_only", - "value": true + "name": "uint32.lte", + "value": 255 } ] } + }, + { + "name": "frm_payload", + "description": "", + "label": "", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "decoded_payload", + "description": "", + "label": "", + "type": "Struct", + "longType": "google.protobuf.Struct", + "fullType": "google.protobuf.Struct", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "full_f_cnt", + "description": "Full 32-bit FCnt value. Used internally by Network Server.", + "label": "", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" } ] }, { - "name": "RekeyConf", - "longName": "MACCommand.RekeyConf", - "fullName": "ttn.lorawan.v3.MACCommand.RekeyConf", + "name": "MHDR", + "longName": "MHDR", + "fullName": "ttn.lorawan.v3.MHDR", "description": "", "hasExtensions": false, "hasFields": true, @@ -31747,12 +33767,12 @@ "extensions": [], "fields": [ { - "name": "minor_version", + "name": "m_type", "description": "", "label": "", - "type": "Minor", - "longType": "Minor", - "fullType": "ttn.lorawan.v3.Minor", + "type": "MType", + "longType": "MType", + "fullType": "ttn.lorawan.v3.MType", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -31765,26 +33785,14 @@ } ] } - } - ] - }, - { - "name": "RekeyInd", - "longName": "MACCommand.RekeyInd", - "fullName": "ttn.lorawan.v3.MACCommand.RekeyInd", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ + }, { - "name": "minor_version", + "name": "major", "description": "", "label": "", - "type": "Minor", - "longType": "Minor", - "fullType": "ttn.lorawan.v3.Minor", + "type": "Major", + "longType": "Major", + "fullType": "ttn.lorawan.v3.Major", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -31801,22 +33809,22 @@ ] }, { - "name": "ResetConf", - "longName": "MACCommand.ResetConf", - "fullName": "ttn.lorawan.v3.MACCommand.ResetConf", - "description": "", + "name": "Message", + "longName": "Message", + "fullName": "ttn.lorawan.v3.Message", + "description": "Message represents a LoRaWAN message", "hasExtensions": false, "hasFields": true, - "hasOneofs": false, + "hasOneofs": true, "extensions": [], "fields": [ { - "name": "minor_version", + "name": "m_hdr", "description": "", "label": "", - "type": "Minor", - "longType": "Minor", - "fullType": "ttn.lorawan.v3.Minor", + "type": "MHDR", + "longType": "MHDR", + "fullType": "ttn.lorawan.v3.MHDR", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -31824,37 +33832,19 @@ "options": { "validate.rules": [ { - "name": "enum.defined_only", + "name": "message.required", "value": true - }, - { - "name": "enum.in", - "value": [ - 1 - ] } ] } - } - ] - }, - { - "name": "ResetInd", - "longName": "MACCommand.ResetInd", - "fullName": "ttn.lorawan.v3.MACCommand.ResetInd", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ + }, { - "name": "minor_version", + "name": "mic", "description": "", "label": "", - "type": "Minor", - "longType": "Minor", - "fullType": "ttn.lorawan.v3.Minor", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -31862,72 +33852,102 @@ "options": { "validate.rules": [ { - "name": "enum.defined_only", - "value": true + "name": "bytes.min_len", + "value": 0 }, { - "name": "enum.in", - "value": [ - 1 - ] + "name": "bytes.max_len", + "value": 4 } ] } - } - ] - }, - { - "name": "RxParamSetupAns", - "longName": "MACCommand.RxParamSetupAns", - "fullName": "ttn.lorawan.v3.MACCommand.RxParamSetupAns", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ + }, { - "name": "rx2_data_rate_index_ack", + "name": "mac_payload", "description": "", "label": "", - "type": "bool", - "longType": "bool", - "fullType": "bool", + "type": "MACPayload", + "longType": "MACPayload", + "fullType": "ttn.lorawan.v3.MACPayload", "ismap": false, - "isoneof": false, - "oneofdecl": "", + "isoneof": true, + "oneofdecl": "Payload", "defaultValue": "" }, { - "name": "rx1_data_rate_offset_ack", + "name": "join_request_payload", "description": "", "label": "", - "type": "bool", - "longType": "bool", - "fullType": "bool", + "type": "JoinRequestPayload", + "longType": "JoinRequestPayload", + "fullType": "ttn.lorawan.v3.JoinRequestPayload", "ismap": false, - "isoneof": false, - "oneofdecl": "", + "isoneof": true, + "oneofdecl": "Payload", + "defaultValue": "" + }, + { + "name": "join_accept_payload", + "description": "", + "label": "", + "type": "JoinAcceptPayload", + "longType": "JoinAcceptPayload", + "fullType": "ttn.lorawan.v3.JoinAcceptPayload", + "ismap": false, + "isoneof": true, + "oneofdecl": "Payload", "defaultValue": "" }, { - "name": "rx2_frequency_ack", + "name": "rejoin_request_payload", + "description": "", + "label": "", + "type": "RejoinRequestPayload", + "longType": "RejoinRequestPayload", + "fullType": "ttn.lorawan.v3.RejoinRequestPayload", + "ismap": false, + "isoneof": true, + "oneofdecl": "Payload", + "defaultValue": "" + } + ] + }, + { + "name": "PingSlotPeriodValue", + "longName": "PingSlotPeriodValue", + "fullName": "ttn.lorawan.v3.PingSlotPeriodValue", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "value", "description": "", "label": "", - "type": "bool", - "longType": "bool", - "fullType": "bool", + "type": "PingSlotPeriod", + "longType": "PingSlotPeriod", + "fullType": "ttn.lorawan.v3.PingSlotPeriod", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "" + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } } ] }, { - "name": "RxParamSetupReq", - "longName": "MACCommand.RxParamSetupReq", - "fullName": "ttn.lorawan.v3.MACCommand.RxParamSetupReq", + "name": "RejoinRequestPayload", + "longName": "RejoinRequestPayload", + "fullName": "ttn.lorawan.v3.RejoinRequestPayload", "description": "", "hasExtensions": false, "hasFields": true, @@ -31935,12 +33955,12 @@ "extensions": [], "fields": [ { - "name": "rx2_data_rate_index", + "name": "rejoin_type", "description": "", "label": "", - "type": "DataRateIndex", - "longType": "DataRateIndex", - "fullType": "ttn.lorawan.v3.DataRateIndex", + "type": "RejoinRequestType", + "longType": "RejoinRequestType", + "fullType": "ttn.lorawan.v3.RejoinRequestType", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -31955,12 +33975,12 @@ } }, { - "name": "rx1_data_rate_offset", + "name": "net_id", "description": "", "label": "", - "type": "DataRateOffset", - "longType": "DataRateOffset", - "fullType": "ttn.lorawan.v3.DataRateOffset", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -31968,19 +33988,19 @@ "options": { "validate.rules": [ { - "name": "enum.defined_only", - "value": true + "name": "bytes.len", + "value": 3 } ] } }, { - "name": "rx2_frequency", - "description": "Rx2 frequency (Hz).", + "name": "join_eui", + "description": "", "label": "", - "type": "uint64", - "longType": "uint64", - "fullType": "uint64", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -31988,31 +34008,19 @@ "options": { "validate.rules": [ { - "name": "uint64.gte", - "value": 100000 + "name": "bytes.len", + "value": 8 } ] } - } - ] - }, - { - "name": "RxTimingSetupReq", - "longName": "MACCommand.RxTimingSetupReq", - "fullName": "ttn.lorawan.v3.MACCommand.RxTimingSetupReq", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ + }, { - "name": "delay", + "name": "dev_eui", "description": "", "label": "", - "type": "RxDelay", - "longType": "RxDelay", - "fullType": "ttn.lorawan.v3.RxDelay", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -32020,18 +34028,52 @@ "options": { "validate.rules": [ { - "name": "enum.defined_only", - "value": true + "name": "bytes.len", + "value": 8 } ] } + }, + { + "name": "rejoin_cnt", + "description": "Contains RJCount0 or RJCount1 depending on rejoin_type.", + "label": "", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" } ] }, { - "name": "TxParamSetupReq", - "longName": "MACCommand.TxParamSetupReq", - "fullName": "ttn.lorawan.v3.MACCommand.TxParamSetupReq", + "name": "RelayEndDeviceAlwaysMode", + "longName": "RelayEndDeviceAlwaysMode", + "fullName": "ttn.lorawan.v3.RelayEndDeviceAlwaysMode", + "description": "", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, + { + "name": "RelayEndDeviceControlledMode", + "longName": "RelayEndDeviceControlledMode", + "fullName": "ttn.lorawan.v3.RelayEndDeviceControlledMode", + "description": "", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, + { + "name": "RelayEndDeviceDynamicMode", + "longName": "RelayEndDeviceDynamicMode", + "fullName": "ttn.lorawan.v3.RelayEndDeviceDynamicMode", "description": "", "hasExtensions": false, "hasFields": true, @@ -32039,12 +34081,12 @@ "extensions": [], "fields": [ { - "name": "max_eirp_index", - "description": "Indicates the maximum EIRP value in dBm, indexed by the following vector:\n[ 8 10 12 13 14 16 18 20 21 24 26 27 29 30 33 36 ]", + "name": "smart_enable_level", + "description": "The number of consecutive uplinks without a valid downlink before the end device attempts\nto use the relay mode to transmit messages.", "label": "", - "type": "DeviceEIRP", - "longType": "DeviceEIRP", - "fullType": "ttn.lorawan.v3.DeviceEIRP", + "type": "RelaySmartEnableLevel", + "longType": "RelaySmartEnableLevel", + "fullType": "ttn.lorawan.v3.RelaySmartEnableLevel", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -32057,37 +34099,13 @@ } ] } - }, - { - "name": "uplink_dwell_time", - "description": "", - "label": "", - "type": "bool", - "longType": "bool", - "fullType": "bool", - "ismap": false, - "isoneof": false, - "oneofdecl": "", - "defaultValue": "" - }, - { - "name": "downlink_dwell_time", - "description": "", - "label": "", - "type": "bool", - "longType": "bool", - "fullType": "bool", - "ismap": false, - "isoneof": false, - "oneofdecl": "", - "defaultValue": "" } ] }, { - "name": "MACCommands", - "longName": "MACCommands", - "fullName": "ttn.lorawan.v3.MACCommands", + "name": "RelayForwardDownlinkReq", + "longName": "RelayForwardDownlinkReq", + "fullName": "ttn.lorawan.v3.RelayForwardDownlinkReq", "description": "", "hasExtensions": false, "hasFields": true, @@ -32095,12 +34113,12 @@ "extensions": [], "fields": [ { - "name": "commands", + "name": "raw_payload", "description": "", - "label": "repeated", - "type": "MACCommand", - "longType": "MACCommand", - "fullType": "ttn.lorawan.v3.MACCommand", + "label": "", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -32109,9 +34127,9 @@ ] }, { - "name": "MACPayload", - "longName": "MACPayload", - "fullName": "ttn.lorawan.v3.MACPayload", + "name": "RelayForwardLimits", + "longName": "RelayForwardLimits", + "fullName": "ttn.lorawan.v3.RelayForwardLimits", "description": "", "hasExtensions": false, "hasFields": true, @@ -32119,12 +34137,12 @@ "extensions": [], "fields": [ { - "name": "f_hdr", - "description": "", + "name": "bucket_size", + "description": "The multiplier used to compute the total bucket size for the limits.\nThe multiplier is multiplied by the reload rate in order to compute the total bucket size.", "label": "", - "type": "FHDR", - "longType": "FHDR", - "fullType": "ttn.lorawan.v3.FHDR", + "type": "RelayLimitBucketSize", + "longType": "RelayLimitBucketSize", + "fullType": "ttn.lorawan.v3.RelayLimitBucketSize", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -32132,15 +34150,15 @@ "options": { "validate.rules": [ { - "name": "message.required", + "name": "enum.defined_only", "value": true } ] } }, { - "name": "f_port", - "description": "", + "name": "reload_rate", + "description": "The number of tokens which are replenished in the bucket every hour.", "label": "", "type": "uint32", "longType": "uint32", @@ -32153,66 +34171,98 @@ "validate.rules": [ { "name": "uint32.lte", - "value": 255 + "value": 126 } ] } - }, + } + ] + }, + { + "name": "RelayForwardUplinkReq", + "longName": "RelayForwardUplinkReq", + "fullName": "ttn.lorawan.v3.RelayForwardUplinkReq", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "frm_payload", + "name": "data_rate", "description": "", "label": "", - "type": "bytes", - "longType": "bytes", - "fullType": "bytes", + "type": "DataRate", + "longType": "DataRate", + "fullType": "ttn.lorawan.v3.DataRate", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "" + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "message.required", + "value": true + } + ] + } }, { - "name": "decoded_payload", + "name": "snr", "description": "", "label": "", - "type": "Struct", - "longType": "google.protobuf.Struct", - "fullType": "google.protobuf.Struct", + "type": "int32", + "longType": "int32", + "fullType": "int32", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "" + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "int32.lte", + "value": 11 + }, + { + "name": "int32.gte", + "value": -20 + } + ] + } }, { - "name": "full_f_cnt", - "description": "Full 32-bit FCnt value. Used internally by Network Server.", + "name": "rssi", + "description": "", "label": "", - "type": "uint32", - "longType": "uint32", - "fullType": "uint32", + "type": "int32", + "longType": "int32", + "fullType": "int32", "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "" - } - ] - }, - { - "name": "MHDR", - "longName": "MHDR", - "fullName": "ttn.lorawan.v3.MHDR", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "int32.lte", + "value": -15 + }, + { + "name": "int32.gte", + "value": -142 + } + ] + } + }, { - "name": "m_type", + "name": "wor_channel", "description": "", "label": "", - "type": "MType", - "longType": "MType", - "fullType": "ttn.lorawan.v3.MType", + "type": "RelayWORChannel", + "longType": "RelayWORChannel", + "fullType": "ttn.lorawan.v3.RelayWORChannel", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -32227,12 +34277,12 @@ } }, { - "name": "major", - "description": "", + "name": "frequency", + "description": "Uplink channel frequency (Hz).", "label": "", - "type": "Major", - "longType": "Major", - "fullType": "ttn.lorawan.v3.Major", + "type": "uint64", + "longType": "uint64", + "fullType": "uint64", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -32240,31 +34290,43 @@ "options": { "validate.rules": [ { - "name": "enum.defined_only", - "value": true + "name": "uint64.gte", + "value": 100000 } ] } + }, + { + "name": "raw_payload", + "description": "", + "label": "", + "type": "bytes", + "longType": "bytes", + "fullType": "bytes", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" } ] }, { - "name": "Message", - "longName": "Message", - "fullName": "ttn.lorawan.v3.Message", - "description": "Message represents a LoRaWAN message", + "name": "RelaySecondChannel", + "longName": "RelaySecondChannel", + "fullName": "ttn.lorawan.v3.RelaySecondChannel", + "description": "", "hasExtensions": false, "hasFields": true, - "hasOneofs": true, + "hasOneofs": false, "extensions": [], "fields": [ { - "name": "m_hdr", - "description": "", + "name": "ack_offset", + "description": "The frequency (Hz) offset used for the WOR acknowledgement.", "label": "", - "type": "MHDR", - "longType": "MHDR", - "fullType": "ttn.lorawan.v3.MHDR", + "type": "RelaySecondChAckOffset", + "longType": "RelaySecondChAckOffset", + "fullType": "ttn.lorawan.v3.RelaySecondChAckOffset", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -32272,19 +34334,19 @@ "options": { "validate.rules": [ { - "name": "message.required", + "name": "enum.defined_only", "value": true } ] } }, { - "name": "mic", - "description": "", + "name": "data_rate_index", + "description": "The data rate index used by the WOR and WOR acknowledgement.", "label": "", - "type": "bytes", - "longType": "bytes", - "fullType": "bytes", + "type": "DataRateIndex", + "longType": "DataRateIndex", + "fullType": "ttn.lorawan.v3.DataRateIndex", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -32292,83 +34354,19 @@ "options": { "validate.rules": [ { - "name": "bytes.min_len", - "value": 0 - }, - { - "name": "bytes.max_len", - "value": 4 + "name": "enum.defined_only", + "value": true } ] } }, { - "name": "mac_payload", - "description": "", - "label": "", - "type": "MACPayload", - "longType": "MACPayload", - "fullType": "ttn.lorawan.v3.MACPayload", - "ismap": false, - "isoneof": true, - "oneofdecl": "Payload", - "defaultValue": "" - }, - { - "name": "join_request_payload", - "description": "", - "label": "", - "type": "JoinRequestPayload", - "longType": "JoinRequestPayload", - "fullType": "ttn.lorawan.v3.JoinRequestPayload", - "ismap": false, - "isoneof": true, - "oneofdecl": "Payload", - "defaultValue": "" - }, - { - "name": "join_accept_payload", - "description": "", - "label": "", - "type": "JoinAcceptPayload", - "longType": "JoinAcceptPayload", - "fullType": "ttn.lorawan.v3.JoinAcceptPayload", - "ismap": false, - "isoneof": true, - "oneofdecl": "Payload", - "defaultValue": "" - }, - { - "name": "rejoin_request_payload", - "description": "", - "label": "", - "type": "RejoinRequestPayload", - "longType": "RejoinRequestPayload", - "fullType": "ttn.lorawan.v3.RejoinRequestPayload", - "ismap": false, - "isoneof": true, - "oneofdecl": "Payload", - "defaultValue": "" - } - ] - }, - { - "name": "PingSlotPeriodValue", - "longName": "PingSlotPeriodValue", - "fullName": "ttn.lorawan.v3.PingSlotPeriodValue", - "description": "", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ - { - "name": "value", - "description": "", + "name": "frequency", + "description": "The frequency (Hz) used by the wake on radio message.", "label": "", - "type": "PingSlotPeriod", - "longType": "PingSlotPeriod", - "fullType": "ttn.lorawan.v3.PingSlotPeriod", + "type": "uint64", + "longType": "uint64", + "fullType": "uint64", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -32376,8 +34374,8 @@ "options": { "validate.rules": [ { - "name": "enum.defined_only", - "value": true + "name": "uint64.gte", + "value": 100000 } ] } @@ -32385,9 +34383,9 @@ ] }, { - "name": "RejoinRequestPayload", - "longName": "RejoinRequestPayload", - "fullName": "ttn.lorawan.v3.RejoinRequestPayload", + "name": "RelayUplinkForwardLimits", + "longName": "RelayUplinkForwardLimits", + "fullName": "ttn.lorawan.v3.RelayUplinkForwardLimits", "description": "", "hasExtensions": false, "hasFields": true, @@ -32395,12 +34393,12 @@ "extensions": [], "fields": [ { - "name": "rejoin_type", - "description": "", + "name": "bucket_size", + "description": "The multiplier used to compute the total bucket size for the limits.\nThe multiplier is multiplied by the reload rate in order to compute the total bucket size.", "label": "", - "type": "RejoinRequestType", - "longType": "RejoinRequestType", - "fullType": "ttn.lorawan.v3.RejoinRequestType", + "type": "RelayLimitBucketSize", + "longType": "RelayLimitBucketSize", + "fullType": "ttn.lorawan.v3.RelayLimitBucketSize", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -32415,12 +34413,12 @@ } }, { - "name": "net_id", - "description": "", + "name": "reload_rate", + "description": "The number of tokens which are replenished in the bucket every hour.", "label": "", - "type": "bytes", - "longType": "bytes", - "fullType": "bytes", + "type": "uint32", + "longType": "uint32", + "fullType": "uint32", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -32428,19 +34426,31 @@ "options": { "validate.rules": [ { - "name": "bytes.len", - "value": 3 + "name": "uint32.lte", + "value": 62 } ] } - }, + } + ] + }, + { + "name": "RelayUplinkToken", + "longName": "RelayUplinkToken", + "fullName": "ttn.lorawan.v3.RelayUplinkToken", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ { - "name": "join_eui", + "name": "ids", "description": "", "label": "", - "type": "bytes", - "longType": "bytes", - "fullType": "bytes", + "type": "EndDeviceIdentifiers", + "longType": "EndDeviceIdentifiers", + "fullType": "ttn.lorawan.v3.EndDeviceIdentifiers", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -32448,14 +34458,14 @@ "options": { "validate.rules": [ { - "name": "bytes.len", - "value": 8 + "name": "message.required", + "value": true } ] } }, { - "name": "dev_eui", + "name": "session_key_id", "description": "", "label": "", "type": "bytes", @@ -32464,19 +34474,11 @@ "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "", - "options": { - "validate.rules": [ - { - "name": "bytes.len", - "value": 8 - } - ] - } + "defaultValue": "" }, { - "name": "rejoin_cnt", - "description": "Contains RJCount0 or RJCount1 depending on rejoin_type.", + "name": "full_f_cnt", + "description": "", "label": "", "type": "uint32", "longType": "uint32", @@ -35527,6 +37529,62 @@ } ] }, + { + "name": "RelayMetadata", + "longName": "RelayMetadata", + "fullName": "ttn.lorawan.v3.RelayMetadata", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "device_id", + "description": "End device identifiers of the relay.", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "string.max_len", + "value": 36 + }, + { + "name": "string.pattern", + "value": "^[a-z0-9](?:[-]?[a-z0-9]){2,}$" + } + ] + } + }, + { + "name": "wor_channel", + "description": "Wake on radio channel.", + "label": "", + "type": "RelayWORChannel", + "longType": "RelayWORChannel", + "fullType": "ttn.lorawan.v3.RelayWORChannel", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "enum.defined_only", + "value": true + } + ] + } + } + ] + }, { "name": "RxMetadata", "longName": "RxMetadata", @@ -35569,6 +37627,18 @@ "oneofdecl": "", "defaultValue": "" }, + { + "name": "relay", + "description": "", + "label": "", + "type": "RelayMetadata", + "longType": "RelayMetadata", + "fullType": "ttn.lorawan.v3.RelayMetadata", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, { "name": "antenna_index", "description": "", diff --git a/sdk/js/generated/device-entity-map.json b/sdk/js/generated/device-entity-map.json index 21baca6d33..bc8ad6cddc 100644 --- a/sdk/js/generated/device-entity-map.json +++ b/sdk/js/generated/device-entity-map.json @@ -726,6 +726,176 @@ "ns" ] }, + "desired_relay": { + "_root": [ + "ns", + "ns" + ], + "mode": { + "_root": [ + "ns", + "ns" + ], + "served": { + "_root": [ + "ns", + "ns" + ], + "backoff": [ + "ns", + "ns" + ], + "mode": { + "_root": [ + "ns", + "ns" + ], + "always": [ + "ns", + "ns" + ], + "dynamic": { + "_root": [ + "ns", + "ns" + ], + "smart_enable_level": [ + "ns", + "ns" + ] + }, + "end_device_controlled": [ + "ns", + "ns" + ] + }, + "second_channel": { + "_root": [ + "ns", + "ns" + ], + "ack_offset": [ + "ns", + "ns" + ], + "data_rate_index": [ + "ns", + "ns" + ], + "frequency": [ + "ns", + "ns" + ] + }, + "serving_device_id": [ + "ns", + "ns" + ] + }, + "serving": { + "_root": [ + "ns", + "ns" + ], + "cad_periodicity": [ + "ns", + "ns" + ], + "default_channel_index": [ + "ns", + "ns" + ], + "limits": { + "_root": [ + "ns", + "ns" + ], + "join_requests": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + }, + "notifications": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + }, + "overall": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + }, + "reset_behavior": [ + "ns", + "ns" + ], + "uplink_messages": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + } + }, + "second_channel": { + "_root": [ + "ns", + "ns" + ], + "ack_offset": [ + "ns", + "ns" + ], + "data_rate_index": [ + "ns", + "ns" + ], + "frequency": [ + "ns", + "ns" + ] + }, + "uplink_forwarding_rules": [ + "ns", + "ns" + ] + } + } + }, "desired_rx1_data_rate_offset": { "_root": [ "ns", @@ -810,6 +980,176 @@ "ns" ] }, + "relay": { + "_root": [ + "ns", + "ns" + ], + "mode": { + "_root": [ + "ns", + "ns" + ], + "served": { + "_root": [ + "ns", + "ns" + ], + "backoff": [ + "ns", + "ns" + ], + "mode": { + "_root": [ + "ns", + "ns" + ], + "always": [ + "ns", + "ns" + ], + "dynamic": { + "_root": [ + "ns", + "ns" + ], + "smart_enable_level": [ + "ns", + "ns" + ] + }, + "end_device_controlled": [ + "ns", + "ns" + ] + }, + "second_channel": { + "_root": [ + "ns", + "ns" + ], + "ack_offset": [ + "ns", + "ns" + ], + "data_rate_index": [ + "ns", + "ns" + ], + "frequency": [ + "ns", + "ns" + ] + }, + "serving_device_id": [ + "ns", + "ns" + ] + }, + "serving": { + "_root": [ + "ns", + "ns" + ], + "cad_periodicity": [ + "ns", + "ns" + ], + "default_channel_index": [ + "ns", + "ns" + ], + "limits": { + "_root": [ + "ns", + "ns" + ], + "join_requests": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + }, + "notifications": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + }, + "overall": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + }, + "reset_behavior": [ + "ns", + "ns" + ], + "uplink_messages": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + } + }, + "second_channel": { + "_root": [ + "ns", + "ns" + ], + "ack_offset": [ + "ns", + "ns" + ], + "data_rate_index": [ + "ns", + "ns" + ], + "frequency": [ + "ns", + "ns" + ] + }, + "uplink_forwarding_rules": [ + "ns", + "ns" + ] + } + } + }, "resets_f_cnt": { "_root": [ "ns", @@ -997,18 +1337,188 @@ "ns" ] }, - "ping_slot_frequency": [ - "ns", - "ns" - ], - "rejoin_count_periodicity": [ - "ns", - "ns" - ], - "rejoin_time_periodicity": [ - "ns", - "ns" - ], + "ping_slot_frequency": [ + "ns", + "ns" + ], + "rejoin_count_periodicity": [ + "ns", + "ns" + ], + "rejoin_time_periodicity": [ + "ns", + "ns" + ], + "relay": { + "_root": [ + "ns", + "ns" + ], + "mode": { + "_root": [ + "ns", + "ns" + ], + "served": { + "_root": [ + "ns", + "ns" + ], + "backoff": [ + "ns", + "ns" + ], + "mode": { + "_root": [ + "ns", + "ns" + ], + "always": [ + "ns", + "ns" + ], + "dynamic": { + "_root": [ + "ns", + "ns" + ], + "smart_enable_level": [ + "ns", + "ns" + ] + }, + "end_device_controlled": [ + "ns", + "ns" + ] + }, + "second_channel": { + "_root": [ + "ns", + "ns" + ], + "ack_offset": [ + "ns", + "ns" + ], + "data_rate_index": [ + "ns", + "ns" + ], + "frequency": [ + "ns", + "ns" + ] + }, + "serving_device_id": [ + "ns", + "ns" + ] + }, + "serving": { + "_root": [ + "ns", + "ns" + ], + "cad_periodicity": [ + "ns", + "ns" + ], + "default_channel_index": [ + "ns", + "ns" + ], + "limits": { + "_root": [ + "ns", + "ns" + ], + "join_requests": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + }, + "notifications": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + }, + "overall": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + }, + "reset_behavior": [ + "ns", + "ns" + ], + "uplink_messages": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + } + }, + "second_channel": { + "_root": [ + "ns", + "ns" + ], + "ack_offset": [ + "ns", + "ns" + ], + "data_rate_index": [ + "ns", + "ns" + ], + "frequency": [ + "ns", + "ns" + ] + }, + "uplink_forwarding_rules": [ + "ns", + "ns" + ] + } + } + }, "rx1_data_rate_offset": [ "ns", "ns" @@ -1121,6 +1631,176 @@ "ns", "ns" ], + "relay": { + "_root": [ + "ns", + "ns" + ], + "mode": { + "_root": [ + "ns", + "ns" + ], + "served": { + "_root": [ + "ns", + "ns" + ], + "backoff": [ + "ns", + "ns" + ], + "mode": { + "_root": [ + "ns", + "ns" + ], + "always": [ + "ns", + "ns" + ], + "dynamic": { + "_root": [ + "ns", + "ns" + ], + "smart_enable_level": [ + "ns", + "ns" + ] + }, + "end_device_controlled": [ + "ns", + "ns" + ] + }, + "second_channel": { + "_root": [ + "ns", + "ns" + ], + "ack_offset": [ + "ns", + "ns" + ], + "data_rate_index": [ + "ns", + "ns" + ], + "frequency": [ + "ns", + "ns" + ] + }, + "serving_device_id": [ + "ns", + "ns" + ] + }, + "serving": { + "_root": [ + "ns", + "ns" + ], + "cad_periodicity": [ + "ns", + "ns" + ], + "default_channel_index": [ + "ns", + "ns" + ], + "limits": { + "_root": [ + "ns", + "ns" + ], + "join_requests": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + }, + "notifications": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + }, + "overall": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + }, + "reset_behavior": [ + "ns", + "ns" + ], + "uplink_messages": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + } + }, + "second_channel": { + "_root": [ + "ns", + "ns" + ], + "ack_offset": [ + "ns", + "ns" + ], + "data_rate_index": [ + "ns", + "ns" + ], + "frequency": [ + "ns", + "ns" + ] + }, + "uplink_forwarding_rules": [ + "ns", + "ns" + ] + } + } + }, "rx1_data_rate_offset": [ "ns", "ns" @@ -1224,6 +1904,16 @@ "ns" ] }, + "pending_relay_downlink": { + "_root": [ + "ns", + "ns" + ], + "raw_payload": [ + "ns", + "ns" + ] + }, "pending_requests": [ "ns", "ns" @@ -1377,6 +2067,176 @@ "ns", "ns" ], + "relay": { + "_root": [ + "ns", + "ns" + ], + "mode": { + "_root": [ + "ns", + "ns" + ], + "served": { + "_root": [ + "ns", + "ns" + ], + "backoff": [ + "ns", + "ns" + ], + "mode": { + "_root": [ + "ns", + "ns" + ], + "always": [ + "ns", + "ns" + ], + "dynamic": { + "_root": [ + "ns", + "ns" + ], + "smart_enable_level": [ + "ns", + "ns" + ] + }, + "end_device_controlled": [ + "ns", + "ns" + ] + }, + "second_channel": { + "_root": [ + "ns", + "ns" + ], + "ack_offset": [ + "ns", + "ns" + ], + "data_rate_index": [ + "ns", + "ns" + ], + "frequency": [ + "ns", + "ns" + ] + }, + "serving_device_id": [ + "ns", + "ns" + ] + }, + "serving": { + "_root": [ + "ns", + "ns" + ], + "cad_periodicity": [ + "ns", + "ns" + ], + "default_channel_index": [ + "ns", + "ns" + ], + "limits": { + "_root": [ + "ns", + "ns" + ], + "join_requests": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + }, + "notifications": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + }, + "overall": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + }, + "reset_behavior": [ + "ns", + "ns" + ], + "uplink_messages": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + } + }, + "second_channel": { + "_root": [ + "ns", + "ns" + ], + "ack_offset": [ + "ns", + "ns" + ], + "data_rate_index": [ + "ns", + "ns" + ], + "frequency": [ + "ns", + "ns" + ] + }, + "uplink_forwarding_rules": [ + "ns", + "ns" + ] + } + } + }, "rx1_data_rate_offset": [ "ns", "ns" @@ -1489,6 +2349,176 @@ "ns", "ns" ], + "relay": { + "_root": [ + "ns", + "ns" + ], + "mode": { + "_root": [ + "ns", + "ns" + ], + "served": { + "_root": [ + "ns", + "ns" + ], + "backoff": [ + "ns", + "ns" + ], + "mode": { + "_root": [ + "ns", + "ns" + ], + "always": [ + "ns", + "ns" + ], + "dynamic": { + "_root": [ + "ns", + "ns" + ], + "smart_enable_level": [ + "ns", + "ns" + ] + }, + "end_device_controlled": [ + "ns", + "ns" + ] + }, + "second_channel": { + "_root": [ + "ns", + "ns" + ], + "ack_offset": [ + "ns", + "ns" + ], + "data_rate_index": [ + "ns", + "ns" + ], + "frequency": [ + "ns", + "ns" + ] + }, + "serving_device_id": [ + "ns", + "ns" + ] + }, + "serving": { + "_root": [ + "ns", + "ns" + ], + "cad_periodicity": [ + "ns", + "ns" + ], + "default_channel_index": [ + "ns", + "ns" + ], + "limits": { + "_root": [ + "ns", + "ns" + ], + "join_requests": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + }, + "notifications": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + }, + "overall": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + }, + "reset_behavior": [ + "ns", + "ns" + ], + "uplink_messages": { + "_root": [ + "ns", + "ns" + ], + "bucket_size": [ + "ns", + "ns" + ], + "reload_rate": [ + "ns", + "ns" + ] + } + }, + "second_channel": { + "_root": [ + "ns", + "ns" + ], + "ack_offset": [ + "ns", + "ns" + ], + "data_rate_index": [ + "ns", + "ns" + ], + "frequency": [ + "ns", + "ns" + ] + }, + "uplink_forwarding_rules": [ + "ns", + "ns" + ] + } + } + }, "rx1_data_rate_offset": [ "ns", "ns"