// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 // protoc v3.21.12 // source: protobufs/mesh.proto package protobufs import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // Note: these enum names must EXACTLY match the string used in the device // bin/build-all.sh script. // Because they will be used to find firmware filenames in the android app for OTA updates. // To match the old style filenames, _ is converted to -, p is converted to . type HardwareModel int32 const ( // TODO: REPLACE HardwareModel_UNSET HardwareModel = 0 // TODO: REPLACE HardwareModel_TLORA_V2 HardwareModel = 1 // TODO: REPLACE HardwareModel_TLORA_V1 HardwareModel = 2 // TODO: REPLACE HardwareModel_TLORA_V2_1_1P6 HardwareModel = 3 // TODO: REPLACE HardwareModel_TBEAM HardwareModel = 4 // The original heltec WiFi_Lora_32_V2, which had battery voltage sensing hooked to GPIO 13 // (see HELTEC_V2 for the new version). HardwareModel_HELTEC_V2_0 HardwareModel = 5 // TODO: REPLACE HardwareModel_TBEAM_V0P7 HardwareModel = 6 // TODO: REPLACE HardwareModel_T_ECHO HardwareModel = 7 // TODO: REPLACE HardwareModel_TLORA_V1_1P3 HardwareModel = 8 // TODO: REPLACE HardwareModel_RAK4631 HardwareModel = 9 // The new version of the heltec WiFi_Lora_32_V2 board that has battery sensing hooked to GPIO 37. // Sadly they did not update anything on the silkscreen to identify this board HardwareModel_HELTEC_V2_1 HardwareModel = 10 // Ancient heltec WiFi_Lora_32 board HardwareModel_HELTEC_V1 HardwareModel = 11 // New T-BEAM with ESP32-S3 CPU HardwareModel_LILYGO_TBEAM_S3_CORE HardwareModel = 12 // RAK WisBlock ESP32 core: https://docs.rakwireless.com/Product-Categories/WisBlock/RAK11200/Overview/ HardwareModel_RAK11200 HardwareModel = 13 // B&Q Consulting Nano Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:nano HardwareModel_NANO_G1 HardwareModel = 14 // TODO: REPLACE HardwareModel_TLORA_V2_1_1P8 HardwareModel = 15 // TODO: REPLACE HardwareModel_TLORA_T3_S3 HardwareModel = 16 // B&Q Consulting Nano G1 Explorer: https://wiki.uniteng.com/en/meshtastic/nano-g1-explorer HardwareModel_NANO_G1_EXPLORER HardwareModel = 17 // B&Q Consulting Nano G2 Ultra: https://wiki.uniteng.com/en/meshtastic/nano-g2-ultra HardwareModel_NANO_G2_ULTRA HardwareModel = 18 // LoRAType device: https://loratype.org/ HardwareModel_LORA_TYPE HardwareModel = 19 // wiphone https://www.wiphone.io/ HardwareModel_WIPHONE HardwareModel = 20 // WIO Tracker WM1110 family from Seeed Studio. Includes wio-1110-tracker and wio-1110-sdk HardwareModel_WIO_WM1110 HardwareModel = 21 // RAK2560 Solar base station based on RAK4630 HardwareModel_RAK2560 HardwareModel = 22 // Heltec HRU-3601: https://heltec.org/project/hru-3601/ HardwareModel_HELTEC_HRU_3601 HardwareModel = 23 // Heltec Wireless Bridge HardwareModel_HELTEC_WIRELESS_BRIDGE HardwareModel = 24 // B&Q Consulting Station Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:station HardwareModel_STATION_G1 HardwareModel = 25 // RAK11310 (RP2040 + SX1262) HardwareModel_RAK11310 HardwareModel = 26 // Makerfabs SenseLoRA Receiver (RP2040 + RFM96) HardwareModel_SENSELORA_RP2040 HardwareModel = 27 // Makerfabs SenseLoRA Industrial Monitor (ESP32-S3 + RFM96) HardwareModel_SENSELORA_S3 HardwareModel = 28 // Canary Radio Company - CanaryOne: https://canaryradio.io/products/canaryone HardwareModel_CANARYONE HardwareModel = 29 // Waveshare RP2040 LoRa - https://www.waveshare.com/rp2040-lora.htm HardwareModel_RP2040_LORA HardwareModel = 30 // B&Q Consulting Station G2: https://wiki.uniteng.com/en/meshtastic/station-g2 HardwareModel_STATION_G2 HardwareModel = 31 // --------------------------------------------------------------------------- // Less common/prototype boards listed here (needs one more byte over the air) // --------------------------------------------------------------------------- HardwareModel_LORA_RELAY_V1 HardwareModel = 32 // TODO: REPLACE HardwareModel_NRF52840DK HardwareModel = 33 // TODO: REPLACE HardwareModel_PPR HardwareModel = 34 // TODO: REPLACE HardwareModel_GENIEBLOCKS HardwareModel = 35 // TODO: REPLACE HardwareModel_NRF52_UNKNOWN HardwareModel = 36 // TODO: REPLACE HardwareModel_PORTDUINO HardwareModel = 37 // The simulator built into the android app HardwareModel_ANDROID_SIM HardwareModel = 38 // Custom DIY device based on @NanoVHF schematics: https://github.com/NanoVHF/Meshtastic-DIY/tree/main/Schematics HardwareModel_DIY_V1 HardwareModel = 39 // nRF52840 Dongle : https://www.nordicsemi.com/Products/Development-hardware/nrf52840-dongle/ HardwareModel_NRF52840_PCA10059 HardwareModel = 40 // Custom Disaster Radio esp32 v3 device https://github.com/sudomesh/disaster-radio/tree/master/hardware/board_esp32_v3 HardwareModel_DR_DEV HardwareModel = 41 // M5 esp32 based MCU modules with enclosure, TFT and LORA Shields. All Variants (Basic, Core, Fire, Core2, CoreS3, Paper) https://m5stack.com/ HardwareModel_M5STACK HardwareModel = 42 // New Heltec LoRA32 with ESP32-S3 CPU HardwareModel_HELTEC_V3 HardwareModel = 43 // New Heltec Wireless Stick Lite with ESP32-S3 CPU HardwareModel_HELTEC_WSL_V3 HardwareModel = 44 // New BETAFPV ELRS Micro TX Module 2.4G with ESP32 CPU HardwareModel_BETAFPV_2400_TX HardwareModel = 45 // BetaFPV ExpressLRS "Nano" TX Module 900MHz with ESP32 CPU HardwareModel_BETAFPV_900_NANO_TX HardwareModel = 46 // Raspberry Pi Pico (W) with Waveshare SX1262 LoRa Node Module HardwareModel_RPI_PICO HardwareModel = 47 // Heltec Wireless Tracker with ESP32-S3 CPU, built-in GPS, and TFT // Newer V1.1, version is written on the PCB near the display. HardwareModel_HELTEC_WIRELESS_TRACKER HardwareModel = 48 // Heltec Wireless Paper with ESP32-S3 CPU and E-Ink display HardwareModel_HELTEC_WIRELESS_PAPER HardwareModel = 49 // LilyGo T-Deck with ESP32-S3 CPU, Keyboard and IPS display HardwareModel_T_DECK HardwareModel = 50 // LilyGo T-Watch S3 with ESP32-S3 CPU and IPS display HardwareModel_T_WATCH_S3 HardwareModel = 51 // Bobricius Picomputer with ESP32-S3 CPU, Keyboard and IPS display HardwareModel_PICOMPUTER_S3 HardwareModel = 52 // Heltec HT-CT62 with ESP32-C3 CPU and SX1262 LoRa HardwareModel_HELTEC_HT62 HardwareModel = 53 // EBYTE SPI LoRa module and ESP32-S3 HardwareModel_EBYTE_ESP32_S3 HardwareModel = 54 // Waveshare ESP32-S3-PICO with PICO LoRa HAT and 2.9inch e-Ink HardwareModel_ESP32_S3_PICO HardwareModel = 55 // CircuitMess Chatter 2 LLCC68 Lora Module and ESP32 Wroom // Lora module can be swapped out for a Heltec RA-62 which is "almost" pin compatible // with one cut and one jumper Meshtastic works HardwareModel_CHATTER_2 HardwareModel = 56 // Heltec Wireless Paper, With ESP32-S3 CPU and E-Ink display // Older "V1.0" Variant, has no "version sticker" // E-Ink model is DEPG0213BNS800 // Tab on the screen protector is RED // Flex connector marking is FPC-7528B HardwareModel_HELTEC_WIRELESS_PAPER_V1_0 HardwareModel = 57 // Heltec Wireless Tracker with ESP32-S3 CPU, built-in GPS, and TFT // Older "V1.0" Variant HardwareModel_HELTEC_WIRELESS_TRACKER_V1_0 HardwareModel = 58 // unPhone with ESP32-S3, TFT touchscreen, LSM6DS3TR-C accelerometer and gyroscope HardwareModel_UNPHONE HardwareModel = 59 // Teledatics TD-LORAC NRF52840 based M.2 LoRA module // Compatible with the TD-WRLS development board HardwareModel_TD_LORAC HardwareModel = 60 // CDEBYTE EoRa-S3 board using their own MM modules, clone of LILYGO T3S3 HardwareModel_CDEBYTE_EORA_S3 HardwareModel = 61 // TWC_MESH_V4 // Adafruit NRF52840 feather express with SX1262, SSD1306 OLED and NEO6M GPS HardwareModel_TWC_MESH_V4 HardwareModel = 62 // NRF52_PROMICRO_DIY // Promicro NRF52840 with SX1262/LLCC68, SSD1306 OLED and NEO6M GPS HardwareModel_NRF52_PROMICRO_DIY HardwareModel = 63 // RadioMaster 900 Bandit Nano, https://www.radiomasterrc.com/products/bandit-nano-expresslrs-rf-module // ESP32-D0WDQ6 With SX1276/SKY66122, SSD1306 OLED and No GPS HardwareModel_RADIOMASTER_900_BANDIT_NANO HardwareModel = 64 // Heltec Capsule Sensor V3 with ESP32-S3 CPU, Portable LoRa device that can replace GNSS modules or sensors HardwareModel_HELTEC_CAPSULE_SENSOR_V3 HardwareModel = 65 // Heltec Vision Master T190 with ESP32-S3 CPU, and a 1.90 inch TFT display HardwareModel_HELTEC_VISION_MASTER_T190 HardwareModel = 66 // Heltec Vision Master E213 with ESP32-S3 CPU, and a 2.13 inch E-Ink display HardwareModel_HELTEC_VISION_MASTER_E213 HardwareModel = 67 // Heltec Vision Master E290 with ESP32-S3 CPU, and a 2.9 inch E-Ink display HardwareModel_HELTEC_VISION_MASTER_E290 HardwareModel = 68 // Heltec Mesh Node T114 board with nRF52840 CPU, and a 1.14 inch TFT display, Ultimate low-power design, // specifically adapted for the Meshtatic project HardwareModel_HELTEC_MESH_NODE_T114 HardwareModel = 69 // Sensecap Indicator from Seeed Studio. ESP32-S3 device with TFT and RP2040 coprocessor HardwareModel_SENSECAP_INDICATOR HardwareModel = 70 // Seeed studio T1000-E tracker card. NRF52840 w/ LR1110 radio, GPS, button, buzzer, and sensors. HardwareModel_TRACKER_T1000_E HardwareModel = 71 // RAK3172 STM32WLE5 Module (https://store.rakwireless.com/products/wisduo-lpwan-module-rak3172) HardwareModel_RAK3172 HardwareModel = 72 // Seeed Studio Wio-E5 (either mini or Dev kit) using STM32WL chip. HardwareModel_WIO_E5 HardwareModel = 73 // RadioMaster 900 Bandit, https://www.radiomasterrc.com/products/bandit-expresslrs-rf-module // SSD1306 OLED and No GPS HardwareModel_RADIOMASTER_900_BANDIT HardwareModel = 74 // Minewsemi ME25LS01 (ME25LE01_V1.0). NRF52840 w/ LR1110 radio, buttons and leds and pins. HardwareModel_ME25LS01_4Y10TD HardwareModel = 75 // RP2040_FEATHER_RFM95 // Adafruit Feather RP2040 with RFM95 LoRa Radio RFM95 with SX1272, SSD1306 OLED // https://www.adafruit.com/product/5714 // https://www.adafruit.com/product/326 // https://www.adafruit.com/product/938 // // ^^^ short A0 to switch to I2C address 0x3C HardwareModel_RP2040_FEATHER_RFM95 HardwareModel = 76 // M5 esp32 based MCU modules with enclosure, TFT and LORA Shields. All Variants (Basic, Core, Fire, Core2, CoreS3, Paper) https://m5stack.com/ HardwareModel_M5STACK_COREBASIC HardwareModel = 77 HardwareModel_M5STACK_CORE2 HardwareModel = 78 // Pico2 with Waveshare Hat, same as Pico HardwareModel_RPI_PICO2 HardwareModel = 79 // M5 esp32 based MCU modules with enclosure, TFT and LORA Shields. All Variants (Basic, Core, Fire, Core2, CoreS3, Paper) https://m5stack.com/ HardwareModel_M5STACK_CORES3 HardwareModel = 80 // Seeed XIAO S3 DK HardwareModel_SEEED_XIAO_S3 HardwareModel = 81 // Nordic nRF52840+Semtech SX1262 LoRa BLE Combo Module. nRF52840+SX1262 MS24SF1 HardwareModel_MS24SF1 HardwareModel = 82 // Lilygo TLora-C6 with the new ESP32-C6 MCU HardwareModel_TLORA_C6 HardwareModel = 83 // ------------------------------------------------------------------------------------------------------------------------------------------ // Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits. // ------------------------------------------------------------------------------------------------------------------------------------------ HardwareModel_PRIVATE_HW HardwareModel = 255 ) // Enum value maps for HardwareModel. var ( HardwareModel_name = map[int32]string{ 0: "UNSET", 1: "TLORA_V2", 2: "TLORA_V1", 3: "TLORA_V2_1_1P6", 4: "TBEAM", 5: "HELTEC_V2_0", 6: "TBEAM_V0P7", 7: "T_ECHO", 8: "TLORA_V1_1P3", 9: "RAK4631", 10: "HELTEC_V2_1", 11: "HELTEC_V1", 12: "LILYGO_TBEAM_S3_CORE", 13: "RAK11200", 14: "NANO_G1", 15: "TLORA_V2_1_1P8", 16: "TLORA_T3_S3", 17: "NANO_G1_EXPLORER", 18: "NANO_G2_ULTRA", 19: "LORA_TYPE", 20: "WIPHONE", 21: "WIO_WM1110", 22: "RAK2560", 23: "HELTEC_HRU_3601", 24: "HELTEC_WIRELESS_BRIDGE", 25: "STATION_G1", 26: "RAK11310", 27: "SENSELORA_RP2040", 28: "SENSELORA_S3", 29: "CANARYONE", 30: "RP2040_LORA", 31: "STATION_G2", 32: "LORA_RELAY_V1", 33: "NRF52840DK", 34: "PPR", 35: "GENIEBLOCKS", 36: "NRF52_UNKNOWN", 37: "PORTDUINO", 38: "ANDROID_SIM", 39: "DIY_V1", 40: "NRF52840_PCA10059", 41: "DR_DEV", 42: "M5STACK", 43: "HELTEC_V3", 44: "HELTEC_WSL_V3", 45: "BETAFPV_2400_TX", 46: "BETAFPV_900_NANO_TX", 47: "RPI_PICO", 48: "HELTEC_WIRELESS_TRACKER", 49: "HELTEC_WIRELESS_PAPER", 50: "T_DECK", 51: "T_WATCH_S3", 52: "PICOMPUTER_S3", 53: "HELTEC_HT62", 54: "EBYTE_ESP32_S3", 55: "ESP32_S3_PICO", 56: "CHATTER_2", 57: "HELTEC_WIRELESS_PAPER_V1_0", 58: "HELTEC_WIRELESS_TRACKER_V1_0", 59: "UNPHONE", 60: "TD_LORAC", 61: "CDEBYTE_EORA_S3", 62: "TWC_MESH_V4", 63: "NRF52_PROMICRO_DIY", 64: "RADIOMASTER_900_BANDIT_NANO", 65: "HELTEC_CAPSULE_SENSOR_V3", 66: "HELTEC_VISION_MASTER_T190", 67: "HELTEC_VISION_MASTER_E213", 68: "HELTEC_VISION_MASTER_E290", 69: "HELTEC_MESH_NODE_T114", 70: "SENSECAP_INDICATOR", 71: "TRACKER_T1000_E", 72: "RAK3172", 73: "WIO_E5", 74: "RADIOMASTER_900_BANDIT", 75: "ME25LS01_4Y10TD", 76: "RP2040_FEATHER_RFM95", 77: "M5STACK_COREBASIC", 78: "M5STACK_CORE2", 79: "RPI_PICO2", 80: "M5STACK_CORES3", 81: "SEEED_XIAO_S3", 82: "MS24SF1", 83: "TLORA_C6", 255: "PRIVATE_HW", } HardwareModel_value = map[string]int32{ "UNSET": 0, "TLORA_V2": 1, "TLORA_V1": 2, "TLORA_V2_1_1P6": 3, "TBEAM": 4, "HELTEC_V2_0": 5, "TBEAM_V0P7": 6, "T_ECHO": 7, "TLORA_V1_1P3": 8, "RAK4631": 9, "HELTEC_V2_1": 10, "HELTEC_V1": 11, "LILYGO_TBEAM_S3_CORE": 12, "RAK11200": 13, "NANO_G1": 14, "TLORA_V2_1_1P8": 15, "TLORA_T3_S3": 16, "NANO_G1_EXPLORER": 17, "NANO_G2_ULTRA": 18, "LORA_TYPE": 19, "WIPHONE": 20, "WIO_WM1110": 21, "RAK2560": 22, "HELTEC_HRU_3601": 23, "HELTEC_WIRELESS_BRIDGE": 24, "STATION_G1": 25, "RAK11310": 26, "SENSELORA_RP2040": 27, "SENSELORA_S3": 28, "CANARYONE": 29, "RP2040_LORA": 30, "STATION_G2": 31, "LORA_RELAY_V1": 32, "NRF52840DK": 33, "PPR": 34, "GENIEBLOCKS": 35, "NRF52_UNKNOWN": 36, "PORTDUINO": 37, "ANDROID_SIM": 38, "DIY_V1": 39, "NRF52840_PCA10059": 40, "DR_DEV": 41, "M5STACK": 42, "HELTEC_V3": 43, "HELTEC_WSL_V3": 44, "BETAFPV_2400_TX": 45, "BETAFPV_900_NANO_TX": 46, "RPI_PICO": 47, "HELTEC_WIRELESS_TRACKER": 48, "HELTEC_WIRELESS_PAPER": 49, "T_DECK": 50, "T_WATCH_S3": 51, "PICOMPUTER_S3": 52, "HELTEC_HT62": 53, "EBYTE_ESP32_S3": 54, "ESP32_S3_PICO": 55, "CHATTER_2": 56, "HELTEC_WIRELESS_PAPER_V1_0": 57, "HELTEC_WIRELESS_TRACKER_V1_0": 58, "UNPHONE": 59, "TD_LORAC": 60, "CDEBYTE_EORA_S3": 61, "TWC_MESH_V4": 62, "NRF52_PROMICRO_DIY": 63, "RADIOMASTER_900_BANDIT_NANO": 64, "HELTEC_CAPSULE_SENSOR_V3": 65, "HELTEC_VISION_MASTER_T190": 66, "HELTEC_VISION_MASTER_E213": 67, "HELTEC_VISION_MASTER_E290": 68, "HELTEC_MESH_NODE_T114": 69, "SENSECAP_INDICATOR": 70, "TRACKER_T1000_E": 71, "RAK3172": 72, "WIO_E5": 73, "RADIOMASTER_900_BANDIT": 74, "ME25LS01_4Y10TD": 75, "RP2040_FEATHER_RFM95": 76, "M5STACK_COREBASIC": 77, "M5STACK_CORE2": 78, "RPI_PICO2": 79, "M5STACK_CORES3": 80, "SEEED_XIAO_S3": 81, "MS24SF1": 82, "TLORA_C6": 83, "PRIVATE_HW": 255, } ) func (x HardwareModel) Enum() *HardwareModel { p := new(HardwareModel) *p = x return p } func (x HardwareModel) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (HardwareModel) Descriptor() protoreflect.EnumDescriptor { return file_protobufs_mesh_proto_enumTypes[0].Descriptor() } func (HardwareModel) Type() protoreflect.EnumType { return &file_protobufs_mesh_proto_enumTypes[0] } func (x HardwareModel) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use HardwareModel.Descriptor instead. func (HardwareModel) EnumDescriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{0} } // Shared constants between device and phone type Constants int32 const ( // First enum must be zero, and we are just using this enum to // pass int constants between two very different environments Constants_ZERO Constants = 0 // From mesh.options // note: this payload length is ONLY the bytes that are sent inside of the Data protobuf (excluding protobuf overhead). The 16 byte header is // outside of this envelope Constants_DATA_PAYLOAD_LEN Constants = 237 ) // Enum value maps for Constants. var ( Constants_name = map[int32]string{ 0: "ZERO", 237: "DATA_PAYLOAD_LEN", } Constants_value = map[string]int32{ "ZERO": 0, "DATA_PAYLOAD_LEN": 237, } ) func (x Constants) Enum() *Constants { p := new(Constants) *p = x return p } func (x Constants) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (Constants) Descriptor() protoreflect.EnumDescriptor { return file_protobufs_mesh_proto_enumTypes[1].Descriptor() } func (Constants) Type() protoreflect.EnumType { return &file_protobufs_mesh_proto_enumTypes[1] } func (x Constants) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use Constants.Descriptor instead. func (Constants) EnumDescriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{1} } // Error codes for critical errors // The device might report these fault codes on the screen. // If you encounter a fault code, please post on the meshtastic.discourse.group // and we'll try to help. type CriticalErrorCode int32 const ( // TODO: REPLACE CriticalErrorCode_NONE CriticalErrorCode = 0 // A software bug was detected while trying to send lora CriticalErrorCode_TX_WATCHDOG CriticalErrorCode = 1 // A software bug was detected on entry to sleep CriticalErrorCode_SLEEP_ENTER_WAIT CriticalErrorCode = 2 // No Lora radio hardware could be found CriticalErrorCode_NO_RADIO CriticalErrorCode = 3 // Not normally used CriticalErrorCode_UNSPECIFIED CriticalErrorCode = 4 // We failed while configuring a UBlox GPS CriticalErrorCode_UBLOX_UNIT_FAILED CriticalErrorCode = 5 // This board was expected to have a power management chip and it is missing or broken CriticalErrorCode_NO_AXP192 CriticalErrorCode = 6 // The channel tried to set a radio setting which is not supported by this chipset, // radio comms settings are now undefined. CriticalErrorCode_INVALID_RADIO_SETTING CriticalErrorCode = 7 // Radio transmit hardware failure. We sent data to the radio chip, but it didn't // reply with an interrupt. CriticalErrorCode_TRANSMIT_FAILED CriticalErrorCode = 8 // We detected that the main CPU voltage dropped below the minimum acceptable value CriticalErrorCode_BROWNOUT CriticalErrorCode = 9 // Selftest of SX1262 radio chip failed CriticalErrorCode_SX1262_FAILURE CriticalErrorCode = 10 // A (likely software but possibly hardware) failure was detected while trying to send packets. // If this occurs on your board, please post in the forum so that we can ask you to collect some information to allow fixing this bug CriticalErrorCode_RADIO_SPI_BUG CriticalErrorCode = 11 // Corruption was detected on the flash filesystem but we were able to repair things. // If you see this failure in the field please post in the forum because we are interested in seeing if this is occurring in the field. CriticalErrorCode_FLASH_CORRUPTION_RECOVERABLE CriticalErrorCode = 12 // Corruption was detected on the flash filesystem but we were unable to repair things. // NOTE: Your node will probably need to be reconfigured the next time it reboots (it will lose the region code etc...) // If you see this failure in the field please post in the forum because we are interested in seeing if this is occurring in the field. CriticalErrorCode_FLASH_CORRUPTION_UNRECOVERABLE CriticalErrorCode = 13 ) // Enum value maps for CriticalErrorCode. var ( CriticalErrorCode_name = map[int32]string{ 0: "NONE", 1: "TX_WATCHDOG", 2: "SLEEP_ENTER_WAIT", 3: "NO_RADIO", 4: "UNSPECIFIED", 5: "UBLOX_UNIT_FAILED", 6: "NO_AXP192", 7: "INVALID_RADIO_SETTING", 8: "TRANSMIT_FAILED", 9: "BROWNOUT", 10: "SX1262_FAILURE", 11: "RADIO_SPI_BUG", 12: "FLASH_CORRUPTION_RECOVERABLE", 13: "FLASH_CORRUPTION_UNRECOVERABLE", } CriticalErrorCode_value = map[string]int32{ "NONE": 0, "TX_WATCHDOG": 1, "SLEEP_ENTER_WAIT": 2, "NO_RADIO": 3, "UNSPECIFIED": 4, "UBLOX_UNIT_FAILED": 5, "NO_AXP192": 6, "INVALID_RADIO_SETTING": 7, "TRANSMIT_FAILED": 8, "BROWNOUT": 9, "SX1262_FAILURE": 10, "RADIO_SPI_BUG": 11, "FLASH_CORRUPTION_RECOVERABLE": 12, "FLASH_CORRUPTION_UNRECOVERABLE": 13, } ) func (x CriticalErrorCode) Enum() *CriticalErrorCode { p := new(CriticalErrorCode) *p = x return p } func (x CriticalErrorCode) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (CriticalErrorCode) Descriptor() protoreflect.EnumDescriptor { return file_protobufs_mesh_proto_enumTypes[2].Descriptor() } func (CriticalErrorCode) Type() protoreflect.EnumType { return &file_protobufs_mesh_proto_enumTypes[2] } func (x CriticalErrorCode) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use CriticalErrorCode.Descriptor instead. func (CriticalErrorCode) EnumDescriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{2} } // How the location was acquired: manual, onboard GPS, external (EUD) GPS type Position_LocSource int32 const ( // TODO: REPLACE Position_LOC_UNSET Position_LocSource = 0 // TODO: REPLACE Position_LOC_MANUAL Position_LocSource = 1 // TODO: REPLACE Position_LOC_INTERNAL Position_LocSource = 2 // TODO: REPLACE Position_LOC_EXTERNAL Position_LocSource = 3 ) // Enum value maps for Position_LocSource. var ( Position_LocSource_name = map[int32]string{ 0: "LOC_UNSET", 1: "LOC_MANUAL", 2: "LOC_INTERNAL", 3: "LOC_EXTERNAL", } Position_LocSource_value = map[string]int32{ "LOC_UNSET": 0, "LOC_MANUAL": 1, "LOC_INTERNAL": 2, "LOC_EXTERNAL": 3, } ) func (x Position_LocSource) Enum() *Position_LocSource { p := new(Position_LocSource) *p = x return p } func (x Position_LocSource) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (Position_LocSource) Descriptor() protoreflect.EnumDescriptor { return file_protobufs_mesh_proto_enumTypes[3].Descriptor() } func (Position_LocSource) Type() protoreflect.EnumType { return &file_protobufs_mesh_proto_enumTypes[3] } func (x Position_LocSource) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use Position_LocSource.Descriptor instead. func (Position_LocSource) EnumDescriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{0, 0} } // How the altitude was acquired: manual, GPS int/ext, etc // Default: same as location_source if present type Position_AltSource int32 const ( // TODO: REPLACE Position_ALT_UNSET Position_AltSource = 0 // TODO: REPLACE Position_ALT_MANUAL Position_AltSource = 1 // TODO: REPLACE Position_ALT_INTERNAL Position_AltSource = 2 // TODO: REPLACE Position_ALT_EXTERNAL Position_AltSource = 3 // TODO: REPLACE Position_ALT_BAROMETRIC Position_AltSource = 4 ) // Enum value maps for Position_AltSource. var ( Position_AltSource_name = map[int32]string{ 0: "ALT_UNSET", 1: "ALT_MANUAL", 2: "ALT_INTERNAL", 3: "ALT_EXTERNAL", 4: "ALT_BAROMETRIC", } Position_AltSource_value = map[string]int32{ "ALT_UNSET": 0, "ALT_MANUAL": 1, "ALT_INTERNAL": 2, "ALT_EXTERNAL": 3, "ALT_BAROMETRIC": 4, } ) func (x Position_AltSource) Enum() *Position_AltSource { p := new(Position_AltSource) *p = x return p } func (x Position_AltSource) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (Position_AltSource) Descriptor() protoreflect.EnumDescriptor { return file_protobufs_mesh_proto_enumTypes[4].Descriptor() } func (Position_AltSource) Type() protoreflect.EnumType { return &file_protobufs_mesh_proto_enumTypes[4] } func (x Position_AltSource) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use Position_AltSource.Descriptor instead. func (Position_AltSource) EnumDescriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{0, 1} } // A failure in delivering a message (usually used for routing control messages, but might be provided in addition to ack.fail_id to provide // details on the type of failure). type Routing_Error int32 const ( // This message is not a failure Routing_NONE Routing_Error = 0 // Our node doesn't have a route to the requested destination anymore. Routing_NO_ROUTE Routing_Error = 1 // We received a nak while trying to forward on your behalf Routing_GOT_NAK Routing_Error = 2 // TODO: REPLACE Routing_TIMEOUT Routing_Error = 3 // No suitable interface could be found for delivering this packet Routing_NO_INTERFACE Routing_Error = 4 // We reached the max retransmission count (typically for naive flood routing) Routing_MAX_RETRANSMIT Routing_Error = 5 // No suitable channel was found for sending this packet (i.e. was requested channel index disabled?) Routing_NO_CHANNEL Routing_Error = 6 // The packet was too big for sending (exceeds interface MTU after encoding) Routing_TOO_LARGE Routing_Error = 7 // The request had want_response set, the request reached the destination node, but no service on that node wants to send a response // (possibly due to bad channel permissions) Routing_NO_RESPONSE Routing_Error = 8 // Cannot send currently because duty cycle regulations will be violated. Routing_DUTY_CYCLE_LIMIT Routing_Error = 9 // The application layer service on the remote node received your request, but considered your request somehow invalid Routing_BAD_REQUEST Routing_Error = 32 // The application layer service on the remote node received your request, but considered your request not authorized // (i.e you did not send the request on the required bound channel) Routing_NOT_AUTHORIZED Routing_Error = 33 // The client specified a PKI transport, but the node was unable to send the packet using PKI (and did not send the message at all) Routing_PKI_FAILED Routing_Error = 34 // The receiving node does not have a Public Key to decode with Routing_PKI_UNKNOWN_PUBKEY Routing_Error = 35 // Admin packet otherwise checks out, but uses a bogus or expired session key Routing_ADMIN_BAD_SESSION_KEY Routing_Error = 36 // Admin packet sent using PKC, but not from a public key on the admin key list Routing_ADMIN_PUBLIC_KEY_UNAUTHORIZED Routing_Error = 37 ) // Enum value maps for Routing_Error. var ( Routing_Error_name = map[int32]string{ 0: "NONE", 1: "NO_ROUTE", 2: "GOT_NAK", 3: "TIMEOUT", 4: "NO_INTERFACE", 5: "MAX_RETRANSMIT", 6: "NO_CHANNEL", 7: "TOO_LARGE", 8: "NO_RESPONSE", 9: "DUTY_CYCLE_LIMIT", 32: "BAD_REQUEST", 33: "NOT_AUTHORIZED", 34: "PKI_FAILED", 35: "PKI_UNKNOWN_PUBKEY", 36: "ADMIN_BAD_SESSION_KEY", 37: "ADMIN_PUBLIC_KEY_UNAUTHORIZED", } Routing_Error_value = map[string]int32{ "NONE": 0, "NO_ROUTE": 1, "GOT_NAK": 2, "TIMEOUT": 3, "NO_INTERFACE": 4, "MAX_RETRANSMIT": 5, "NO_CHANNEL": 6, "TOO_LARGE": 7, "NO_RESPONSE": 8, "DUTY_CYCLE_LIMIT": 9, "BAD_REQUEST": 32, "NOT_AUTHORIZED": 33, "PKI_FAILED": 34, "PKI_UNKNOWN_PUBKEY": 35, "ADMIN_BAD_SESSION_KEY": 36, "ADMIN_PUBLIC_KEY_UNAUTHORIZED": 37, } ) func (x Routing_Error) Enum() *Routing_Error { p := new(Routing_Error) *p = x return p } func (x Routing_Error) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (Routing_Error) Descriptor() protoreflect.EnumDescriptor { return file_protobufs_mesh_proto_enumTypes[5].Descriptor() } func (Routing_Error) Type() protoreflect.EnumType { return &file_protobufs_mesh_proto_enumTypes[5] } func (x Routing_Error) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use Routing_Error.Descriptor instead. func (Routing_Error) EnumDescriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{3, 0} } // The priority of this message for sending. // Higher priorities are sent first (when managing the transmit queue). // This field is never sent over the air, it is only used internally inside of a local device node. // API clients (either on the local node or connected directly to the node) // can set this parameter if necessary. // (values must be <= 127 to keep protobuf field to one byte in size. // Detailed background on this field: // I noticed a funny side effect of lora being so slow: Usually when making // a protocol there isn’t much need to use message priority to change the order // of transmission (because interfaces are fairly fast). // But for lora where packets can take a few seconds each, it is very important // to make sure that critical packets are sent ASAP. // In the case of meshtastic that means we want to send protocol acks as soon as possible // (to prevent unneeded retransmissions), we want routing messages to be sent next, // then messages marked as reliable and finally 'background' packets like periodic position updates. // So I bit the bullet and implemented a new (internal - not sent over the air) // field in MeshPacket called 'priority'. // And the transmission queue in the router object is now a priority queue. type MeshPacket_Priority int32 const ( // Treated as Priority.DEFAULT MeshPacket_UNSET MeshPacket_Priority = 0 // TODO: REPLACE MeshPacket_MIN MeshPacket_Priority = 1 // Background position updates are sent with very low priority - // if the link is super congested they might not go out at all MeshPacket_BACKGROUND MeshPacket_Priority = 10 // This priority is used for most messages that don't have a priority set MeshPacket_DEFAULT MeshPacket_Priority = 64 // If priority is unset but the message is marked as want_ack, // assume it is important and use a slightly higher priority MeshPacket_RELIABLE MeshPacket_Priority = 70 // If priority is unset but the packet is a response to a request, we want it to get there relatively quickly. // Furthermore, responses stop relaying packets directed to a node early. MeshPacket_RESPONSE MeshPacket_Priority = 80 // Higher priority for specific message types (portnums) to distinguish between other reliable packets. MeshPacket_HIGH MeshPacket_Priority = 100 // Ack/naks are sent with very high priority to ensure that retransmission // stops as soon as possible MeshPacket_ACK MeshPacket_Priority = 120 // TODO: REPLACE MeshPacket_MAX MeshPacket_Priority = 127 ) // Enum value maps for MeshPacket_Priority. var ( MeshPacket_Priority_name = map[int32]string{ 0: "UNSET", 1: "MIN", 10: "BACKGROUND", 64: "DEFAULT", 70: "RELIABLE", 80: "RESPONSE", 100: "HIGH", 120: "ACK", 127: "MAX", } MeshPacket_Priority_value = map[string]int32{ "UNSET": 0, "MIN": 1, "BACKGROUND": 10, "DEFAULT": 64, "RELIABLE": 70, "RESPONSE": 80, "HIGH": 100, "ACK": 120, "MAX": 127, } ) func (x MeshPacket_Priority) Enum() *MeshPacket_Priority { p := new(MeshPacket_Priority) *p = x return p } func (x MeshPacket_Priority) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (MeshPacket_Priority) Descriptor() protoreflect.EnumDescriptor { return file_protobufs_mesh_proto_enumTypes[6].Descriptor() } func (MeshPacket_Priority) Type() protoreflect.EnumType { return &file_protobufs_mesh_proto_enumTypes[6] } func (x MeshPacket_Priority) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use MeshPacket_Priority.Descriptor instead. func (MeshPacket_Priority) EnumDescriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{7, 0} } // Identify if this is a delayed packet type MeshPacket_Delayed int32 const ( // If unset, the message is being sent in real time. MeshPacket_NO_DELAY MeshPacket_Delayed = 0 // The message is delayed and was originally a broadcast MeshPacket_DELAYED_BROADCAST MeshPacket_Delayed = 1 // The message is delayed and was originally a direct message MeshPacket_DELAYED_DIRECT MeshPacket_Delayed = 2 ) // Enum value maps for MeshPacket_Delayed. var ( MeshPacket_Delayed_name = map[int32]string{ 0: "NO_DELAY", 1: "DELAYED_BROADCAST", 2: "DELAYED_DIRECT", } MeshPacket_Delayed_value = map[string]int32{ "NO_DELAY": 0, "DELAYED_BROADCAST": 1, "DELAYED_DIRECT": 2, } ) func (x MeshPacket_Delayed) Enum() *MeshPacket_Delayed { p := new(MeshPacket_Delayed) *p = x return p } func (x MeshPacket_Delayed) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (MeshPacket_Delayed) Descriptor() protoreflect.EnumDescriptor { return file_protobufs_mesh_proto_enumTypes[7].Descriptor() } func (MeshPacket_Delayed) Type() protoreflect.EnumType { return &file_protobufs_mesh_proto_enumTypes[7] } func (x MeshPacket_Delayed) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use MeshPacket_Delayed.Descriptor instead. func (MeshPacket_Delayed) EnumDescriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{7, 1} } // Log levels, chosen to match python logging conventions. type LogRecord_Level int32 const ( // Log levels, chosen to match python logging conventions. LogRecord_UNSET LogRecord_Level = 0 // Log levels, chosen to match python logging conventions. LogRecord_CRITICAL LogRecord_Level = 50 // Log levels, chosen to match python logging conventions. LogRecord_ERROR LogRecord_Level = 40 // Log levels, chosen to match python logging conventions. LogRecord_WARNING LogRecord_Level = 30 // Log levels, chosen to match python logging conventions. LogRecord_INFO LogRecord_Level = 20 // Log levels, chosen to match python logging conventions. LogRecord_DEBUG LogRecord_Level = 10 // Log levels, chosen to match python logging conventions. LogRecord_TRACE LogRecord_Level = 5 ) // Enum value maps for LogRecord_Level. var ( LogRecord_Level_name = map[int32]string{ 0: "UNSET", 50: "CRITICAL", 40: "ERROR", 30: "WARNING", 20: "INFO", 10: "DEBUG", 5: "TRACE", } LogRecord_Level_value = map[string]int32{ "UNSET": 0, "CRITICAL": 50, "ERROR": 40, "WARNING": 30, "INFO": 20, "DEBUG": 10, "TRACE": 5, } ) func (x LogRecord_Level) Enum() *LogRecord_Level { p := new(LogRecord_Level) *p = x return p } func (x LogRecord_Level) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (LogRecord_Level) Descriptor() protoreflect.EnumDescriptor { return file_protobufs_mesh_proto_enumTypes[8].Descriptor() } func (LogRecord_Level) Type() protoreflect.EnumType { return &file_protobufs_mesh_proto_enumTypes[8] } func (x LogRecord_Level) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use LogRecord_Level.Descriptor instead. func (LogRecord_Level) EnumDescriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{10, 0} } // a gps position type Position struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The new preferred location encoding, multiply by 1e-7 to get degrees // in floating point LatitudeI *int32 `protobuf:"fixed32,1,opt,name=latitude_i,json=latitudeI,proto3,oneof" json:"latitude_i,omitempty"` // TODO: REPLACE LongitudeI *int32 `protobuf:"fixed32,2,opt,name=longitude_i,json=longitudeI,proto3,oneof" json:"longitude_i,omitempty"` // In meters above MSL (but see issue #359) Altitude *int32 `protobuf:"varint,3,opt,name=altitude,proto3,oneof" json:"altitude,omitempty"` // This is usually not sent over the mesh (to save space), but it is sent // from the phone so that the local device can set its time if it is sent over // the mesh (because there are devices on the mesh without GPS or RTC). // seconds since 1970 Time uint32 `protobuf:"fixed32,4,opt,name=time,proto3" json:"time,omitempty"` // TODO: REPLACE LocationSource Position_LocSource `protobuf:"varint,5,opt,name=location_source,json=locationSource,proto3,enum=meshtastic.Position_LocSource" json:"location_source,omitempty"` // TODO: REPLACE AltitudeSource Position_AltSource `protobuf:"varint,6,opt,name=altitude_source,json=altitudeSource,proto3,enum=meshtastic.Position_AltSource" json:"altitude_source,omitempty"` // Positional timestamp (actual timestamp of GPS solution) in integer epoch seconds Timestamp uint32 `protobuf:"fixed32,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Pos. timestamp milliseconds adjustment (rarely available or required) TimestampMillisAdjust int32 `protobuf:"varint,8,opt,name=timestamp_millis_adjust,json=timestampMillisAdjust,proto3" json:"timestamp_millis_adjust,omitempty"` // HAE altitude in meters - can be used instead of MSL altitude AltitudeHae *int32 `protobuf:"zigzag32,9,opt,name=altitude_hae,json=altitudeHae,proto3,oneof" json:"altitude_hae,omitempty"` // Geoidal separation in meters AltitudeGeoidalSeparation *int32 `protobuf:"zigzag32,10,opt,name=altitude_geoidal_separation,json=altitudeGeoidalSeparation,proto3,oneof" json:"altitude_geoidal_separation,omitempty"` // Horizontal, Vertical and Position Dilution of Precision, in 1/100 units // - PDOP is sufficient for most cases // - for higher precision scenarios, HDOP and VDOP can be used instead, // in which case PDOP becomes redundant (PDOP=sqrt(HDOP^2 + VDOP^2)) // // TODO: REMOVE/INTEGRATE PDOP uint32 `protobuf:"varint,11,opt,name=PDOP,proto3" json:"PDOP,omitempty"` // TODO: REPLACE HDOP uint32 `protobuf:"varint,12,opt,name=HDOP,proto3" json:"HDOP,omitempty"` // TODO: REPLACE VDOP uint32 `protobuf:"varint,13,opt,name=VDOP,proto3" json:"VDOP,omitempty"` // GPS accuracy (a hardware specific constant) in mm // // multiplied with DOP to calculate positional accuracy // // Default: "'bout three meters-ish" :) GpsAccuracy uint32 `protobuf:"varint,14,opt,name=gps_accuracy,json=gpsAccuracy,proto3" json:"gps_accuracy,omitempty"` // Ground speed in m/s and True North TRACK in 1/100 degrees // Clarification of terms: // - "track" is the direction of motion (measured in horizontal plane) // - "heading" is where the fuselage points (measured in horizontal plane) // - "yaw" indicates a relative rotation about the vertical axis // TODO: REMOVE/INTEGRATE GroundSpeed *uint32 `protobuf:"varint,15,opt,name=ground_speed,json=groundSpeed,proto3,oneof" json:"ground_speed,omitempty"` // TODO: REPLACE GroundTrack *uint32 `protobuf:"varint,16,opt,name=ground_track,json=groundTrack,proto3,oneof" json:"ground_track,omitempty"` // GPS fix quality (from NMEA GxGGA statement or similar) FixQuality uint32 `protobuf:"varint,17,opt,name=fix_quality,json=fixQuality,proto3" json:"fix_quality,omitempty"` // GPS fix type 2D/3D (from NMEA GxGSA statement) FixType uint32 `protobuf:"varint,18,opt,name=fix_type,json=fixType,proto3" json:"fix_type,omitempty"` // GPS "Satellites in View" number SatsInView uint32 `protobuf:"varint,19,opt,name=sats_in_view,json=satsInView,proto3" json:"sats_in_view,omitempty"` // Sensor ID - in case multiple positioning sensors are being used SensorId uint32 `protobuf:"varint,20,opt,name=sensor_id,json=sensorId,proto3" json:"sensor_id,omitempty"` // Estimated/expected time (in seconds) until next update: // - if we update at fixed intervals of X seconds, use X // - if we update at dynamic intervals (based on relative movement etc), // but "AT LEAST every Y seconds", use Y NextUpdate uint32 `protobuf:"varint,21,opt,name=next_update,json=nextUpdate,proto3" json:"next_update,omitempty"` // A sequence number, incremented with each Position message to help // // detect lost updates if needed SeqNumber uint32 `protobuf:"varint,22,opt,name=seq_number,json=seqNumber,proto3" json:"seq_number,omitempty"` // Indicates the bits of precision set by the sending node PrecisionBits uint32 `protobuf:"varint,23,opt,name=precision_bits,json=precisionBits,proto3" json:"precision_bits,omitempty"` } func (x *Position) Reset() { *x = Position{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Position) String() string { return protoimpl.X.MessageStringOf(x) } func (*Position) ProtoMessage() {} func (x *Position) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_proto_msgTypes[0] 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 Position.ProtoReflect.Descriptor instead. func (*Position) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{0} } func (x *Position) GetLatitudeI() int32 { if x != nil && x.LatitudeI != nil { return *x.LatitudeI } return 0 } func (x *Position) GetLongitudeI() int32 { if x != nil && x.LongitudeI != nil { return *x.LongitudeI } return 0 } func (x *Position) GetAltitude() int32 { if x != nil && x.Altitude != nil { return *x.Altitude } return 0 } func (x *Position) GetTime() uint32 { if x != nil { return x.Time } return 0 } func (x *Position) GetLocationSource() Position_LocSource { if x != nil { return x.LocationSource } return Position_LOC_UNSET } func (x *Position) GetAltitudeSource() Position_AltSource { if x != nil { return x.AltitudeSource } return Position_ALT_UNSET } func (x *Position) GetTimestamp() uint32 { if x != nil { return x.Timestamp } return 0 } func (x *Position) GetTimestampMillisAdjust() int32 { if x != nil { return x.TimestampMillisAdjust } return 0 } func (x *Position) GetAltitudeHae() int32 { if x != nil && x.AltitudeHae != nil { return *x.AltitudeHae } return 0 } func (x *Position) GetAltitudeGeoidalSeparation() int32 { if x != nil && x.AltitudeGeoidalSeparation != nil { return *x.AltitudeGeoidalSeparation } return 0 } func (x *Position) GetPDOP() uint32 { if x != nil { return x.PDOP } return 0 } func (x *Position) GetHDOP() uint32 { if x != nil { return x.HDOP } return 0 } func (x *Position) GetVDOP() uint32 { if x != nil { return x.VDOP } return 0 } func (x *Position) GetGpsAccuracy() uint32 { if x != nil { return x.GpsAccuracy } return 0 } func (x *Position) GetGroundSpeed() uint32 { if x != nil && x.GroundSpeed != nil { return *x.GroundSpeed } return 0 } func (x *Position) GetGroundTrack() uint32 { if x != nil && x.GroundTrack != nil { return *x.GroundTrack } return 0 } func (x *Position) GetFixQuality() uint32 { if x != nil { return x.FixQuality } return 0 } func (x *Position) GetFixType() uint32 { if x != nil { return x.FixType } return 0 } func (x *Position) GetSatsInView() uint32 { if x != nil { return x.SatsInView } return 0 } func (x *Position) GetSensorId() uint32 { if x != nil { return x.SensorId } return 0 } func (x *Position) GetNextUpdate() uint32 { if x != nil { return x.NextUpdate } return 0 } func (x *Position) GetSeqNumber() uint32 { if x != nil { return x.SeqNumber } return 0 } func (x *Position) GetPrecisionBits() uint32 { if x != nil { return x.PrecisionBits } return 0 } // Broadcast when a newly powered mesh node wants to find a node num it can use // Sent from the phone over bluetooth to set the user id for the owner of this node. // Also sent from nodes to each other when a new node signs on (so all clients can have this info) // The algorithm is as follows: // when a node starts up, it broadcasts their user and the normal flow is for all // other nodes to reply with their User as well (so the new node can build its nodedb) // If a node ever receives a User (not just the first broadcast) message where // the sender node number equals our node number, that indicates a collision has // occurred and the following steps should happen: // If the receiving node (that was already in the mesh)'s macaddr is LOWER than the // new User who just tried to sign in: it gets to keep its nodenum. // We send a broadcast message of OUR User (we use a broadcast so that the other node can // receive our message, considering we have the same id - it also serves to let // observers correct their nodedb) - this case is rare so it should be okay. // If any node receives a User where the macaddr is GTE than their local macaddr, // they have been vetoed and should pick a new random nodenum (filtering against // whatever it knows about the nodedb) and rebroadcast their User. // A few nodenums are reserved and will never be requested: // 0xff - broadcast // 0 through 3 - for future use type User struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // A globally unique ID string for this user. // In the case of Signal that would mean +16504442323, for the default macaddr derived id it would be !<8 hexidecimal bytes>. // Note: app developers are encouraged to also use the following standard // node IDs "^all" (for broadcast), "^local" (for the locally connected node) Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // A full name for this user, i.e. "Kevin Hester" LongName string `protobuf:"bytes,2,opt,name=long_name,json=longName,proto3" json:"long_name,omitempty"` // A VERY short name, ideally two characters. // Suitable for a tiny OLED screen ShortName string `protobuf:"bytes,3,opt,name=short_name,json=shortName,proto3" json:"short_name,omitempty"` // Deprecated in Meshtastic 2.1.x // This is the addr of the radio. // Not populated by the phone, but added by the esp32 when broadcasting // // Deprecated: Do not use. Macaddr []byte `protobuf:"bytes,4,opt,name=macaddr,proto3" json:"macaddr,omitempty"` // TBEAM, HELTEC, etc... // Starting in 1.2.11 moved to hw_model enum in the NodeInfo object. // Apps will still need the string here for older builds // (so OTA update can find the right image), but if the enum is available it will be used instead. HwModel HardwareModel `protobuf:"varint,5,opt,name=hw_model,json=hwModel,proto3,enum=meshtastic.HardwareModel" json:"hw_model,omitempty"` // In some regions Ham radio operators have different bandwidth limitations than others. // If this user is a licensed operator, set this flag. // Also, "long_name" should be their licence number. IsLicensed bool `protobuf:"varint,6,opt,name=is_licensed,json=isLicensed,proto3" json:"is_licensed,omitempty"` // Indicates that the user's role in the mesh Role Config_DeviceConfig_Role `protobuf:"varint,7,opt,name=role,proto3,enum=meshtastic.Config_DeviceConfig_Role" json:"role,omitempty"` // The public key of the user's device. // This is sent out to other nodes on the mesh to allow them to compute a shared secret key. PublicKey []byte `protobuf:"bytes,8,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` } func (x *User) Reset() { *x = User{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *User) String() string { return protoimpl.X.MessageStringOf(x) } func (*User) ProtoMessage() {} func (x *User) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_proto_msgTypes[1] 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 User.ProtoReflect.Descriptor instead. func (*User) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{1} } func (x *User) GetId() string { if x != nil { return x.Id } return "" } func (x *User) GetLongName() string { if x != nil { return x.LongName } return "" } func (x *User) GetShortName() string { if x != nil { return x.ShortName } return "" } // Deprecated: Do not use. func (x *User) GetMacaddr() []byte { if x != nil { return x.Macaddr } return nil } func (x *User) GetHwModel() HardwareModel { if x != nil { return x.HwModel } return HardwareModel_UNSET } func (x *User) GetIsLicensed() bool { if x != nil { return x.IsLicensed } return false } func (x *User) GetRole() Config_DeviceConfig_Role { if x != nil { return x.Role } return Config_DeviceConfig_CLIENT } func (x *User) GetPublicKey() []byte { if x != nil { return x.PublicKey } return nil } // A message used in a traceroute type RouteDiscovery struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The list of nodenums this packet has visited so far to the destination. Route []uint32 `protobuf:"fixed32,1,rep,packed,name=route,proto3" json:"route,omitempty"` // The list of SNRs (in dB, scaled by 4) in the route towards the destination. SnrTowards []int32 `protobuf:"varint,2,rep,packed,name=snr_towards,json=snrTowards,proto3" json:"snr_towards,omitempty"` // The list of nodenums the packet has visited on the way back from the destination. RouteBack []uint32 `protobuf:"fixed32,3,rep,packed,name=route_back,json=routeBack,proto3" json:"route_back,omitempty"` // The list of SNRs (in dB, scaled by 4) in the route back from the destination. SnrBack []int32 `protobuf:"varint,4,rep,packed,name=snr_back,json=snrBack,proto3" json:"snr_back,omitempty"` } func (x *RouteDiscovery) Reset() { *x = RouteDiscovery{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *RouteDiscovery) String() string { return protoimpl.X.MessageStringOf(x) } func (*RouteDiscovery) ProtoMessage() {} func (x *RouteDiscovery) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_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 RouteDiscovery.ProtoReflect.Descriptor instead. func (*RouteDiscovery) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{2} } func (x *RouteDiscovery) GetRoute() []uint32 { if x != nil { return x.Route } return nil } func (x *RouteDiscovery) GetSnrTowards() []int32 { if x != nil { return x.SnrTowards } return nil } func (x *RouteDiscovery) GetRouteBack() []uint32 { if x != nil { return x.RouteBack } return nil } func (x *RouteDiscovery) GetSnrBack() []int32 { if x != nil { return x.SnrBack } return nil } // A Routing control Data packet handled by the routing module type Routing struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Types that are assignable to Variant: // // *Routing_RouteRequest // *Routing_RouteReply // *Routing_ErrorReason Variant isRouting_Variant `protobuf_oneof:"variant"` } func (x *Routing) Reset() { *x = Routing{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Routing) String() string { return protoimpl.X.MessageStringOf(x) } func (*Routing) ProtoMessage() {} func (x *Routing) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_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 Routing.ProtoReflect.Descriptor instead. func (*Routing) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{3} } func (m *Routing) GetVariant() isRouting_Variant { if m != nil { return m.Variant } return nil } func (x *Routing) GetRouteRequest() *RouteDiscovery { if x, ok := x.GetVariant().(*Routing_RouteRequest); ok { return x.RouteRequest } return nil } func (x *Routing) GetRouteReply() *RouteDiscovery { if x, ok := x.GetVariant().(*Routing_RouteReply); ok { return x.RouteReply } return nil } func (x *Routing) GetErrorReason() Routing_Error { if x, ok := x.GetVariant().(*Routing_ErrorReason); ok { return x.ErrorReason } return Routing_NONE } type isRouting_Variant interface { isRouting_Variant() } type Routing_RouteRequest struct { // A route request going from the requester RouteRequest *RouteDiscovery `protobuf:"bytes,1,opt,name=route_request,json=routeRequest,proto3,oneof"` } type Routing_RouteReply struct { // A route reply RouteReply *RouteDiscovery `protobuf:"bytes,2,opt,name=route_reply,json=routeReply,proto3,oneof"` } type Routing_ErrorReason struct { // A failure in delivering a message (usually used for routing control messages, but might be provided // in addition to ack.fail_id to provide details on the type of failure). ErrorReason Routing_Error `protobuf:"varint,3,opt,name=error_reason,json=errorReason,proto3,enum=meshtastic.Routing_Error,oneof"` } func (*Routing_RouteRequest) isRouting_Variant() {} func (*Routing_RouteReply) isRouting_Variant() {} func (*Routing_ErrorReason) isRouting_Variant() {} // (Formerly called SubPacket) // The payload portion fo a packet, this is the actual bytes that are sent // inside a radio packet (because from/to are broken out by the comms library) type Data struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Formerly named typ and of type Type Portnum PortNum `protobuf:"varint,1,opt,name=portnum,proto3,enum=meshtastic.PortNum" json:"portnum,omitempty"` // TODO: REPLACE Payload []byte `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` // Not normally used, but for testing a sender can request that recipient // responds in kind (i.e. if it received a position, it should unicast back it's position). // Note: that if you set this on a broadcast you will receive many replies. WantResponse bool `protobuf:"varint,3,opt,name=want_response,json=wantResponse,proto3" json:"want_response,omitempty"` // The address of the destination node. // This field is is filled in by the mesh radio device software, application // layer software should never need it. // RouteDiscovery messages _must_ populate this. // Other message types might need to if they are doing multihop routing. Dest uint32 `protobuf:"fixed32,4,opt,name=dest,proto3" json:"dest,omitempty"` // The address of the original sender for this message. // This field should _only_ be populated for reliable multihop packets (to keep // packets small). Source uint32 `protobuf:"fixed32,5,opt,name=source,proto3" json:"source,omitempty"` // Only used in routing or response messages. // Indicates the original message ID that this message is reporting failure on. (formerly called original_id) RequestId uint32 `protobuf:"fixed32,6,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` // If set, this message is intened to be a reply to a previously sent message with the defined id. ReplyId uint32 `protobuf:"fixed32,7,opt,name=reply_id,json=replyId,proto3" json:"reply_id,omitempty"` // Defaults to false. If true, then what is in the payload should be treated as an emoji like giving // a message a heart or poop emoji. Emoji uint32 `protobuf:"fixed32,8,opt,name=emoji,proto3" json:"emoji,omitempty"` // Bitfield for extra flags. First use is to indicate that user approves the packet being uploaded to MQTT. Bitfield *uint32 `protobuf:"varint,9,opt,name=bitfield,proto3,oneof" json:"bitfield,omitempty"` } func (x *Data) Reset() { *x = Data{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Data) String() string { return protoimpl.X.MessageStringOf(x) } func (*Data) ProtoMessage() {} func (x *Data) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_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 Data.ProtoReflect.Descriptor instead. func (*Data) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{4} } func (x *Data) GetPortnum() PortNum { if x != nil { return x.Portnum } return PortNum_UNKNOWN_APP } func (x *Data) GetPayload() []byte { if x != nil { return x.Payload } return nil } func (x *Data) GetWantResponse() bool { if x != nil { return x.WantResponse } return false } func (x *Data) GetDest() uint32 { if x != nil { return x.Dest } return 0 } func (x *Data) GetSource() uint32 { if x != nil { return x.Source } return 0 } func (x *Data) GetRequestId() uint32 { if x != nil { return x.RequestId } return 0 } func (x *Data) GetReplyId() uint32 { if x != nil { return x.ReplyId } return 0 } func (x *Data) GetEmoji() uint32 { if x != nil { return x.Emoji } return 0 } func (x *Data) GetBitfield() uint32 { if x != nil && x.Bitfield != nil { return *x.Bitfield } return 0 } // Waypoint message, used to share arbitrary locations across the mesh type Waypoint struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Id of the waypoint Id uint32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` // latitude_i LatitudeI *int32 `protobuf:"fixed32,2,opt,name=latitude_i,json=latitudeI,proto3,oneof" json:"latitude_i,omitempty"` // longitude_i LongitudeI *int32 `protobuf:"fixed32,3,opt,name=longitude_i,json=longitudeI,proto3,oneof" json:"longitude_i,omitempty"` // Time the waypoint is to expire (epoch) Expire uint32 `protobuf:"varint,4,opt,name=expire,proto3" json:"expire,omitempty"` // If greater than zero, treat the value as a nodenum only allowing them to update the waypoint. // If zero, the waypoint is open to be edited by any member of the mesh. LockedTo uint32 `protobuf:"varint,5,opt,name=locked_to,json=lockedTo,proto3" json:"locked_to,omitempty"` // Name of the waypoint - max 30 chars Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` // Description of the waypoint - max 100 chars Description string `protobuf:"bytes,7,opt,name=description,proto3" json:"description,omitempty"` // Designator icon for the waypoint in the form of a unicode emoji Icon uint32 `protobuf:"fixed32,8,opt,name=icon,proto3" json:"icon,omitempty"` } func (x *Waypoint) Reset() { *x = Waypoint{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Waypoint) String() string { return protoimpl.X.MessageStringOf(x) } func (*Waypoint) ProtoMessage() {} func (x *Waypoint) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_proto_msgTypes[5] 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 Waypoint.ProtoReflect.Descriptor instead. func (*Waypoint) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{5} } func (x *Waypoint) GetId() uint32 { if x != nil { return x.Id } return 0 } func (x *Waypoint) GetLatitudeI() int32 { if x != nil && x.LatitudeI != nil { return *x.LatitudeI } return 0 } func (x *Waypoint) GetLongitudeI() int32 { if x != nil && x.LongitudeI != nil { return *x.LongitudeI } return 0 } func (x *Waypoint) GetExpire() uint32 { if x != nil { return x.Expire } return 0 } func (x *Waypoint) GetLockedTo() uint32 { if x != nil { return x.LockedTo } return 0 } func (x *Waypoint) GetName() string { if x != nil { return x.Name } return "" } func (x *Waypoint) GetDescription() string { if x != nil { return x.Description } return "" } func (x *Waypoint) GetIcon() uint32 { if x != nil { return x.Icon } return 0 } // This message will be proxied over the PhoneAPI for the client to deliver to the MQTT server type MqttClientProxyMessage struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The MQTT topic this message will be sent /received on Topic string `protobuf:"bytes,1,opt,name=topic,proto3" json:"topic,omitempty"` // The actual service envelope payload or text for mqtt pub / sub // // Types that are assignable to PayloadVariant: // // *MqttClientProxyMessage_Data // *MqttClientProxyMessage_Text PayloadVariant isMqttClientProxyMessage_PayloadVariant `protobuf_oneof:"payload_variant"` // Whether the message should be retained (or not) Retained bool `protobuf:"varint,4,opt,name=retained,proto3" json:"retained,omitempty"` } func (x *MqttClientProxyMessage) Reset() { *x = MqttClientProxyMessage{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *MqttClientProxyMessage) String() string { return protoimpl.X.MessageStringOf(x) } func (*MqttClientProxyMessage) ProtoMessage() {} func (x *MqttClientProxyMessage) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_proto_msgTypes[6] 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 MqttClientProxyMessage.ProtoReflect.Descriptor instead. func (*MqttClientProxyMessage) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{6} } func (x *MqttClientProxyMessage) GetTopic() string { if x != nil { return x.Topic } return "" } func (m *MqttClientProxyMessage) GetPayloadVariant() isMqttClientProxyMessage_PayloadVariant { if m != nil { return m.PayloadVariant } return nil } func (x *MqttClientProxyMessage) GetData() []byte { if x, ok := x.GetPayloadVariant().(*MqttClientProxyMessage_Data); ok { return x.Data } return nil } func (x *MqttClientProxyMessage) GetText() string { if x, ok := x.GetPayloadVariant().(*MqttClientProxyMessage_Text); ok { return x.Text } return "" } func (x *MqttClientProxyMessage) GetRetained() bool { if x != nil { return x.Retained } return false } type isMqttClientProxyMessage_PayloadVariant interface { isMqttClientProxyMessage_PayloadVariant() } type MqttClientProxyMessage_Data struct { // Bytes Data []byte `protobuf:"bytes,2,opt,name=data,proto3,oneof"` } type MqttClientProxyMessage_Text struct { // Text Text string `protobuf:"bytes,3,opt,name=text,proto3,oneof"` } func (*MqttClientProxyMessage_Data) isMqttClientProxyMessage_PayloadVariant() {} func (*MqttClientProxyMessage_Text) isMqttClientProxyMessage_PayloadVariant() {} // A packet envelope sent/received over the mesh // only payload_variant is sent in the payload portion of the LORA packet. // The other fields are either not sent at all, or sent in the special 16 byte LORA header. type MeshPacket struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The sending node number. // Note: Our crypto implementation uses this field as well. // See [crypto](/docs/overview/encryption) for details. From uint32 `protobuf:"fixed32,1,opt,name=from,proto3" json:"from,omitempty"` // The (immediate) destination for this packet To uint32 `protobuf:"fixed32,2,opt,name=to,proto3" json:"to,omitempty"` // (Usually) If set, this indicates the index in the secondary_channels table that this packet was sent/received on. // If unset, packet was on the primary channel. // A particular node might know only a subset of channels in use on the mesh. // Therefore channel_index is inherently a local concept and meaningless to send between nodes. // Very briefly, while sending and receiving deep inside the device Router code, this field instead // contains the 'channel hash' instead of the index. // This 'trick' is only used while the payload_variant is an 'encrypted'. Channel uint32 `protobuf:"varint,3,opt,name=channel,proto3" json:"channel,omitempty"` // Types that are assignable to PayloadVariant: // // *MeshPacket_Decoded // *MeshPacket_Encrypted PayloadVariant isMeshPacket_PayloadVariant `protobuf_oneof:"payload_variant"` // A unique ID for this packet. // Always 0 for no-ack packets or non broadcast packets (and therefore take zero bytes of space). // Otherwise a unique ID for this packet, useful for flooding algorithms. // ID only needs to be unique on a _per sender_ basis, and it only // needs to be unique for a few minutes (long enough to last for the length of // any ACK or the completion of a mesh broadcast flood). // Note: Our crypto implementation uses this id as well. // See [crypto](/docs/overview/encryption) for details. Id uint32 `protobuf:"fixed32,6,opt,name=id,proto3" json:"id,omitempty"` // The time this message was received by the esp32 (secs since 1970). // Note: this field is _never_ sent on the radio link itself (to save space) Times // are typically not sent over the mesh, but they will be added to any Packet // (chain of SubPacket) sent to the phone (so the phone can know exact time of reception) RxTime uint32 `protobuf:"fixed32,7,opt,name=rx_time,json=rxTime,proto3" json:"rx_time,omitempty"` // *Never* sent over the radio links. // Set during reception to indicate the SNR of this packet. // Used to collect statistics on current link quality. RxSnr float32 `protobuf:"fixed32,8,opt,name=rx_snr,json=rxSnr,proto3" json:"rx_snr,omitempty"` // If unset treated as zero (no forwarding, send to adjacent nodes only) // if 1, allow hopping through one node, etc... // For our usecase real world topologies probably have a max of about 3. // This field is normally placed into a few of bits in the header. HopLimit uint32 `protobuf:"varint,9,opt,name=hop_limit,json=hopLimit,proto3" json:"hop_limit,omitempty"` // This packet is being sent as a reliable message, we would prefer it to arrive at the destination. // We would like to receive a ack packet in response. // Broadcasts messages treat this flag specially: Since acks for broadcasts would // rapidly flood the channel, the normal ack behavior is suppressed. // Instead, the original sender listens to see if at least one node is rebroadcasting this packet (because naive flooding algorithm). // If it hears that the odds (given typical LoRa topologies) the odds are very high that every node should eventually receive the message. // So FloodingRouter.cpp generates an implicit ack which is delivered to the original sender. // If after some time we don't hear anyone rebroadcast our packet, we will timeout and retransmit, using the regular resend logic. // Note: This flag is normally sent in a flag bit in the header when sent over the wire WantAck bool `protobuf:"varint,10,opt,name=want_ack,json=wantAck,proto3" json:"want_ack,omitempty"` // The priority of this message for sending. // See MeshPacket.Priority description for more details. Priority MeshPacket_Priority `protobuf:"varint,11,opt,name=priority,proto3,enum=meshtastic.MeshPacket_Priority" json:"priority,omitempty"` // rssi of received packet. Only sent to phone for dispay purposes. RxRssi int32 `protobuf:"varint,12,opt,name=rx_rssi,json=rxRssi,proto3" json:"rx_rssi,omitempty"` // Describe if this message is delayed // // Deprecated: Do not use. Delayed MeshPacket_Delayed `protobuf:"varint,13,opt,name=delayed,proto3,enum=meshtastic.MeshPacket_Delayed" json:"delayed,omitempty"` // Describes whether this packet passed via MQTT somewhere along the path it currently took. ViaMqtt bool `protobuf:"varint,14,opt,name=via_mqtt,json=viaMqtt,proto3" json:"via_mqtt,omitempty"` // Hop limit with which the original packet started. Sent via LoRa using three bits in the unencrypted header. // When receiving a packet, the difference between hop_start and hop_limit gives how many hops it traveled. HopStart uint32 `protobuf:"varint,15,opt,name=hop_start,json=hopStart,proto3" json:"hop_start,omitempty"` // Records the public key the packet was encrypted with, if applicable. PublicKey []byte `protobuf:"bytes,16,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` // Indicates whether the packet was en/decrypted using PKI PkiEncrypted bool `protobuf:"varint,17,opt,name=pki_encrypted,json=pkiEncrypted,proto3" json:"pki_encrypted,omitempty"` } func (x *MeshPacket) Reset() { *x = MeshPacket{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *MeshPacket) String() string { return protoimpl.X.MessageStringOf(x) } func (*MeshPacket) ProtoMessage() {} func (x *MeshPacket) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_proto_msgTypes[7] 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 MeshPacket.ProtoReflect.Descriptor instead. func (*MeshPacket) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{7} } func (x *MeshPacket) GetFrom() uint32 { if x != nil { return x.From } return 0 } func (x *MeshPacket) GetTo() uint32 { if x != nil { return x.To } return 0 } func (x *MeshPacket) GetChannel() uint32 { if x != nil { return x.Channel } return 0 } func (m *MeshPacket) GetPayloadVariant() isMeshPacket_PayloadVariant { if m != nil { return m.PayloadVariant } return nil } func (x *MeshPacket) GetDecoded() *Data { if x, ok := x.GetPayloadVariant().(*MeshPacket_Decoded); ok { return x.Decoded } return nil } func (x *MeshPacket) GetEncrypted() []byte { if x, ok := x.GetPayloadVariant().(*MeshPacket_Encrypted); ok { return x.Encrypted } return nil } func (x *MeshPacket) GetId() uint32 { if x != nil { return x.Id } return 0 } func (x *MeshPacket) GetRxTime() uint32 { if x != nil { return x.RxTime } return 0 } func (x *MeshPacket) GetRxSnr() float32 { if x != nil { return x.RxSnr } return 0 } func (x *MeshPacket) GetHopLimit() uint32 { if x != nil { return x.HopLimit } return 0 } func (x *MeshPacket) GetWantAck() bool { if x != nil { return x.WantAck } return false } func (x *MeshPacket) GetPriority() MeshPacket_Priority { if x != nil { return x.Priority } return MeshPacket_UNSET } func (x *MeshPacket) GetRxRssi() int32 { if x != nil { return x.RxRssi } return 0 } // Deprecated: Do not use. func (x *MeshPacket) GetDelayed() MeshPacket_Delayed { if x != nil { return x.Delayed } return MeshPacket_NO_DELAY } func (x *MeshPacket) GetViaMqtt() bool { if x != nil { return x.ViaMqtt } return false } func (x *MeshPacket) GetHopStart() uint32 { if x != nil { return x.HopStart } return 0 } func (x *MeshPacket) GetPublicKey() []byte { if x != nil { return x.PublicKey } return nil } func (x *MeshPacket) GetPkiEncrypted() bool { if x != nil { return x.PkiEncrypted } return false } type isMeshPacket_PayloadVariant interface { isMeshPacket_PayloadVariant() } type MeshPacket_Decoded struct { // TODO: REPLACE Decoded *Data `protobuf:"bytes,4,opt,name=decoded,proto3,oneof"` } type MeshPacket_Encrypted struct { // TODO: REPLACE Encrypted []byte `protobuf:"bytes,5,opt,name=encrypted,proto3,oneof"` } func (*MeshPacket_Decoded) isMeshPacket_PayloadVariant() {} func (*MeshPacket_Encrypted) isMeshPacket_PayloadVariant() {} // The bluetooth to device link: // Old BTLE protocol docs from TODO, merge in above and make real docs... // use protocol buffers, and NanoPB // messages from device to phone: // POSITION_UPDATE (..., time) // TEXT_RECEIVED(from, text, time) // OPAQUE_RECEIVED(from, payload, time) (for signal messages or other applications) // messages from phone to device: // SET_MYID(id, human readable long, human readable short) (send down the unique ID // string used for this node, a human readable string shown for that id, and a very // short human readable string suitable for oled screen) SEND_OPAQUE(dest, payload) // (for signal messages or other applications) SEND_TEXT(dest, text) Get all // nodes() (returns list of nodes, with full info, last time seen, loc, battery // level etc) SET_CONFIG (switches device to a new set of radio params and // preshared key, drops all existing nodes, force our node to rejoin this new group) // Full information about a node on the mesh type NodeInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The node number Num uint32 `protobuf:"varint,1,opt,name=num,proto3" json:"num,omitempty"` // The user info for this node User *User `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"` // This position data. Note: before 1.2.14 we would also store the last time we've heard from this node in position.time, that is no longer true. // Position.time now indicates the last time we received a POSITION from that node. Position *Position `protobuf:"bytes,3,opt,name=position,proto3" json:"position,omitempty"` // Returns the Signal-to-noise ratio (SNR) of the last received message, // as measured by the receiver. Return SNR of the last received message in dB Snr float32 `protobuf:"fixed32,4,opt,name=snr,proto3" json:"snr,omitempty"` // Set to indicate the last time we received a packet from this node LastHeard uint32 `protobuf:"fixed32,5,opt,name=last_heard,json=lastHeard,proto3" json:"last_heard,omitempty"` // The latest device metrics for the node. DeviceMetrics *DeviceMetrics `protobuf:"bytes,6,opt,name=device_metrics,json=deviceMetrics,proto3" json:"device_metrics,omitempty"` // local channel index we heard that node on. Only populated if its not the default channel. Channel uint32 `protobuf:"varint,7,opt,name=channel,proto3" json:"channel,omitempty"` // True if we witnessed the node over MQTT instead of LoRA transport ViaMqtt bool `protobuf:"varint,8,opt,name=via_mqtt,json=viaMqtt,proto3" json:"via_mqtt,omitempty"` // Number of hops away from us this node is (0 if adjacent) HopsAway *uint32 `protobuf:"varint,9,opt,name=hops_away,json=hopsAway,proto3,oneof" json:"hops_away,omitempty"` // True if node is in our favorites list // Persists between NodeDB internal clean ups IsFavorite bool `protobuf:"varint,10,opt,name=is_favorite,json=isFavorite,proto3" json:"is_favorite,omitempty"` } func (x *NodeInfo) Reset() { *x = NodeInfo{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *NodeInfo) String() string { return protoimpl.X.MessageStringOf(x) } func (*NodeInfo) ProtoMessage() {} func (x *NodeInfo) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_proto_msgTypes[8] 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 NodeInfo.ProtoReflect.Descriptor instead. func (*NodeInfo) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{8} } func (x *NodeInfo) GetNum() uint32 { if x != nil { return x.Num } return 0 } func (x *NodeInfo) GetUser() *User { if x != nil { return x.User } return nil } func (x *NodeInfo) GetPosition() *Position { if x != nil { return x.Position } return nil } func (x *NodeInfo) GetSnr() float32 { if x != nil { return x.Snr } return 0 } func (x *NodeInfo) GetLastHeard() uint32 { if x != nil { return x.LastHeard } return 0 } func (x *NodeInfo) GetDeviceMetrics() *DeviceMetrics { if x != nil { return x.DeviceMetrics } return nil } func (x *NodeInfo) GetChannel() uint32 { if x != nil { return x.Channel } return 0 } func (x *NodeInfo) GetViaMqtt() bool { if x != nil { return x.ViaMqtt } return false } func (x *NodeInfo) GetHopsAway() uint32 { if x != nil && x.HopsAway != nil { return *x.HopsAway } return 0 } func (x *NodeInfo) GetIsFavorite() bool { if x != nil { return x.IsFavorite } return false } // Unique local debugging info for this node // Note: we don't include position or the user info, because that will come in the // Sent to the phone in response to WantNodes. type MyNodeInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Tells the phone what our node number is, default starting value is // lowbyte of macaddr, but it will be fixed if that is already in use MyNodeNum uint32 `protobuf:"varint,1,opt,name=my_node_num,json=myNodeNum,proto3" json:"my_node_num,omitempty"` // The total number of reboots this node has ever encountered // (well - since the last time we discarded preferences) RebootCount uint32 `protobuf:"varint,8,opt,name=reboot_count,json=rebootCount,proto3" json:"reboot_count,omitempty"` // The minimum app version that can talk to this device. // Phone/PC apps should compare this to their build number and if too low tell the user they must update their app MinAppVersion uint32 `protobuf:"varint,11,opt,name=min_app_version,json=minAppVersion,proto3" json:"min_app_version,omitempty"` // Unique hardware identifier for this device DeviceId uint64 `protobuf:"varint,12,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` } func (x *MyNodeInfo) Reset() { *x = MyNodeInfo{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *MyNodeInfo) String() string { return protoimpl.X.MessageStringOf(x) } func (*MyNodeInfo) ProtoMessage() {} func (x *MyNodeInfo) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_proto_msgTypes[9] 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 MyNodeInfo.ProtoReflect.Descriptor instead. func (*MyNodeInfo) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{9} } func (x *MyNodeInfo) GetMyNodeNum() uint32 { if x != nil { return x.MyNodeNum } return 0 } func (x *MyNodeInfo) GetRebootCount() uint32 { if x != nil { return x.RebootCount } return 0 } func (x *MyNodeInfo) GetMinAppVersion() uint32 { if x != nil { return x.MinAppVersion } return 0 } func (x *MyNodeInfo) GetDeviceId() uint64 { if x != nil { return x.DeviceId } return 0 } // Debug output from the device. // To minimize the size of records inside the device code, if a time/source/level is not set // on the message it is assumed to be a continuation of the previously sent message. // This allows the device code to use fixed maxlen 64 byte strings for messages, // and then extend as needed by emitting multiple records. type LogRecord struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Log levels, chosen to match python logging conventions. Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` // Seconds since 1970 - or 0 for unknown/unset Time uint32 `protobuf:"fixed32,2,opt,name=time,proto3" json:"time,omitempty"` // Usually based on thread name - if known Source string `protobuf:"bytes,3,opt,name=source,proto3" json:"source,omitempty"` // Not yet set Level LogRecord_Level `protobuf:"varint,4,opt,name=level,proto3,enum=meshtastic.LogRecord_Level" json:"level,omitempty"` } func (x *LogRecord) Reset() { *x = LogRecord{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *LogRecord) String() string { return protoimpl.X.MessageStringOf(x) } func (*LogRecord) ProtoMessage() {} func (x *LogRecord) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_proto_msgTypes[10] 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 LogRecord.ProtoReflect.Descriptor instead. func (*LogRecord) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{10} } func (x *LogRecord) GetMessage() string { if x != nil { return x.Message } return "" } func (x *LogRecord) GetTime() uint32 { if x != nil { return x.Time } return 0 } func (x *LogRecord) GetSource() string { if x != nil { return x.Source } return "" } func (x *LogRecord) GetLevel() LogRecord_Level { if x != nil { return x.Level } return LogRecord_UNSET } type QueueStatus struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Last attempt to queue status, ErrorCode Res int32 `protobuf:"varint,1,opt,name=res,proto3" json:"res,omitempty"` // Free entries in the outgoing queue Free uint32 `protobuf:"varint,2,opt,name=free,proto3" json:"free,omitempty"` // Maximum entries in the outgoing queue Maxlen uint32 `protobuf:"varint,3,opt,name=maxlen,proto3" json:"maxlen,omitempty"` // What was mesh packet id that generated this response? MeshPacketId uint32 `protobuf:"varint,4,opt,name=mesh_packet_id,json=meshPacketId,proto3" json:"mesh_packet_id,omitempty"` } func (x *QueueStatus) Reset() { *x = QueueStatus{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *QueueStatus) String() string { return protoimpl.X.MessageStringOf(x) } func (*QueueStatus) ProtoMessage() {} func (x *QueueStatus) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_proto_msgTypes[11] 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 QueueStatus.ProtoReflect.Descriptor instead. func (*QueueStatus) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{11} } func (x *QueueStatus) GetRes() int32 { if x != nil { return x.Res } return 0 } func (x *QueueStatus) GetFree() uint32 { if x != nil { return x.Free } return 0 } func (x *QueueStatus) GetMaxlen() uint32 { if x != nil { return x.Maxlen } return 0 } func (x *QueueStatus) GetMeshPacketId() uint32 { if x != nil { return x.MeshPacketId } return 0 } // Packets from the radio to the phone will appear on the fromRadio characteristic. // It will support READ and NOTIFY. When a new packet arrives the device will BLE notify? // It will sit in that descriptor until consumed by the phone, // at which point the next item in the FIFO will be populated. type FromRadio struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The packet id, used to allow the phone to request missing read packets from the FIFO, // see our bluetooth docs Id uint32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` // Log levels, chosen to match python logging conventions. // // Types that are assignable to PayloadVariant: // // *FromRadio_Packet // *FromRadio_MyInfo // *FromRadio_NodeInfo // *FromRadio_Config // *FromRadio_LogRecord // *FromRadio_ConfigCompleteId // *FromRadio_Rebooted // *FromRadio_ModuleConfig // *FromRadio_Channel // *FromRadio_QueueStatus // *FromRadio_XmodemPacket // *FromRadio_Metadata // *FromRadio_MqttClientProxyMessage // *FromRadio_FileInfo // *FromRadio_ClientNotification // *FromRadio_DeviceuiConfig PayloadVariant isFromRadio_PayloadVariant `protobuf_oneof:"payload_variant"` } func (x *FromRadio) Reset() { *x = FromRadio{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *FromRadio) String() string { return protoimpl.X.MessageStringOf(x) } func (*FromRadio) ProtoMessage() {} func (x *FromRadio) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_proto_msgTypes[12] 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 FromRadio.ProtoReflect.Descriptor instead. func (*FromRadio) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{12} } func (x *FromRadio) GetId() uint32 { if x != nil { return x.Id } return 0 } func (m *FromRadio) GetPayloadVariant() isFromRadio_PayloadVariant { if m != nil { return m.PayloadVariant } return nil } func (x *FromRadio) GetPacket() *MeshPacket { if x, ok := x.GetPayloadVariant().(*FromRadio_Packet); ok { return x.Packet } return nil } func (x *FromRadio) GetMyInfo() *MyNodeInfo { if x, ok := x.GetPayloadVariant().(*FromRadio_MyInfo); ok { return x.MyInfo } return nil } func (x *FromRadio) GetNodeInfo() *NodeInfo { if x, ok := x.GetPayloadVariant().(*FromRadio_NodeInfo); ok { return x.NodeInfo } return nil } func (x *FromRadio) GetConfig() *Config { if x, ok := x.GetPayloadVariant().(*FromRadio_Config); ok { return x.Config } return nil } func (x *FromRadio) GetLogRecord() *LogRecord { if x, ok := x.GetPayloadVariant().(*FromRadio_LogRecord); ok { return x.LogRecord } return nil } func (x *FromRadio) GetConfigCompleteId() uint32 { if x, ok := x.GetPayloadVariant().(*FromRadio_ConfigCompleteId); ok { return x.ConfigCompleteId } return 0 } func (x *FromRadio) GetRebooted() bool { if x, ok := x.GetPayloadVariant().(*FromRadio_Rebooted); ok { return x.Rebooted } return false } func (x *FromRadio) GetModuleConfig() *ModuleConfig { if x, ok := x.GetPayloadVariant().(*FromRadio_ModuleConfig); ok { return x.ModuleConfig } return nil } func (x *FromRadio) GetChannel() *Channel { if x, ok := x.GetPayloadVariant().(*FromRadio_Channel); ok { return x.Channel } return nil } func (x *FromRadio) GetQueueStatus() *QueueStatus { if x, ok := x.GetPayloadVariant().(*FromRadio_QueueStatus); ok { return x.QueueStatus } return nil } func (x *FromRadio) GetXmodemPacket() *XModem { if x, ok := x.GetPayloadVariant().(*FromRadio_XmodemPacket); ok { return x.XmodemPacket } return nil } func (x *FromRadio) GetMetadata() *DeviceMetadata { if x, ok := x.GetPayloadVariant().(*FromRadio_Metadata); ok { return x.Metadata } return nil } func (x *FromRadio) GetMqttClientProxyMessage() *MqttClientProxyMessage { if x, ok := x.GetPayloadVariant().(*FromRadio_MqttClientProxyMessage); ok { return x.MqttClientProxyMessage } return nil } func (x *FromRadio) GetFileInfo() *FileInfo { if x, ok := x.GetPayloadVariant().(*FromRadio_FileInfo); ok { return x.FileInfo } return nil } func (x *FromRadio) GetClientNotification() *ClientNotification { if x, ok := x.GetPayloadVariant().(*FromRadio_ClientNotification); ok { return x.ClientNotification } return nil } func (x *FromRadio) GetDeviceuiConfig() *DeviceUIConfig { if x, ok := x.GetPayloadVariant().(*FromRadio_DeviceuiConfig); ok { return x.DeviceuiConfig } return nil } type isFromRadio_PayloadVariant interface { isFromRadio_PayloadVariant() } type FromRadio_Packet struct { // Log levels, chosen to match python logging conventions. Packet *MeshPacket `protobuf:"bytes,2,opt,name=packet,proto3,oneof"` } type FromRadio_MyInfo struct { // Tells the phone what our node number is, can be -1 if we've not yet joined a mesh. // NOTE: This ID must not change - to keep (minimal) compatibility with <1.2 version of android apps. MyInfo *MyNodeInfo `protobuf:"bytes,3,opt,name=my_info,json=myInfo,proto3,oneof"` } type FromRadio_NodeInfo struct { // One packet is sent for each node in the on radio DB // starts over with the first node in our DB NodeInfo *NodeInfo `protobuf:"bytes,4,opt,name=node_info,json=nodeInfo,proto3,oneof"` } type FromRadio_Config struct { // Include a part of the config (was: RadioConfig radio) Config *Config `protobuf:"bytes,5,opt,name=config,proto3,oneof"` } type FromRadio_LogRecord struct { // Set to send debug console output over our protobuf stream LogRecord *LogRecord `protobuf:"bytes,6,opt,name=log_record,json=logRecord,proto3,oneof"` } type FromRadio_ConfigCompleteId struct { // Sent as true once the device has finished sending all of the responses to want_config // recipient should check if this ID matches our original request nonce, if // not, it means your config responses haven't started yet. // NOTE: This ID must not change - to keep (minimal) compatibility with <1.2 version of android apps. ConfigCompleteId uint32 `protobuf:"varint,7,opt,name=config_complete_id,json=configCompleteId,proto3,oneof"` } type FromRadio_Rebooted struct { // Sent to tell clients the radio has just rebooted. // Set to true if present. // Not used on all transports, currently just used for the serial console. // NOTE: This ID must not change - to keep (minimal) compatibility with <1.2 version of android apps. Rebooted bool `protobuf:"varint,8,opt,name=rebooted,proto3,oneof"` } type FromRadio_ModuleConfig struct { // Include module config ModuleConfig *ModuleConfig `protobuf:"bytes,9,opt,name=moduleConfig,proto3,oneof"` } type FromRadio_Channel struct { // One packet is sent for each channel Channel *Channel `protobuf:"bytes,10,opt,name=channel,proto3,oneof"` } type FromRadio_QueueStatus struct { // Queue status info QueueStatus *QueueStatus `protobuf:"bytes,11,opt,name=queueStatus,proto3,oneof"` } type FromRadio_XmodemPacket struct { // File Transfer Chunk XmodemPacket *XModem `protobuf:"bytes,12,opt,name=xmodemPacket,proto3,oneof"` } type FromRadio_Metadata struct { // Device metadata message Metadata *DeviceMetadata `protobuf:"bytes,13,opt,name=metadata,proto3,oneof"` } type FromRadio_MqttClientProxyMessage struct { // MQTT Client Proxy Message (device sending to client / phone for publishing to MQTT) MqttClientProxyMessage *MqttClientProxyMessage `protobuf:"bytes,14,opt,name=mqttClientProxyMessage,proto3,oneof"` } type FromRadio_FileInfo struct { // File system manifest messages FileInfo *FileInfo `protobuf:"bytes,15,opt,name=fileInfo,proto3,oneof"` } type FromRadio_ClientNotification struct { // Notification message to the client ClientNotification *ClientNotification `protobuf:"bytes,16,opt,name=clientNotification,proto3,oneof"` } type FromRadio_DeviceuiConfig struct { // Persistent data for device-ui DeviceuiConfig *DeviceUIConfig `protobuf:"bytes,17,opt,name=deviceuiConfig,proto3,oneof"` } func (*FromRadio_Packet) isFromRadio_PayloadVariant() {} func (*FromRadio_MyInfo) isFromRadio_PayloadVariant() {} func (*FromRadio_NodeInfo) isFromRadio_PayloadVariant() {} func (*FromRadio_Config) isFromRadio_PayloadVariant() {} func (*FromRadio_LogRecord) isFromRadio_PayloadVariant() {} func (*FromRadio_ConfigCompleteId) isFromRadio_PayloadVariant() {} func (*FromRadio_Rebooted) isFromRadio_PayloadVariant() {} func (*FromRadio_ModuleConfig) isFromRadio_PayloadVariant() {} func (*FromRadio_Channel) isFromRadio_PayloadVariant() {} func (*FromRadio_QueueStatus) isFromRadio_PayloadVariant() {} func (*FromRadio_XmodemPacket) isFromRadio_PayloadVariant() {} func (*FromRadio_Metadata) isFromRadio_PayloadVariant() {} func (*FromRadio_MqttClientProxyMessage) isFromRadio_PayloadVariant() {} func (*FromRadio_FileInfo) isFromRadio_PayloadVariant() {} func (*FromRadio_ClientNotification) isFromRadio_PayloadVariant() {} func (*FromRadio_DeviceuiConfig) isFromRadio_PayloadVariant() {} // A notification message from the device to the client // To be used for important messages that should to be displayed to the user // in the form of push notifications or validation messages when saving // invalid configuration. type ClientNotification struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The id of the packet we're notifying in response to ReplyId *uint32 `protobuf:"varint,1,opt,name=reply_id,json=replyId,proto3,oneof" json:"reply_id,omitempty"` // Seconds since 1970 - or 0 for unknown/unset Time uint32 `protobuf:"fixed32,2,opt,name=time,proto3" json:"time,omitempty"` // The level type of notification Level LogRecord_Level `protobuf:"varint,3,opt,name=level,proto3,enum=meshtastic.LogRecord_Level" json:"level,omitempty"` // The message body of the notification Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` } func (x *ClientNotification) Reset() { *x = ClientNotification{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ClientNotification) String() string { return protoimpl.X.MessageStringOf(x) } func (*ClientNotification) ProtoMessage() {} func (x *ClientNotification) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_proto_msgTypes[13] 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 ClientNotification.ProtoReflect.Descriptor instead. func (*ClientNotification) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{13} } func (x *ClientNotification) GetReplyId() uint32 { if x != nil && x.ReplyId != nil { return *x.ReplyId } return 0 } func (x *ClientNotification) GetTime() uint32 { if x != nil { return x.Time } return 0 } func (x *ClientNotification) GetLevel() LogRecord_Level { if x != nil { return x.Level } return LogRecord_UNSET } func (x *ClientNotification) GetMessage() string { if x != nil { return x.Message } return "" } // Individual File info for the device type FileInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The fully qualified path of the file FileName string `protobuf:"bytes,1,opt,name=file_name,json=fileName,proto3" json:"file_name,omitempty"` // The size of the file in bytes SizeBytes uint32 `protobuf:"varint,2,opt,name=size_bytes,json=sizeBytes,proto3" json:"size_bytes,omitempty"` } func (x *FileInfo) Reset() { *x = FileInfo{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *FileInfo) String() string { return protoimpl.X.MessageStringOf(x) } func (*FileInfo) ProtoMessage() {} func (x *FileInfo) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_proto_msgTypes[14] 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 FileInfo.ProtoReflect.Descriptor instead. func (*FileInfo) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{14} } func (x *FileInfo) GetFileName() string { if x != nil { return x.FileName } return "" } func (x *FileInfo) GetSizeBytes() uint32 { if x != nil { return x.SizeBytes } return 0 } // Packets/commands to the radio will be written (reliably) to the toRadio characteristic. // Once the write completes the phone can assume it is handled. type ToRadio struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Log levels, chosen to match python logging conventions. // // Types that are assignable to PayloadVariant: // // *ToRadio_Packet // *ToRadio_WantConfigId // *ToRadio_Disconnect // *ToRadio_XmodemPacket // *ToRadio_MqttClientProxyMessage // *ToRadio_Heartbeat PayloadVariant isToRadio_PayloadVariant `protobuf_oneof:"payload_variant"` } func (x *ToRadio) Reset() { *x = ToRadio{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ToRadio) String() string { return protoimpl.X.MessageStringOf(x) } func (*ToRadio) ProtoMessage() {} func (x *ToRadio) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_proto_msgTypes[15] 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 ToRadio.ProtoReflect.Descriptor instead. func (*ToRadio) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{15} } func (m *ToRadio) GetPayloadVariant() isToRadio_PayloadVariant { if m != nil { return m.PayloadVariant } return nil } func (x *ToRadio) GetPacket() *MeshPacket { if x, ok := x.GetPayloadVariant().(*ToRadio_Packet); ok { return x.Packet } return nil } func (x *ToRadio) GetWantConfigId() uint32 { if x, ok := x.GetPayloadVariant().(*ToRadio_WantConfigId); ok { return x.WantConfigId } return 0 } func (x *ToRadio) GetDisconnect() bool { if x, ok := x.GetPayloadVariant().(*ToRadio_Disconnect); ok { return x.Disconnect } return false } func (x *ToRadio) GetXmodemPacket() *XModem { if x, ok := x.GetPayloadVariant().(*ToRadio_XmodemPacket); ok { return x.XmodemPacket } return nil } func (x *ToRadio) GetMqttClientProxyMessage() *MqttClientProxyMessage { if x, ok := x.GetPayloadVariant().(*ToRadio_MqttClientProxyMessage); ok { return x.MqttClientProxyMessage } return nil } func (x *ToRadio) GetHeartbeat() *Heartbeat { if x, ok := x.GetPayloadVariant().(*ToRadio_Heartbeat); ok { return x.Heartbeat } return nil } type isToRadio_PayloadVariant interface { isToRadio_PayloadVariant() } type ToRadio_Packet struct { // Send this packet on the mesh Packet *MeshPacket `protobuf:"bytes,1,opt,name=packet,proto3,oneof"` } type ToRadio_WantConfigId struct { // Phone wants radio to send full node db to the phone, This is // typically the first packet sent to the radio when the phone gets a // bluetooth connection. The radio will respond by sending back a // MyNodeInfo, a owner, a radio config and a series of // FromRadio.node_infos, and config_complete // the integer you write into this field will be reported back in the // config_complete_id response this allows clients to never be confused by // a stale old partially sent config. WantConfigId uint32 `protobuf:"varint,3,opt,name=want_config_id,json=wantConfigId,proto3,oneof"` } type ToRadio_Disconnect struct { // Tell API server we are disconnecting now. // This is useful for serial links where there is no hardware/protocol based notification that the client has dropped the link. // (Sending this message is optional for clients) Disconnect bool `protobuf:"varint,4,opt,name=disconnect,proto3,oneof"` } type ToRadio_XmodemPacket struct { XmodemPacket *XModem `protobuf:"bytes,5,opt,name=xmodemPacket,proto3,oneof"` } type ToRadio_MqttClientProxyMessage struct { // MQTT Client Proxy Message (for client / phone subscribed to MQTT sending to device) MqttClientProxyMessage *MqttClientProxyMessage `protobuf:"bytes,6,opt,name=mqttClientProxyMessage,proto3,oneof"` } type ToRadio_Heartbeat struct { // Heartbeat message (used to keep the device connection awake on serial) Heartbeat *Heartbeat `protobuf:"bytes,7,opt,name=heartbeat,proto3,oneof"` } func (*ToRadio_Packet) isToRadio_PayloadVariant() {} func (*ToRadio_WantConfigId) isToRadio_PayloadVariant() {} func (*ToRadio_Disconnect) isToRadio_PayloadVariant() {} func (*ToRadio_XmodemPacket) isToRadio_PayloadVariant() {} func (*ToRadio_MqttClientProxyMessage) isToRadio_PayloadVariant() {} func (*ToRadio_Heartbeat) isToRadio_PayloadVariant() {} // Compressed message payload type Compressed struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // PortNum to determine the how to handle the compressed payload. Portnum PortNum `protobuf:"varint,1,opt,name=portnum,proto3,enum=meshtastic.PortNum" json:"portnum,omitempty"` // Compressed data. Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` } func (x *Compressed) Reset() { *x = Compressed{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Compressed) String() string { return protoimpl.X.MessageStringOf(x) } func (*Compressed) ProtoMessage() {} func (x *Compressed) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_proto_msgTypes[16] 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 Compressed.ProtoReflect.Descriptor instead. func (*Compressed) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{16} } func (x *Compressed) GetPortnum() PortNum { if x != nil { return x.Portnum } return PortNum_UNKNOWN_APP } func (x *Compressed) GetData() []byte { if x != nil { return x.Data } return nil } // Full info on edges for a single node type NeighborInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The node ID of the node sending info on its neighbors NodeId uint32 `protobuf:"varint,1,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"` // Field to pass neighbor info for the next sending cycle LastSentById uint32 `protobuf:"varint,2,opt,name=last_sent_by_id,json=lastSentById,proto3" json:"last_sent_by_id,omitempty"` // Broadcast interval of the represented node (in seconds) NodeBroadcastIntervalSecs uint32 `protobuf:"varint,3,opt,name=node_broadcast_interval_secs,json=nodeBroadcastIntervalSecs,proto3" json:"node_broadcast_interval_secs,omitempty"` // The list of out edges from this node Neighbors []*Neighbor `protobuf:"bytes,4,rep,name=neighbors,proto3" json:"neighbors,omitempty"` } func (x *NeighborInfo) Reset() { *x = NeighborInfo{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *NeighborInfo) String() string { return protoimpl.X.MessageStringOf(x) } func (*NeighborInfo) ProtoMessage() {} func (x *NeighborInfo) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_proto_msgTypes[17] 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 NeighborInfo.ProtoReflect.Descriptor instead. func (*NeighborInfo) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{17} } func (x *NeighborInfo) GetNodeId() uint32 { if x != nil { return x.NodeId } return 0 } func (x *NeighborInfo) GetLastSentById() uint32 { if x != nil { return x.LastSentById } return 0 } func (x *NeighborInfo) GetNodeBroadcastIntervalSecs() uint32 { if x != nil { return x.NodeBroadcastIntervalSecs } return 0 } func (x *NeighborInfo) GetNeighbors() []*Neighbor { if x != nil { return x.Neighbors } return nil } // A single edge in the mesh type Neighbor struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Node ID of neighbor NodeId uint32 `protobuf:"varint,1,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"` // SNR of last heard message Snr float32 `protobuf:"fixed32,2,opt,name=snr,proto3" json:"snr,omitempty"` // Reception time (in secs since 1970) of last message that was last sent by this ID. // Note: this is for local storage only and will not be sent out over the mesh. LastRxTime uint32 `protobuf:"fixed32,3,opt,name=last_rx_time,json=lastRxTime,proto3" json:"last_rx_time,omitempty"` // Broadcast interval of this neighbor (in seconds). // Note: this is for local storage only and will not be sent out over the mesh. NodeBroadcastIntervalSecs uint32 `protobuf:"varint,4,opt,name=node_broadcast_interval_secs,json=nodeBroadcastIntervalSecs,proto3" json:"node_broadcast_interval_secs,omitempty"` } func (x *Neighbor) Reset() { *x = Neighbor{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Neighbor) String() string { return protoimpl.X.MessageStringOf(x) } func (*Neighbor) ProtoMessage() {} func (x *Neighbor) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_proto_msgTypes[18] 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 Neighbor.ProtoReflect.Descriptor instead. func (*Neighbor) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{18} } func (x *Neighbor) GetNodeId() uint32 { if x != nil { return x.NodeId } return 0 } func (x *Neighbor) GetSnr() float32 { if x != nil { return x.Snr } return 0 } func (x *Neighbor) GetLastRxTime() uint32 { if x != nil { return x.LastRxTime } return 0 } func (x *Neighbor) GetNodeBroadcastIntervalSecs() uint32 { if x != nil { return x.NodeBroadcastIntervalSecs } return 0 } // Device metadata response type DeviceMetadata struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Device firmware version string FirmwareVersion string `protobuf:"bytes,1,opt,name=firmware_version,json=firmwareVersion,proto3" json:"firmware_version,omitempty"` // Device state version DeviceStateVersion uint32 `protobuf:"varint,2,opt,name=device_state_version,json=deviceStateVersion,proto3" json:"device_state_version,omitempty"` // Indicates whether the device can shutdown CPU natively or via power management chip CanShutdown bool `protobuf:"varint,3,opt,name=canShutdown,proto3" json:"canShutdown,omitempty"` // Indicates that the device has native wifi capability HasWifi bool `protobuf:"varint,4,opt,name=hasWifi,proto3" json:"hasWifi,omitempty"` // Indicates that the device has native bluetooth capability HasBluetooth bool `protobuf:"varint,5,opt,name=hasBluetooth,proto3" json:"hasBluetooth,omitempty"` // Indicates that the device has an ethernet peripheral HasEthernet bool `protobuf:"varint,6,opt,name=hasEthernet,proto3" json:"hasEthernet,omitempty"` // Indicates that the device's role in the mesh Role Config_DeviceConfig_Role `protobuf:"varint,7,opt,name=role,proto3,enum=meshtastic.Config_DeviceConfig_Role" json:"role,omitempty"` // Indicates the device's current enabled position flags PositionFlags uint32 `protobuf:"varint,8,opt,name=position_flags,json=positionFlags,proto3" json:"position_flags,omitempty"` // Device hardware model HwModel HardwareModel `protobuf:"varint,9,opt,name=hw_model,json=hwModel,proto3,enum=meshtastic.HardwareModel" json:"hw_model,omitempty"` // Has Remote Hardware enabled HasRemoteHardware bool `protobuf:"varint,10,opt,name=hasRemoteHardware,proto3" json:"hasRemoteHardware,omitempty"` // Has PKC capabilities HasPKC bool `protobuf:"varint,11,opt,name=hasPKC,proto3" json:"hasPKC,omitempty"` } func (x *DeviceMetadata) Reset() { *x = DeviceMetadata{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *DeviceMetadata) String() string { return protoimpl.X.MessageStringOf(x) } func (*DeviceMetadata) ProtoMessage() {} func (x *DeviceMetadata) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_proto_msgTypes[19] 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 DeviceMetadata.ProtoReflect.Descriptor instead. func (*DeviceMetadata) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{19} } func (x *DeviceMetadata) GetFirmwareVersion() string { if x != nil { return x.FirmwareVersion } return "" } func (x *DeviceMetadata) GetDeviceStateVersion() uint32 { if x != nil { return x.DeviceStateVersion } return 0 } func (x *DeviceMetadata) GetCanShutdown() bool { if x != nil { return x.CanShutdown } return false } func (x *DeviceMetadata) GetHasWifi() bool { if x != nil { return x.HasWifi } return false } func (x *DeviceMetadata) GetHasBluetooth() bool { if x != nil { return x.HasBluetooth } return false } func (x *DeviceMetadata) GetHasEthernet() bool { if x != nil { return x.HasEthernet } return false } func (x *DeviceMetadata) GetRole() Config_DeviceConfig_Role { if x != nil { return x.Role } return Config_DeviceConfig_CLIENT } func (x *DeviceMetadata) GetPositionFlags() uint32 { if x != nil { return x.PositionFlags } return 0 } func (x *DeviceMetadata) GetHwModel() HardwareModel { if x != nil { return x.HwModel } return HardwareModel_UNSET } func (x *DeviceMetadata) GetHasRemoteHardware() bool { if x != nil { return x.HasRemoteHardware } return false } func (x *DeviceMetadata) GetHasPKC() bool { if x != nil { return x.HasPKC } return false } // A heartbeat message is sent to the node from the client to keep the connection alive. // This is currently only needed to keep serial connections alive, but can be used by any PhoneAPI. type Heartbeat struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *Heartbeat) Reset() { *x = Heartbeat{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Heartbeat) String() string { return protoimpl.X.MessageStringOf(x) } func (*Heartbeat) ProtoMessage() {} func (x *Heartbeat) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_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 Heartbeat.ProtoReflect.Descriptor instead. func (*Heartbeat) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{20} } // RemoteHardwarePins associated with a node type NodeRemoteHardwarePin struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The node_num exposing the available gpio pin NodeNum uint32 `protobuf:"varint,1,opt,name=node_num,json=nodeNum,proto3" json:"node_num,omitempty"` // The the available gpio pin for usage with RemoteHardware module Pin *RemoteHardwarePin `protobuf:"bytes,2,opt,name=pin,proto3" json:"pin,omitempty"` } func (x *NodeRemoteHardwarePin) Reset() { *x = NodeRemoteHardwarePin{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *NodeRemoteHardwarePin) String() string { return protoimpl.X.MessageStringOf(x) } func (*NodeRemoteHardwarePin) ProtoMessage() {} func (x *NodeRemoteHardwarePin) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_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 NodeRemoteHardwarePin.ProtoReflect.Descriptor instead. func (*NodeRemoteHardwarePin) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{21} } func (x *NodeRemoteHardwarePin) GetNodeNum() uint32 { if x != nil { return x.NodeNum } return 0 } func (x *NodeRemoteHardwarePin) GetPin() *RemoteHardwarePin { if x != nil { return x.Pin } return nil } type ChunkedPayload struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The ID of the entire payload PayloadId uint32 `protobuf:"varint,1,opt,name=payload_id,json=payloadId,proto3" json:"payload_id,omitempty"` // The total number of chunks in the payload ChunkCount uint32 `protobuf:"varint,2,opt,name=chunk_count,json=chunkCount,proto3" json:"chunk_count,omitempty"` // The current chunk index in the total ChunkIndex uint32 `protobuf:"varint,3,opt,name=chunk_index,json=chunkIndex,proto3" json:"chunk_index,omitempty"` // The binary data of the current chunk PayloadChunk []byte `protobuf:"bytes,4,opt,name=payload_chunk,json=payloadChunk,proto3" json:"payload_chunk,omitempty"` } func (x *ChunkedPayload) Reset() { *x = ChunkedPayload{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ChunkedPayload) String() string { return protoimpl.X.MessageStringOf(x) } func (*ChunkedPayload) ProtoMessage() {} func (x *ChunkedPayload) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_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 ChunkedPayload.ProtoReflect.Descriptor instead. func (*ChunkedPayload) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{22} } func (x *ChunkedPayload) GetPayloadId() uint32 { if x != nil { return x.PayloadId } return 0 } func (x *ChunkedPayload) GetChunkCount() uint32 { if x != nil { return x.ChunkCount } return 0 } func (x *ChunkedPayload) GetChunkIndex() uint32 { if x != nil { return x.ChunkIndex } return 0 } func (x *ChunkedPayload) GetPayloadChunk() []byte { if x != nil { return x.PayloadChunk } return nil } // Wrapper message for broken repeated oneof support type ResendChunks struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Chunks []uint32 `protobuf:"varint,1,rep,packed,name=chunks,proto3" json:"chunks,omitempty"` } func (x *ResendChunks) Reset() { *x = ResendChunks{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ResendChunks) String() string { return protoimpl.X.MessageStringOf(x) } func (*ResendChunks) ProtoMessage() {} func (x *ResendChunks) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_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 ResendChunks.ProtoReflect.Descriptor instead. func (*ResendChunks) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{23} } func (x *ResendChunks) GetChunks() []uint32 { if x != nil { return x.Chunks } return nil } // Responses to a ChunkedPayload request type ChunkedPayloadResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The ID of the entire payload PayloadId uint32 `protobuf:"varint,1,opt,name=payload_id,json=payloadId,proto3" json:"payload_id,omitempty"` // Types that are assignable to PayloadVariant: // // *ChunkedPayloadResponse_RequestTransfer // *ChunkedPayloadResponse_AcceptTransfer // *ChunkedPayloadResponse_ResendChunks PayloadVariant isChunkedPayloadResponse_PayloadVariant `protobuf_oneof:"payload_variant"` } func (x *ChunkedPayloadResponse) Reset() { *x = ChunkedPayloadResponse{} if protoimpl.UnsafeEnabled { mi := &file_protobufs_mesh_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ChunkedPayloadResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*ChunkedPayloadResponse) ProtoMessage() {} func (x *ChunkedPayloadResponse) ProtoReflect() protoreflect.Message { mi := &file_protobufs_mesh_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 ChunkedPayloadResponse.ProtoReflect.Descriptor instead. func (*ChunkedPayloadResponse) Descriptor() ([]byte, []int) { return file_protobufs_mesh_proto_rawDescGZIP(), []int{24} } func (x *ChunkedPayloadResponse) GetPayloadId() uint32 { if x != nil { return x.PayloadId } return 0 } func (m *ChunkedPayloadResponse) GetPayloadVariant() isChunkedPayloadResponse_PayloadVariant { if m != nil { return m.PayloadVariant } return nil } func (x *ChunkedPayloadResponse) GetRequestTransfer() bool { if x, ok := x.GetPayloadVariant().(*ChunkedPayloadResponse_RequestTransfer); ok { return x.RequestTransfer } return false } func (x *ChunkedPayloadResponse) GetAcceptTransfer() bool { if x, ok := x.GetPayloadVariant().(*ChunkedPayloadResponse_AcceptTransfer); ok { return x.AcceptTransfer } return false } func (x *ChunkedPayloadResponse) GetResendChunks() *ResendChunks { if x, ok := x.GetPayloadVariant().(*ChunkedPayloadResponse_ResendChunks); ok { return x.ResendChunks } return nil } type isChunkedPayloadResponse_PayloadVariant interface { isChunkedPayloadResponse_PayloadVariant() } type ChunkedPayloadResponse_RequestTransfer struct { // Request to transfer chunked payload RequestTransfer bool `protobuf:"varint,2,opt,name=request_transfer,json=requestTransfer,proto3,oneof"` } type ChunkedPayloadResponse_AcceptTransfer struct { // Accept the transfer chunked payload AcceptTransfer bool `protobuf:"varint,3,opt,name=accept_transfer,json=acceptTransfer,proto3,oneof"` } type ChunkedPayloadResponse_ResendChunks struct { // Request missing indexes in the chunked payload ResendChunks *ResendChunks `protobuf:"bytes,4,opt,name=resend_chunks,json=resendChunks,proto3,oneof"` } func (*ChunkedPayloadResponse_RequestTransfer) isChunkedPayloadResponse_PayloadVariant() {} func (*ChunkedPayloadResponse_AcceptTransfer) isChunkedPayloadResponse_PayloadVariant() {} func (*ChunkedPayloadResponse_ResendChunks) isChunkedPayloadResponse_PayloadVariant() {} var File_protobufs_mesh_proto protoreflect.FileDescriptor var file_protobufs_mesh_proto_rawDesc = []byte{ 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x73, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x1a, 0x17, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x73, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x73, 0x2f, 0x70, 0x6f, 0x72, 0x74, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x73, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x73, 0x2f, 0x78, 0x6d, 0x6f, 0x64, 0x65, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x73, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa2, 0x09, 0x0a, 0x08, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0a, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x5f, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0f, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x49, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x5f, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0f, 0x48, 0x01, 0x52, 0x0a, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x49, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x61, 0x6c, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x08, 0x61, 0x6c, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x07, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x63, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x61, 0x6c, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x6c, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0e, 0x61, 0x6c, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x07, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x17, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x5f, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0c, 0x61, 0x6c, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x5f, 0x68, 0x61, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x11, 0x48, 0x03, 0x52, 0x0b, 0x61, 0x6c, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x48, 0x61, 0x65, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, 0x1b, 0x61, 0x6c, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x5f, 0x67, 0x65, 0x6f, 0x69, 0x64, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x11, 0x48, 0x04, 0x52, 0x19, 0x61, 0x6c, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x47, 0x65, 0x6f, 0x69, 0x64, 0x61, 0x6c, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x44, 0x4f, 0x50, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x44, 0x4f, 0x50, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x44, 0x4f, 0x50, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x48, 0x44, 0x4f, 0x50, 0x12, 0x12, 0x0a, 0x04, 0x56, 0x44, 0x4f, 0x50, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x56, 0x44, 0x4f, 0x50, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x70, 0x73, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x72, 0x61, 0x63, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x67, 0x70, 0x73, 0x41, 0x63, 0x63, 0x75, 0x72, 0x61, 0x63, 0x79, 0x12, 0x26, 0x0a, 0x0c, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x05, 0x52, 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x53, 0x70, 0x65, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x06, 0x52, 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x78, 0x5f, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x66, 0x69, 0x78, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x78, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x66, 0x69, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0c, 0x73, 0x61, 0x74, 0x73, 0x5f, 0x69, 0x6e, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x73, 0x61, 0x74, 0x73, 0x49, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x71, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x73, 0x65, 0x71, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x69, 0x74, 0x73, 0x22, 0x4e, 0x0a, 0x09, 0x4c, 0x6f, 0x63, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x4c, 0x4f, 0x43, 0x5f, 0x55, 0x4e, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4c, 0x4f, 0x43, 0x5f, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x4c, 0x4f, 0x43, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4c, 0x4f, 0x43, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x03, 0x22, 0x62, 0x0a, 0x09, 0x41, 0x6c, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x4c, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x4c, 0x54, 0x5f, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x4c, 0x54, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x4c, 0x54, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x41, 0x4c, 0x54, 0x5f, 0x42, 0x41, 0x52, 0x4f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x10, 0x04, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x5f, 0x69, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x5f, 0x69, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x6c, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x61, 0x6c, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x5f, 0x68, 0x61, 0x65, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x61, 0x6c, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x5f, 0x67, 0x65, 0x6f, 0x69, 0x64, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x73, 0x70, 0x65, 0x65, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x22, 0xa0, 0x02, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x07, 0x6d, 0x61, 0x63, 0x61, 0x64, 0x64, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x6d, 0x61, 0x63, 0x61, 0x64, 0x64, 0x72, 0x12, 0x34, 0x0a, 0x08, 0x68, 0x77, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x07, 0x68, 0x77, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x64, 0x12, 0x38, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x22, 0x81, 0x01, 0x0a, 0x0e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x07, 0x52, 0x05, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6e, 0x72, 0x5f, 0x74, 0x6f, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x6e, 0x72, 0x54, 0x6f, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x03, 0x28, 0x07, 0x52, 0x09, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x6e, 0x72, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 0x07, 0x73, 0x6e, 0x72, 0x42, 0x61, 0x63, 0x6b, 0x22, 0x89, 0x04, 0x0a, 0x07, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x41, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x0b, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x48, 0x00, 0x52, 0x0a, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0xb0, 0x02, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x45, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x47, 0x4f, 0x54, 0x5f, 0x4e, 0x41, 0x4b, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x4f, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x58, 0x5f, 0x52, 0x45, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x4d, 0x49, 0x54, 0x10, 0x05, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x4f, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x10, 0x06, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, 0x41, 0x52, 0x47, 0x45, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x4e, 0x4f, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, 0x45, 0x10, 0x08, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x10, 0x09, 0x12, 0x0f, 0x0a, 0x0b, 0x42, 0x41, 0x44, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x20, 0x12, 0x12, 0x0a, 0x0e, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x45, 0x44, 0x10, 0x21, 0x12, 0x0e, 0x0a, 0x0a, 0x50, 0x4b, 0x49, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x22, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x4b, 0x49, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x50, 0x55, 0x42, 0x4b, 0x45, 0x59, 0x10, 0x23, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x42, 0x41, 0x44, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x24, 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x45, 0x44, 0x10, 0x25, 0x42, 0x09, 0x0a, 0x07, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x22, 0x9e, 0x02, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2d, 0x0a, 0x07, 0x70, 0x6f, 0x72, 0x74, 0x6e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x52, 0x07, 0x70, 0x6f, 0x72, 0x74, 0x6e, 0x75, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x77, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x07, 0x52, 0x04, 0x64, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x07, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x07, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x07, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x6f, 0x6a, 0x69, 0x18, 0x08, 0x20, 0x01, 0x28, 0x07, 0x52, 0x05, 0x65, 0x6d, 0x6f, 0x6a, 0x69, 0x12, 0x1f, 0x0a, 0x08, 0x62, 0x69, 0x74, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x08, 0x62, 0x69, 0x74, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x62, 0x69, 0x74, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x82, 0x02, 0x0a, 0x08, 0x57, 0x61, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x5f, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0f, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x49, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x5f, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0f, 0x48, 0x01, 0x52, 0x0a, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x49, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x54, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x07, 0x52, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x5f, 0x69, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x5f, 0x69, 0x22, 0x89, 0x01, 0x0a, 0x16, 0x4d, 0x71, 0x74, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x14, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x42, 0x11, 0x0a, 0x0f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x22, 0xec, 0x05, 0x0a, 0x0a, 0x4d, 0x65, 0x73, 0x68, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x07, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x07, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x2c, 0x0a, 0x07, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x07, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x09, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x09, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x07, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x78, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x07, 0x52, 0x06, 0x72, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x78, 0x5f, 0x73, 0x6e, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x72, 0x78, 0x53, 0x6e, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x6f, 0x70, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x68, 0x6f, 0x70, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x77, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x77, 0x61, 0x6e, 0x74, 0x41, 0x63, 0x6b, 0x12, 0x3b, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x78, 0x5f, 0x72, 0x73, 0x73, 0x69, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x78, 0x52, 0x73, 0x73, 0x69, 0x12, 0x3c, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x76, 0x69, 0x61, 0x5f, 0x6d, 0x71, 0x74, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x76, 0x69, 0x61, 0x4d, 0x71, 0x74, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x6f, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x68, 0x6f, 0x70, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x6b, 0x69, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x70, 0x6b, 0x69, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x22, 0x73, 0x0a, 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x09, 0x0a, 0x05, 0x55, 0x4e, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x41, 0x43, 0x4b, 0x47, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x0a, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x40, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x45, 0x4c, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x46, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, 0x45, 0x10, 0x50, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x64, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x43, 0x4b, 0x10, 0x78, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x41, 0x58, 0x10, 0x7f, 0x22, 0x42, 0x0a, 0x07, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x45, 0x44, 0x5f, 0x42, 0x52, 0x4f, 0x41, 0x44, 0x43, 0x41, 0x53, 0x54, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x45, 0x44, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x10, 0x02, 0x42, 0x11, 0x0a, 0x0f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x22, 0xed, 0x02, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x6e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6e, 0x75, 0x6d, 0x12, 0x24, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x6e, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x73, 0x6e, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x07, 0x52, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, 0x64, 0x12, 0x40, 0x0a, 0x0e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x76, 0x69, 0x61, 0x5f, 0x6d, 0x71, 0x74, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x76, 0x69, 0x61, 0x4d, 0x71, 0x74, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x68, 0x6f, 0x70, 0x73, 0x5f, 0x61, 0x77, 0x61, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x08, 0x68, 0x6f, 0x70, 0x73, 0x41, 0x77, 0x61, 0x79, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x46, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x68, 0x6f, 0x70, 0x73, 0x5f, 0x61, 0x77, 0x61, 0x79, 0x22, 0x94, 0x01, 0x0a, 0x0a, 0x4d, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1e, 0x0a, 0x0b, 0x6d, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6d, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x4e, 0x75, 0x6d, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x72, 0x65, 0x62, 0x6f, 0x6f, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x70, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0xde, 0x01, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x07, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x58, 0x0a, 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x09, 0x0a, 0x05, 0x55, 0x4e, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x49, 0x54, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x32, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x28, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x1e, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x14, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x0a, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x52, 0x41, 0x43, 0x45, 0x10, 0x05, 0x22, 0x71, 0x0a, 0x0b, 0x51, 0x75, 0x65, 0x75, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x72, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x66, 0x72, 0x65, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x6c, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x6c, 0x65, 0x6e, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x65, 0x73, 0x68, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x22, 0xc8, 0x07, 0x0a, 0x09, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x61, 0x64, 0x69, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x6d, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x4d, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x33, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x36, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x08, 0x72, 0x65, 0x62, 0x6f, 0x6f, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x62, 0x6f, 0x6f, 0x74, 0x65, 0x64, 0x12, 0x3e, 0x0a, 0x0c, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0c, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x48, 0x00, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x3b, 0x0a, 0x0b, 0x71, 0x75, 0x65, 0x75, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x75, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x71, 0x75, 0x65, 0x75, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x38, 0x0a, 0x0c, 0x78, 0x6d, 0x6f, 0x64, 0x65, 0x6d, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x58, 0x4d, 0x6f, 0x64, 0x65, 0x6d, 0x48, 0x00, 0x52, 0x0c, 0x78, 0x6d, 0x6f, 0x64, 0x65, 0x6d, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x5c, 0x0a, 0x16, 0x6d, 0x71, 0x74, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x4d, 0x71, 0x74, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x16, 0x6d, 0x71, 0x74, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x50, 0x0a, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x75, 0x69, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x55, 0x49, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x75, 0x69, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x11, 0x0a, 0x0f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x22, 0xa2, 0x01, 0x0a, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x07, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x46, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0xe7, 0x02, 0x0a, 0x07, 0x54, 0x6f, 0x52, 0x61, 0x64, 0x69, 0x6f, 0x12, 0x30, 0x0a, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x77, 0x61, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0c, 0x77, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0a, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x78, 0x6d, 0x6f, 0x64, 0x65, 0x6d, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x58, 0x4d, 0x6f, 0x64, 0x65, 0x6d, 0x48, 0x00, 0x52, 0x0c, 0x78, 0x6d, 0x6f, 0x64, 0x65, 0x6d, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x5c, 0x0a, 0x16, 0x6d, 0x71, 0x74, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x4d, 0x71, 0x74, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x16, 0x6d, 0x71, 0x74, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, 0x52, 0x09, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x2d, 0x0a, 0x07, 0x70, 0x6f, 0x72, 0x74, 0x6e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x52, 0x07, 0x70, 0x6f, 0x72, 0x74, 0x6e, 0x75, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xc3, 0x01, 0x0a, 0x0c, 0x4e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x1c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x19, 0x6e, 0x6f, 0x64, 0x65, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x73, 0x12, 0x32, 0x0a, 0x09, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x4e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x52, 0x09, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x73, 0x22, 0x98, 0x01, 0x0a, 0x08, 0x4e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x6e, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x73, 0x6e, 0x72, 0x12, 0x20, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x78, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x07, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x1c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x19, 0x6e, 0x6f, 0x64, 0x65, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x73, 0x22, 0xcc, 0x03, 0x0a, 0x0e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x29, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x61, 0x6e, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x63, 0x61, 0x6e, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x61, 0x73, 0x57, 0x69, 0x66, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x61, 0x73, 0x57, 0x69, 0x66, 0x69, 0x12, 0x22, 0x0a, 0x0c, 0x68, 0x61, 0x73, 0x42, 0x6c, 0x75, 0x65, 0x74, 0x6f, 0x6f, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x68, 0x61, 0x73, 0x42, 0x6c, 0x75, 0x65, 0x74, 0x6f, 0x6f, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x68, 0x61, 0x73, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, 0x73, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x12, 0x38, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x34, 0x0a, 0x08, 0x68, 0x77, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x07, 0x68, 0x77, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x68, 0x61, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x68, 0x61, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x61, 0x73, 0x50, 0x4b, 0x43, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x68, 0x61, 0x73, 0x50, 0x4b, 0x43, 0x22, 0x0b, 0x0a, 0x09, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x22, 0x63, 0x0a, 0x15, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x50, 0x69, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x75, 0x6d, 0x12, 0x2f, 0x0a, 0x03, 0x70, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x50, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x69, 0x6e, 0x22, 0x96, 0x01, 0x0a, 0x0e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x65, 0x64, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x27, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0xe4, 0x01, 0x0a, 0x16, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x65, 0x64, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x10, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x0f, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0e, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x2a, 0xcb, 0x0c, 0x0a, 0x0d, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x09, 0x0a, 0x05, 0x55, 0x4e, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x54, 0x4c, 0x4f, 0x52, 0x41, 0x5f, 0x56, 0x32, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x54, 0x4c, 0x4f, 0x52, 0x41, 0x5f, 0x56, 0x31, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x4c, 0x4f, 0x52, 0x41, 0x5f, 0x56, 0x32, 0x5f, 0x31, 0x5f, 0x31, 0x50, 0x36, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x42, 0x45, 0x41, 0x4d, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x48, 0x45, 0x4c, 0x54, 0x45, 0x43, 0x5f, 0x56, 0x32, 0x5f, 0x30, 0x10, 0x05, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x42, 0x45, 0x41, 0x4d, 0x5f, 0x56, 0x30, 0x50, 0x37, 0x10, 0x06, 0x12, 0x0a, 0x0a, 0x06, 0x54, 0x5f, 0x45, 0x43, 0x48, 0x4f, 0x10, 0x07, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x4c, 0x4f, 0x52, 0x41, 0x5f, 0x56, 0x31, 0x5f, 0x31, 0x50, 0x33, 0x10, 0x08, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x41, 0x4b, 0x34, 0x36, 0x33, 0x31, 0x10, 0x09, 0x12, 0x0f, 0x0a, 0x0b, 0x48, 0x45, 0x4c, 0x54, 0x45, 0x43, 0x5f, 0x56, 0x32, 0x5f, 0x31, 0x10, 0x0a, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x4c, 0x54, 0x45, 0x43, 0x5f, 0x56, 0x31, 0x10, 0x0b, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x49, 0x4c, 0x59, 0x47, 0x4f, 0x5f, 0x54, 0x42, 0x45, 0x41, 0x4d, 0x5f, 0x53, 0x33, 0x5f, 0x43, 0x4f, 0x52, 0x45, 0x10, 0x0c, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x41, 0x4b, 0x31, 0x31, 0x32, 0x30, 0x30, 0x10, 0x0d, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x41, 0x4e, 0x4f, 0x5f, 0x47, 0x31, 0x10, 0x0e, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x4c, 0x4f, 0x52, 0x41, 0x5f, 0x56, 0x32, 0x5f, 0x31, 0x5f, 0x31, 0x50, 0x38, 0x10, 0x0f, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x4c, 0x4f, 0x52, 0x41, 0x5f, 0x54, 0x33, 0x5f, 0x53, 0x33, 0x10, 0x10, 0x12, 0x14, 0x0a, 0x10, 0x4e, 0x41, 0x4e, 0x4f, 0x5f, 0x47, 0x31, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x4f, 0x52, 0x45, 0x52, 0x10, 0x11, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x41, 0x4e, 0x4f, 0x5f, 0x47, 0x32, 0x5f, 0x55, 0x4c, 0x54, 0x52, 0x41, 0x10, 0x12, 0x12, 0x0d, 0x0a, 0x09, 0x4c, 0x4f, 0x52, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x13, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x49, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x10, 0x14, 0x12, 0x0e, 0x0a, 0x0a, 0x57, 0x49, 0x4f, 0x5f, 0x57, 0x4d, 0x31, 0x31, 0x31, 0x30, 0x10, 0x15, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x41, 0x4b, 0x32, 0x35, 0x36, 0x30, 0x10, 0x16, 0x12, 0x13, 0x0a, 0x0f, 0x48, 0x45, 0x4c, 0x54, 0x45, 0x43, 0x5f, 0x48, 0x52, 0x55, 0x5f, 0x33, 0x36, 0x30, 0x31, 0x10, 0x17, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x45, 0x4c, 0x54, 0x45, 0x43, 0x5f, 0x57, 0x49, 0x52, 0x45, 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x42, 0x52, 0x49, 0x44, 0x47, 0x45, 0x10, 0x18, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x31, 0x10, 0x19, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x41, 0x4b, 0x31, 0x31, 0x33, 0x31, 0x30, 0x10, 0x1a, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x45, 0x4e, 0x53, 0x45, 0x4c, 0x4f, 0x52, 0x41, 0x5f, 0x52, 0x50, 0x32, 0x30, 0x34, 0x30, 0x10, 0x1b, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x45, 0x4e, 0x53, 0x45, 0x4c, 0x4f, 0x52, 0x41, 0x5f, 0x53, 0x33, 0x10, 0x1c, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x41, 0x4e, 0x41, 0x52, 0x59, 0x4f, 0x4e, 0x45, 0x10, 0x1d, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x50, 0x32, 0x30, 0x34, 0x30, 0x5f, 0x4c, 0x4f, 0x52, 0x41, 0x10, 0x1e, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x32, 0x10, 0x1f, 0x12, 0x11, 0x0a, 0x0d, 0x4c, 0x4f, 0x52, 0x41, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x56, 0x31, 0x10, 0x20, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x52, 0x46, 0x35, 0x32, 0x38, 0x34, 0x30, 0x44, 0x4b, 0x10, 0x21, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x50, 0x52, 0x10, 0x22, 0x12, 0x0f, 0x0a, 0x0b, 0x47, 0x45, 0x4e, 0x49, 0x45, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x53, 0x10, 0x23, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x52, 0x46, 0x35, 0x32, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x24, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x4f, 0x52, 0x54, 0x44, 0x55, 0x49, 0x4e, 0x4f, 0x10, 0x25, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x5f, 0x53, 0x49, 0x4d, 0x10, 0x26, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x49, 0x59, 0x5f, 0x56, 0x31, 0x10, 0x27, 0x12, 0x15, 0x0a, 0x11, 0x4e, 0x52, 0x46, 0x35, 0x32, 0x38, 0x34, 0x30, 0x5f, 0x50, 0x43, 0x41, 0x31, 0x30, 0x30, 0x35, 0x39, 0x10, 0x28, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x52, 0x5f, 0x44, 0x45, 0x56, 0x10, 0x29, 0x12, 0x0b, 0x0a, 0x07, 0x4d, 0x35, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x10, 0x2a, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x4c, 0x54, 0x45, 0x43, 0x5f, 0x56, 0x33, 0x10, 0x2b, 0x12, 0x11, 0x0a, 0x0d, 0x48, 0x45, 0x4c, 0x54, 0x45, 0x43, 0x5f, 0x57, 0x53, 0x4c, 0x5f, 0x56, 0x33, 0x10, 0x2c, 0x12, 0x13, 0x0a, 0x0f, 0x42, 0x45, 0x54, 0x41, 0x46, 0x50, 0x56, 0x5f, 0x32, 0x34, 0x30, 0x30, 0x5f, 0x54, 0x58, 0x10, 0x2d, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x45, 0x54, 0x41, 0x46, 0x50, 0x56, 0x5f, 0x39, 0x30, 0x30, 0x5f, 0x4e, 0x41, 0x4e, 0x4f, 0x5f, 0x54, 0x58, 0x10, 0x2e, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x50, 0x49, 0x5f, 0x50, 0x49, 0x43, 0x4f, 0x10, 0x2f, 0x12, 0x1b, 0x0a, 0x17, 0x48, 0x45, 0x4c, 0x54, 0x45, 0x43, 0x5f, 0x57, 0x49, 0x52, 0x45, 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x4b, 0x45, 0x52, 0x10, 0x30, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x45, 0x4c, 0x54, 0x45, 0x43, 0x5f, 0x57, 0x49, 0x52, 0x45, 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x50, 0x41, 0x50, 0x45, 0x52, 0x10, 0x31, 0x12, 0x0a, 0x0a, 0x06, 0x54, 0x5f, 0x44, 0x45, 0x43, 0x4b, 0x10, 0x32, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x5f, 0x57, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x33, 0x10, 0x33, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x49, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x52, 0x5f, 0x53, 0x33, 0x10, 0x34, 0x12, 0x0f, 0x0a, 0x0b, 0x48, 0x45, 0x4c, 0x54, 0x45, 0x43, 0x5f, 0x48, 0x54, 0x36, 0x32, 0x10, 0x35, 0x12, 0x12, 0x0a, 0x0e, 0x45, 0x42, 0x59, 0x54, 0x45, 0x5f, 0x45, 0x53, 0x50, 0x33, 0x32, 0x5f, 0x53, 0x33, 0x10, 0x36, 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x53, 0x50, 0x33, 0x32, 0x5f, 0x53, 0x33, 0x5f, 0x50, 0x49, 0x43, 0x4f, 0x10, 0x37, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x48, 0x41, 0x54, 0x54, 0x45, 0x52, 0x5f, 0x32, 0x10, 0x38, 0x12, 0x1e, 0x0a, 0x1a, 0x48, 0x45, 0x4c, 0x54, 0x45, 0x43, 0x5f, 0x57, 0x49, 0x52, 0x45, 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x50, 0x41, 0x50, 0x45, 0x52, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x10, 0x39, 0x12, 0x20, 0x0a, 0x1c, 0x48, 0x45, 0x4c, 0x54, 0x45, 0x43, 0x5f, 0x57, 0x49, 0x52, 0x45, 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x4b, 0x45, 0x52, 0x5f, 0x56, 0x31, 0x5f, 0x30, 0x10, 0x3a, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x10, 0x3b, 0x12, 0x0c, 0x0a, 0x08, 0x54, 0x44, 0x5f, 0x4c, 0x4f, 0x52, 0x41, 0x43, 0x10, 0x3c, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x44, 0x45, 0x42, 0x59, 0x54, 0x45, 0x5f, 0x45, 0x4f, 0x52, 0x41, 0x5f, 0x53, 0x33, 0x10, 0x3d, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x57, 0x43, 0x5f, 0x4d, 0x45, 0x53, 0x48, 0x5f, 0x56, 0x34, 0x10, 0x3e, 0x12, 0x16, 0x0a, 0x12, 0x4e, 0x52, 0x46, 0x35, 0x32, 0x5f, 0x50, 0x52, 0x4f, 0x4d, 0x49, 0x43, 0x52, 0x4f, 0x5f, 0x44, 0x49, 0x59, 0x10, 0x3f, 0x12, 0x1f, 0x0a, 0x1b, 0x52, 0x41, 0x44, 0x49, 0x4f, 0x4d, 0x41, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x39, 0x30, 0x30, 0x5f, 0x42, 0x41, 0x4e, 0x44, 0x49, 0x54, 0x5f, 0x4e, 0x41, 0x4e, 0x4f, 0x10, 0x40, 0x12, 0x1c, 0x0a, 0x18, 0x48, 0x45, 0x4c, 0x54, 0x45, 0x43, 0x5f, 0x43, 0x41, 0x50, 0x53, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x45, 0x4e, 0x53, 0x4f, 0x52, 0x5f, 0x56, 0x33, 0x10, 0x41, 0x12, 0x1d, 0x0a, 0x19, 0x48, 0x45, 0x4c, 0x54, 0x45, 0x43, 0x5f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x41, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x31, 0x39, 0x30, 0x10, 0x42, 0x12, 0x1d, 0x0a, 0x19, 0x48, 0x45, 0x4c, 0x54, 0x45, 0x43, 0x5f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x41, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x45, 0x32, 0x31, 0x33, 0x10, 0x43, 0x12, 0x1d, 0x0a, 0x19, 0x48, 0x45, 0x4c, 0x54, 0x45, 0x43, 0x5f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x41, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x45, 0x32, 0x39, 0x30, 0x10, 0x44, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x45, 0x4c, 0x54, 0x45, 0x43, 0x5f, 0x4d, 0x45, 0x53, 0x48, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x54, 0x31, 0x31, 0x34, 0x10, 0x45, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x45, 0x4e, 0x53, 0x45, 0x43, 0x41, 0x50, 0x5f, 0x49, 0x4e, 0x44, 0x49, 0x43, 0x41, 0x54, 0x4f, 0x52, 0x10, 0x46, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x52, 0x41, 0x43, 0x4b, 0x45, 0x52, 0x5f, 0x54, 0x31, 0x30, 0x30, 0x30, 0x5f, 0x45, 0x10, 0x47, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x41, 0x4b, 0x33, 0x31, 0x37, 0x32, 0x10, 0x48, 0x12, 0x0a, 0x0a, 0x06, 0x57, 0x49, 0x4f, 0x5f, 0x45, 0x35, 0x10, 0x49, 0x12, 0x1a, 0x0a, 0x16, 0x52, 0x41, 0x44, 0x49, 0x4f, 0x4d, 0x41, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x39, 0x30, 0x30, 0x5f, 0x42, 0x41, 0x4e, 0x44, 0x49, 0x54, 0x10, 0x4a, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x45, 0x32, 0x35, 0x4c, 0x53, 0x30, 0x31, 0x5f, 0x34, 0x59, 0x31, 0x30, 0x54, 0x44, 0x10, 0x4b, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x50, 0x32, 0x30, 0x34, 0x30, 0x5f, 0x46, 0x45, 0x41, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x52, 0x46, 0x4d, 0x39, 0x35, 0x10, 0x4c, 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x35, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x43, 0x4f, 0x52, 0x45, 0x42, 0x41, 0x53, 0x49, 0x43, 0x10, 0x4d, 0x12, 0x11, 0x0a, 0x0d, 0x4d, 0x35, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x43, 0x4f, 0x52, 0x45, 0x32, 0x10, 0x4e, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x50, 0x49, 0x5f, 0x50, 0x49, 0x43, 0x4f, 0x32, 0x10, 0x4f, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x35, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x43, 0x4f, 0x52, 0x45, 0x53, 0x33, 0x10, 0x50, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x45, 0x45, 0x45, 0x44, 0x5f, 0x58, 0x49, 0x41, 0x4f, 0x5f, 0x53, 0x33, 0x10, 0x51, 0x12, 0x0b, 0x0a, 0x07, 0x4d, 0x53, 0x32, 0x34, 0x53, 0x46, 0x31, 0x10, 0x52, 0x12, 0x0c, 0x0a, 0x08, 0x54, 0x4c, 0x4f, 0x52, 0x41, 0x5f, 0x43, 0x36, 0x10, 0x53, 0x12, 0x0f, 0x0a, 0x0a, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x5f, 0x48, 0x57, 0x10, 0xff, 0x01, 0x2a, 0x2c, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x10, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4c, 0x45, 0x4e, 0x10, 0xed, 0x01, 0x2a, 0xb4, 0x02, 0x0a, 0x11, 0x43, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x58, 0x5f, 0x57, 0x41, 0x54, 0x43, 0x48, 0x44, 0x4f, 0x47, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x4c, 0x45, 0x45, 0x50, 0x5f, 0x45, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x5f, 0x52, 0x41, 0x44, 0x49, 0x4f, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x55, 0x42, 0x4c, 0x4f, 0x58, 0x5f, 0x55, 0x4e, 0x49, 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x58, 0x50, 0x31, 0x39, 0x32, 0x10, 0x06, 0x12, 0x19, 0x0a, 0x15, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x52, 0x41, 0x44, 0x49, 0x4f, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x4d, 0x49, 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x08, 0x12, 0x0c, 0x0a, 0x08, 0x42, 0x52, 0x4f, 0x57, 0x4e, 0x4f, 0x55, 0x54, 0x10, 0x09, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x58, 0x31, 0x32, 0x36, 0x32, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x0a, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x41, 0x44, 0x49, 0x4f, 0x5f, 0x53, 0x50, 0x49, 0x5f, 0x42, 0x55, 0x47, 0x10, 0x0b, 0x12, 0x20, 0x0a, 0x1c, 0x46, 0x4c, 0x41, 0x53, 0x48, 0x5f, 0x43, 0x4f, 0x52, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0c, 0x12, 0x22, 0x0a, 0x1e, 0x46, 0x4c, 0x41, 0x53, 0x48, 0x5f, 0x43, 0x4f, 0x52, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x52, 0x45, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0d, 0x42, 0x86, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x65, 0x65, 0x6b, 0x73, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x42, 0x0a, 0x4d, 0x65, 0x73, 0x68, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x5a, 0x49, 0x67, 0x69, 0x74, 0x2e, 0x6a, 0x61, 0x6e, 0x6b, 0x79, 0x2e, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6e, 0x6e, 0x2f, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2d, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x2d, 0x67, 0x6f, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x73, 0xaa, 0x02, 0x14, 0x4d, 0x65, 0x73, 0x68, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x73, 0xba, 0x02, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_protobufs_mesh_proto_rawDescOnce sync.Once file_protobufs_mesh_proto_rawDescData = file_protobufs_mesh_proto_rawDesc ) func file_protobufs_mesh_proto_rawDescGZIP() []byte { file_protobufs_mesh_proto_rawDescOnce.Do(func() { file_protobufs_mesh_proto_rawDescData = protoimpl.X.CompressGZIP(file_protobufs_mesh_proto_rawDescData) }) return file_protobufs_mesh_proto_rawDescData } var file_protobufs_mesh_proto_enumTypes = make([]protoimpl.EnumInfo, 9) var file_protobufs_mesh_proto_msgTypes = make([]protoimpl.MessageInfo, 25) var file_protobufs_mesh_proto_goTypes = []interface{}{ (HardwareModel)(0), // 0: meshtastic.HardwareModel (Constants)(0), // 1: meshtastic.Constants (CriticalErrorCode)(0), // 2: meshtastic.CriticalErrorCode (Position_LocSource)(0), // 3: meshtastic.Position.LocSource (Position_AltSource)(0), // 4: meshtastic.Position.AltSource (Routing_Error)(0), // 5: meshtastic.Routing.Error (MeshPacket_Priority)(0), // 6: meshtastic.MeshPacket.Priority (MeshPacket_Delayed)(0), // 7: meshtastic.MeshPacket.Delayed (LogRecord_Level)(0), // 8: meshtastic.LogRecord.Level (*Position)(nil), // 9: meshtastic.Position (*User)(nil), // 10: meshtastic.User (*RouteDiscovery)(nil), // 11: meshtastic.RouteDiscovery (*Routing)(nil), // 12: meshtastic.Routing (*Data)(nil), // 13: meshtastic.Data (*Waypoint)(nil), // 14: meshtastic.Waypoint (*MqttClientProxyMessage)(nil), // 15: meshtastic.MqttClientProxyMessage (*MeshPacket)(nil), // 16: meshtastic.MeshPacket (*NodeInfo)(nil), // 17: meshtastic.NodeInfo (*MyNodeInfo)(nil), // 18: meshtastic.MyNodeInfo (*LogRecord)(nil), // 19: meshtastic.LogRecord (*QueueStatus)(nil), // 20: meshtastic.QueueStatus (*FromRadio)(nil), // 21: meshtastic.FromRadio (*ClientNotification)(nil), // 22: meshtastic.ClientNotification (*FileInfo)(nil), // 23: meshtastic.FileInfo (*ToRadio)(nil), // 24: meshtastic.ToRadio (*Compressed)(nil), // 25: meshtastic.Compressed (*NeighborInfo)(nil), // 26: meshtastic.NeighborInfo (*Neighbor)(nil), // 27: meshtastic.Neighbor (*DeviceMetadata)(nil), // 28: meshtastic.DeviceMetadata (*Heartbeat)(nil), // 29: meshtastic.Heartbeat (*NodeRemoteHardwarePin)(nil), // 30: meshtastic.NodeRemoteHardwarePin (*ChunkedPayload)(nil), // 31: meshtastic.ChunkedPayload (*ResendChunks)(nil), // 32: meshtastic.resend_chunks (*ChunkedPayloadResponse)(nil), // 33: meshtastic.ChunkedPayloadResponse (Config_DeviceConfig_Role)(0), // 34: meshtastic.Config.DeviceConfig.Role (PortNum)(0), // 35: meshtastic.PortNum (*DeviceMetrics)(nil), // 36: meshtastic.DeviceMetrics (*Config)(nil), // 37: meshtastic.Config (*ModuleConfig)(nil), // 38: meshtastic.ModuleConfig (*Channel)(nil), // 39: meshtastic.Channel (*XModem)(nil), // 40: meshtastic.XModem (*DeviceUIConfig)(nil), // 41: meshtastic.DeviceUIConfig (*RemoteHardwarePin)(nil), // 42: meshtastic.RemoteHardwarePin } var file_protobufs_mesh_proto_depIdxs = []int32{ 3, // 0: meshtastic.Position.location_source:type_name -> meshtastic.Position.LocSource 4, // 1: meshtastic.Position.altitude_source:type_name -> meshtastic.Position.AltSource 0, // 2: meshtastic.User.hw_model:type_name -> meshtastic.HardwareModel 34, // 3: meshtastic.User.role:type_name -> meshtastic.Config.DeviceConfig.Role 11, // 4: meshtastic.Routing.route_request:type_name -> meshtastic.RouteDiscovery 11, // 5: meshtastic.Routing.route_reply:type_name -> meshtastic.RouteDiscovery 5, // 6: meshtastic.Routing.error_reason:type_name -> meshtastic.Routing.Error 35, // 7: meshtastic.Data.portnum:type_name -> meshtastic.PortNum 13, // 8: meshtastic.MeshPacket.decoded:type_name -> meshtastic.Data 6, // 9: meshtastic.MeshPacket.priority:type_name -> meshtastic.MeshPacket.Priority 7, // 10: meshtastic.MeshPacket.delayed:type_name -> meshtastic.MeshPacket.Delayed 10, // 11: meshtastic.NodeInfo.user:type_name -> meshtastic.User 9, // 12: meshtastic.NodeInfo.position:type_name -> meshtastic.Position 36, // 13: meshtastic.NodeInfo.device_metrics:type_name -> meshtastic.DeviceMetrics 8, // 14: meshtastic.LogRecord.level:type_name -> meshtastic.LogRecord.Level 16, // 15: meshtastic.FromRadio.packet:type_name -> meshtastic.MeshPacket 18, // 16: meshtastic.FromRadio.my_info:type_name -> meshtastic.MyNodeInfo 17, // 17: meshtastic.FromRadio.node_info:type_name -> meshtastic.NodeInfo 37, // 18: meshtastic.FromRadio.config:type_name -> meshtastic.Config 19, // 19: meshtastic.FromRadio.log_record:type_name -> meshtastic.LogRecord 38, // 20: meshtastic.FromRadio.moduleConfig:type_name -> meshtastic.ModuleConfig 39, // 21: meshtastic.FromRadio.channel:type_name -> meshtastic.Channel 20, // 22: meshtastic.FromRadio.queueStatus:type_name -> meshtastic.QueueStatus 40, // 23: meshtastic.FromRadio.xmodemPacket:type_name -> meshtastic.XModem 28, // 24: meshtastic.FromRadio.metadata:type_name -> meshtastic.DeviceMetadata 15, // 25: meshtastic.FromRadio.mqttClientProxyMessage:type_name -> meshtastic.MqttClientProxyMessage 23, // 26: meshtastic.FromRadio.fileInfo:type_name -> meshtastic.FileInfo 22, // 27: meshtastic.FromRadio.clientNotification:type_name -> meshtastic.ClientNotification 41, // 28: meshtastic.FromRadio.deviceuiConfig:type_name -> meshtastic.DeviceUIConfig 8, // 29: meshtastic.ClientNotification.level:type_name -> meshtastic.LogRecord.Level 16, // 30: meshtastic.ToRadio.packet:type_name -> meshtastic.MeshPacket 40, // 31: meshtastic.ToRadio.xmodemPacket:type_name -> meshtastic.XModem 15, // 32: meshtastic.ToRadio.mqttClientProxyMessage:type_name -> meshtastic.MqttClientProxyMessage 29, // 33: meshtastic.ToRadio.heartbeat:type_name -> meshtastic.Heartbeat 35, // 34: meshtastic.Compressed.portnum:type_name -> meshtastic.PortNum 27, // 35: meshtastic.NeighborInfo.neighbors:type_name -> meshtastic.Neighbor 34, // 36: meshtastic.DeviceMetadata.role:type_name -> meshtastic.Config.DeviceConfig.Role 0, // 37: meshtastic.DeviceMetadata.hw_model:type_name -> meshtastic.HardwareModel 42, // 38: meshtastic.NodeRemoteHardwarePin.pin:type_name -> meshtastic.RemoteHardwarePin 32, // 39: meshtastic.ChunkedPayloadResponse.resend_chunks:type_name -> meshtastic.resend_chunks 40, // [40:40] is the sub-list for method output_type 40, // [40:40] is the sub-list for method input_type 40, // [40:40] is the sub-list for extension type_name 40, // [40:40] is the sub-list for extension extendee 0, // [0:40] is the sub-list for field type_name } func init() { file_protobufs_mesh_proto_init() } func file_protobufs_mesh_proto_init() { if File_protobufs_mesh_proto != nil { return } file_protobufs_channel_proto_init() file_protobufs_config_proto_init() file_protobufs_module_config_proto_init() file_protobufs_portnums_proto_init() file_protobufs_telemetry_proto_init() file_protobufs_xmodem_proto_init() file_protobufs_device_ui_proto_init() if !protoimpl.UnsafeEnabled { file_protobufs_mesh_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Position); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*User); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RouteDiscovery); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Routing); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Data); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Waypoint); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MqttClientProxyMessage); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MeshPacket); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeInfo); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MyNodeInfo); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LogRecord); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueueStatus); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FromRadio); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ClientNotification); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FileInfo); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ToRadio); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Compressed); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NeighborInfo); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Neighbor); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeviceMetadata); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Heartbeat); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeRemoteHardwarePin); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChunkedPayload); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ResendChunks); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_protobufs_mesh_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChunkedPayloadResponse); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } file_protobufs_mesh_proto_msgTypes[0].OneofWrappers = []interface{}{} file_protobufs_mesh_proto_msgTypes[3].OneofWrappers = []interface{}{ (*Routing_RouteRequest)(nil), (*Routing_RouteReply)(nil), (*Routing_ErrorReason)(nil), } file_protobufs_mesh_proto_msgTypes[4].OneofWrappers = []interface{}{} file_protobufs_mesh_proto_msgTypes[5].OneofWrappers = []interface{}{} file_protobufs_mesh_proto_msgTypes[6].OneofWrappers = []interface{}{ (*MqttClientProxyMessage_Data)(nil), (*MqttClientProxyMessage_Text)(nil), } file_protobufs_mesh_proto_msgTypes[7].OneofWrappers = []interface{}{ (*MeshPacket_Decoded)(nil), (*MeshPacket_Encrypted)(nil), } file_protobufs_mesh_proto_msgTypes[8].OneofWrappers = []interface{}{} file_protobufs_mesh_proto_msgTypes[12].OneofWrappers = []interface{}{ (*FromRadio_Packet)(nil), (*FromRadio_MyInfo)(nil), (*FromRadio_NodeInfo)(nil), (*FromRadio_Config)(nil), (*FromRadio_LogRecord)(nil), (*FromRadio_ConfigCompleteId)(nil), (*FromRadio_Rebooted)(nil), (*FromRadio_ModuleConfig)(nil), (*FromRadio_Channel)(nil), (*FromRadio_QueueStatus)(nil), (*FromRadio_XmodemPacket)(nil), (*FromRadio_Metadata)(nil), (*FromRadio_MqttClientProxyMessage)(nil), (*FromRadio_FileInfo)(nil), (*FromRadio_ClientNotification)(nil), (*FromRadio_DeviceuiConfig)(nil), } file_protobufs_mesh_proto_msgTypes[13].OneofWrappers = []interface{}{} file_protobufs_mesh_proto_msgTypes[15].OneofWrappers = []interface{}{ (*ToRadio_Packet)(nil), (*ToRadio_WantConfigId)(nil), (*ToRadio_Disconnect)(nil), (*ToRadio_XmodemPacket)(nil), (*ToRadio_MqttClientProxyMessage)(nil), (*ToRadio_Heartbeat)(nil), } file_protobufs_mesh_proto_msgTypes[24].OneofWrappers = []interface{}{ (*ChunkedPayloadResponse_RequestTransfer)(nil), (*ChunkedPayloadResponse_AcceptTransfer)(nil), (*ChunkedPayloadResponse_ResendChunks)(nil), } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protobufs_mesh_proto_rawDesc, NumEnums: 9, NumMessages: 25, NumExtensions: 0, NumServices: 0, }, GoTypes: file_protobufs_mesh_proto_goTypes, DependencyIndexes: file_protobufs_mesh_proto_depIdxs, EnumInfos: file_protobufs_mesh_proto_enumTypes, MessageInfos: file_protobufs_mesh_proto_msgTypes, }.Build() File_protobufs_mesh_proto = out.File file_protobufs_mesh_proto_rawDesc = nil file_protobufs_mesh_proto_goTypes = nil file_protobufs_mesh_proto_depIdxs = nil }