Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-meshtastic for 
openSUSE:Factory checked in at 2026-01-05 14:54:41
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-meshtastic (Old)
 and      /work/SRC/openSUSE:Factory/.python-meshtastic.new.1928 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-meshtastic"

Mon Jan  5 14:54:41 2026 rev:12 rq:1325333 version:2.7.6

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-meshtastic/python-meshtastic.changes      
2025-11-18 15:40:40.785577637 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-meshtastic.new.1928/python-meshtastic.changes
    2026-01-05 14:57:41.885598270 +0100
@@ -1,0 +2,10 @@
+Mon Jan  5 05:07:31 UTC 2026 - Steve Kowalik <[email protected]>
+
+- Update to 2.7.6:
+  * Add a bunch more detail to --device-metadata output, from fields we
+    weren't formerly using in the output.
+  * Splitting out true_defaults for moduleConfig in export_config()
+  * Reverted changes to close()
+- Actually run the testsuite.
+
+-------------------------------------------------------------------

Old:
----
  meshtastic-2.7.4.tar.gz

New:
----
  meshtastic-2.7.6.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-meshtastic.spec ++++++
--- /var/tmp/diff_new_pack.IHT2ZL/_old  2026-01-05 14:57:44.601711127 +0100
+++ /var/tmp/diff_new_pack.IHT2ZL/_new  2026-01-05 14:57:44.605711293 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-meshtastic
 #
-# Copyright (c) 2025 SUSE LLC and contributors
+# Copyright (c) 2026 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -19,17 +19,23 @@
 %bcond_without libalternatives
 %{?sle15_python_module_pythons}
 Name:           python-meshtastic
-Version:        2.7.4
+Version:        2.7.6
 Release:        0
 Summary:        A Python client for use with Meshtastic devices
 License:        GPL-3.0-only
-Group:          Development/Languages/Python
 URL:            https://github.com/meshtastic/python
 Source:         
https://files.pythonhosted.org/packages/source/m/meshtastic/meshtastic-%{version}.tar.gz
-BuildRequires:  %{python_module flit-core}
-BuildRequires:  %{python_module hatchling}
+BuildRequires:  %{python_module PyYAML}
+BuildRequires:  %{python_module bleak}
+BuildRequires:  %{python_module hypothesis}
 BuildRequires:  %{python_module pip}
 BuildRequires:  %{python_module poetry-core}
+BuildRequires:  %{python_module protobuf >= 4.21.12}
+BuildRequires:  %{python_module pypubsub >= 4.0.3}
+BuildRequires:  %{python_module pyserial >= 3.5}
+BuildRequires:  %{python_module pytest}
+BuildRequires:  %{python_module requests >= 2.31.0}
+BuildRequires:  %{python_module tabulate >= 0.9.0}
 BuildRequires:  alts
 BuildRequires:  fdupes
 BuildRequires:  python-rpm-macros
@@ -51,17 +57,23 @@
 
 %prep
 %setup -q -n meshtastic-%{version}
+# Completely fail
+rm meshtastic/tests/test_smoke*.py meshtastic/tests/test_int.py 
meshtastic/tests/test_main.py
 
 %build
 %pyproject_wheel
 
 %install
 %pyproject_install
+%python_expand rm %{buildroot}%{$python_sitelib}/meshtastic/.gitignore
 %python_expand %fdupes %{buildroot}%{$python_sitelib}
 %python_clone -a %{buildroot}%{_bindir}/mesh-analysis
 %python_clone -a %{buildroot}%{_bindir}/mesh-tunnel
 %python_clone -a %{buildroot}%{_bindir}/meshtastic
 
+%check
+%pytest -k 'not test_examples_hello_world_serial_no_arg'
+
 %pre
 %python_libalternatives_reset_alternative mesh-analysis
 %python_libalternatives_reset_alternative mesh-tunnel
@@ -74,5 +86,5 @@
 %python_alternative %{_bindir}/mesh-tunnel
 %python_alternative %{_bindir}/meshtastic
 %{python_sitelib}/meshtastic
-%{python_sitelib}/meshtastic-%{version}*-info
+%{python_sitelib}/meshtastic-%{version}.dist-info
 

++++++ meshtastic-2.7.4.tar.gz -> meshtastic-2.7.6.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/meshtastic-2.7.4/PKG-INFO 
new/meshtastic-2.7.6/PKG-INFO
--- old/meshtastic-2.7.4/PKG-INFO       1970-01-01 01:00:00.000000000 +0100
+++ new/meshtastic-2.7.6/PKG-INFO       1970-01-01 01:00:00.000000000 +0100
@@ -1,12 +1,12 @@
 Metadata-Version: 2.4
 Name: meshtastic
-Version: 2.7.4
+Version: 2.7.6
 Summary: Python API & client shell for talking to Meshtastic devices
 License: GPL-3.0-only
 License-File: LICENSE.md
 Author: Meshtastic Developers
 Author-email: [email protected]
-Requires-Python: >=3.9,<3.14
+Requires-Python: >=3.9,<3.15
 Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
 Classifier: Programming Language :: Python :: 3
 Classifier: Programming Language :: Python :: 3.9
@@ -14,11 +14,12 @@
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
 Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: 3.14
 Provides-Extra: analysis
 Provides-Extra: cli
 Provides-Extra: tunnel
 Requires-Dist: argcomplete (>=3.5.2,<4.0.0) ; extra == "cli"
-Requires-Dist: bleak (>=0.22.3,<0.23.0)
+Requires-Dist: bleak (>=0.22.3)
 Requires-Dist: dash (>=2.17.1,<3.0.0) ; extra == "analysis"
 Requires-Dist: dash-bootstrap-components (>=1.6.0,<2.0.0) ; extra == "analysis"
 Requires-Dist: dotmap (>=1.3.30,<2.0.0) ; extra == "cli"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/meshtastic-2.7.4/meshtastic/__main__.py 
new/meshtastic-2.7.6/meshtastic/__main__.py
--- old/meshtastic-2.7.4/meshtastic/__main__.py 1970-01-01 01:00:00.000000000 
+0100
+++ new/meshtastic-2.7.6/meshtastic/__main__.py 1970-01-01 01:00:00.000000000 
+0100
@@ -1147,13 +1147,16 @@
     configObj = {}
 
     # A list of configuration keys that should be set to False if they are 
missing
-    true_defaults = {
+    config_true_defaults = {
         ("bluetooth", "enabled"),
         ("lora", "sx126xRxBoostedGain"),
         ("lora", "txEnabled"),
         ("lora", "usePreset"),
         ("position", "positionBroadcastSmartEnabled"),
         ("security", "serialEnabled"),
+    }
+
+    module_true_defaults = {
         ("mqtt", "encryptionEnabled"),
     }
 
@@ -1215,7 +1218,7 @@
         else:
             configObj["config"] = config
 
-        set_missing_flags_false(configObj["config"], true_defaults)
+        set_missing_flags_false(configObj["config"], config_true_defaults)
 
     module_config = MessageToDict(interface.localNode.moduleConfig)
     if module_config:
@@ -1229,6 +1232,8 @@
         else:
             configObj["module_config"] = prefs
 
+        set_missing_flags_false(configObj["module_config"], 
module_true_defaults)
+
     config_txt = "# start of Meshtastic configure yaml\n"              
#checkme - "config" (now changed to config_out)
                                                                         #was 
used as a string here and a Dictionary above
     config_txt += yaml.dump(configObj)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/meshtastic-2.7.4/meshtastic/node.py 
new/meshtastic-2.7.6/meshtastic/node.py
--- old/meshtastic-2.7.4/meshtastic/node.py     1970-01-01 01:00:00.000000000 
+0100
+++ new/meshtastic-2.7.6/meshtastic/node.py     1970-01-01 01:00:00.000000000 
+0100
@@ -7,7 +7,7 @@
 
 from typing import Optional, Union, List
 
-from meshtastic.protobuf import admin_pb2, apponly_pb2, channel_pb2, 
localonly_pb2, mesh_pb2, portnums_pb2
+from meshtastic.protobuf import admin_pb2, apponly_pb2, channel_pb2, 
config_pb2, localonly_pb2, mesh_pb2, portnums_pb2
 from meshtastic.util import (
     Timeout,
     camel_to_snake,
@@ -18,6 +18,7 @@
     message_to_json,
     generate_channel_hash,
     to_node_num,
+    flags_to_list,
 )
 
 logger = logging.getLogger(__name__)
@@ -54,6 +55,16 @@
         r += ")"
         return r
 
+    @staticmethod
+    def position_flags_list(position_flags: int) -> List[str]:
+        "Return a list of position flags from the given flags integer"
+        return flags_to_list(config_pb2.Config.PositionConfig.PositionFlags, 
position_flags)
+
+    @staticmethod
+    def excluded_modules_list(excluded_modules: int) -> List[str]:
+        "Return a list of excluded modules from the given flags integer"
+        return flags_to_list(mesh_pb2.ExcludedModules, excluded_modules)
+
     def module_available(self, excluded_bit: int) -> bool:
         """Check DeviceMetadata.excluded_modules to see if a module is 
available."""
         meta = getattr(self.iface, "metadata", None)
@@ -902,6 +913,18 @@
             logger.debug(f"Received metadata {stripnl(c)}")
             print(f"\nfirmware_version: {c.firmware_version}")
             print(f"device_state_version: {c.device_state_version}")
+            if c.role in config_pb2.Config.DeviceConfig.Role.values():
+                print(f"role: 
{config_pb2.Config.DeviceConfig.Role.Name(c.role)}")
+            else:
+                print(f"role: {c.role}")
+            print(f"position_flags: 
{self.position_flags_list(c.position_flags)}")
+            if c.hw_model in mesh_pb2.HardwareModel.values():
+                print(f"hw_model: {mesh_pb2.HardwareModel.Name(c.hw_model)}")
+            else:
+                print(f"hw_model: {c.hw_model}")
+            print(f"hasPKC: {c.hasPKC}")
+            if c.excluded_modules > 0:
+                print(f"excluded_modules: 
{self.excluded_modules_list(c.excluded_modules)}")
 
     def onResponseRequestChannel(self, p):
         """Handle the response packet for requesting a channel 
_requestChannel()"""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/meshtastic-2.7.4/meshtastic/protobuf/admin_pb2.py 
new/meshtastic-2.7.6/meshtastic/protobuf/admin_pb2.py
--- old/meshtastic-2.7.4/meshtastic/protobuf/admin_pb2.py       1970-01-01 
01:00:00.000000000 +0100
+++ new/meshtastic-2.7.6/meshtastic/protobuf/admin_pb2.py       1970-01-01 
01:00:00.000000000 +0100
@@ -19,7 +19,7 @@
 from meshtastic.protobuf import module_config_pb2 as 
meshtastic_dot_protobuf_dot_module__config__pb2
 
 
-DESCRIPTOR = 
_descriptor_pool.Default().AddSerializedFile(b'\n\x1fmeshtastic/protobuf/admin.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a
 
meshtastic/protobuf/config.proto\x1a+meshtastic/protobuf/connection_status.proto\x1a#meshtastic/protobuf/device_ui.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a\'meshtastic/protobuf/module_config.proto\"\xa5\x1a\n\x0c\x41\x64minMessage\x12\x17\n\x0fsession_passkey\x18\x65
 \x01(\x0c\x12\x1d\n\x13get_channel_request\x18\x01 
\x01(\rH\x00\x12<\n\x14get_channel_response\x18\x02 
\x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x1b\n\x11get_owner_request\x18\x03
 \x01(\x08H\x00\x12\x37\n\x12get_owner_response\x18\x04 
\x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12J\n\x12get_config_request\x18\x05
 
\x01(\x0e\x32,.meshtastic.protobuf.AdminMessage.ConfigTypeH\x00\x12:\n\x13get_config_response\x18\x06
 
\x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12W\n\x19get_module_config_request\x18\x07
 \x01(\x0e\x32\x32.meshtast
 
ic.protobuf.AdminMessage.ModuleConfigTypeH\x00\x12G\n\x1aget_module_config_response\x18\x08
 
\x01(\x0b\x32!.meshtastic.protobuf.ModuleConfigH\x00\x12\x34\n*get_canned_message_module_messages_request\x18\n
 \x01(\x08H\x00\x12\x35\n+get_canned_message_module_messages_response\x18\x0b 
\x01(\tH\x00\x12%\n\x1bget_device_metadata_request\x18\x0c 
\x01(\x08H\x00\x12K\n\x1cget_device_metadata_response\x18\r 
\x01(\x0b\x32#.meshtastic.protobuf.DeviceMetadataH\x00\x12\x1e\n\x14get_ringtone_request\x18\x0e
 \x01(\x08H\x00\x12\x1f\n\x15get_ringtone_response\x18\x0f 
\x01(\tH\x00\x12.\n$get_device_connection_status_request\x18\x10 
\x01(\x08H\x00\x12\\\n%get_device_connection_status_response\x18\x11 
\x01(\x0b\x32+.meshtastic.protobuf.DeviceConnectionStatusH\x00\x12:\n\x0cset_ham_mode\x18\x12
 
\x01(\x0b\x32\".meshtastic.protobuf.HamParametersH\x00\x12/\n%get_node_remote_hardware_pins_request\x18\x13
 \x01(\x08H\x00\x12\x65\n&get_node_remote_hardware_pins_response\x18\x14 
\x01(\x0b\x32\x33.meshtastic.proto
 buf.NodeRemoteHardwarePinsResponseH\x00\x12 
\n\x16\x65nter_dfu_mode_request\x18\x15 
\x01(\x08H\x00\x12\x1d\n\x13\x64\x65lete_file_request\x18\x16 
\x01(\tH\x00\x12\x13\n\tset_scale\x18\x17 
\x01(\rH\x00\x12N\n\x12\x62\x61\x63kup_preferences\x18\x18 
\x01(\x0e\x32\x30.meshtastic.protobuf.AdminMessage.BackupLocationH\x00\x12O\n\x13restore_preferences\x18\x19
 
\x01(\x0e\x32\x30.meshtastic.protobuf.AdminMessage.BackupLocationH\x00\x12U\n\x19remove_backup_preferences\x18\x1a
 
\x01(\x0e\x32\x30.meshtastic.protobuf.AdminMessage.BackupLocationH\x00\x12H\n\x10send_input_event\x18\x1b
 
\x01(\x0b\x32,.meshtastic.protobuf.AdminMessage.InputEventH\x00\x12.\n\tset_owner\x18
  \x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12\x33\n\x0bset_channel\x18! 
\x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x31\n\nset_config\x18\" 
\x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12>\n\x11set_module_config\x18#
 
\x01(\x0b\x32!.meshtastic.protobuf.ModuleConfigH\x00\x12,\n\"set_canned_message_module_messag
 es\x18$ \x01(\tH\x00\x12\x1e\n\x14set_ringtone_message\x18% 
\x01(\tH\x00\x12\x1b\n\x11remove_by_nodenum\x18& 
\x01(\rH\x00\x12\x1b\n\x11set_favorite_node\x18\' 
\x01(\rH\x00\x12\x1e\n\x14remove_favorite_node\x18( 
\x01(\rH\x00\x12;\n\x12set_fixed_position\x18) 
\x01(\x0b\x32\x1d.meshtastic.protobuf.PositionH\x00\x12\x1f\n\x15remove_fixed_position\x18*
 \x01(\x08H\x00\x12\x17\n\rset_time_only\x18+ 
\x01(\x07H\x00\x12\x1f\n\x15get_ui_config_request\x18, 
\x01(\x08H\x00\x12\x45\n\x16get_ui_config_response\x18- 
\x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x12>\n\x0fstore_ui_config\x18.
 
\x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x12\x1a\n\x10set_ignored_node\x18/
 \x01(\rH\x00\x12\x1d\n\x13remove_ignored_node\x18\x30 
\x01(\rH\x00\x12\x1d\n\x13\x62\x65gin_edit_settings\x18@ 
\x01(\x08H\x00\x12\x1e\n\x14\x63ommit_edit_settings\x18\x41 
\x01(\x08H\x00\x12\x39\n\x0b\x61\x64\x64_contact\x18\x42 
\x01(\x0b\x32\".meshtastic.protobuf.SharedContactH\x00\x12\x45\n\x10key_verification\x1
 8\x43 
\x01(\x0b\x32).meshtastic.protobuf.KeyVerificationAdminH\x00\x12\x1e\n\x14\x66\x61\x63tory_reset_device\x18^
 \x01(\x05H\x00\x12\x1c\n\x12reboot_ota_seconds\x18_ 
\x01(\x05H\x00\x12\x18\n\x0e\x65xit_simulator\x18` 
\x01(\x08H\x00\x12\x18\n\x0ereboot_seconds\x18\x61 
\x01(\x05H\x00\x12\x1a\n\x10shutdown_seconds\x18\x62 
\x01(\x05H\x00\x12\x1e\n\x14\x66\x61\x63tory_reset_config\x18\x63 
\x01(\x05H\x00\x12\x16\n\x0cnodedb_reset\x18\x64 
\x01(\x05H\x00\x1aS\n\nInputEvent\x12\x12\n\nevent_code\x18\x01 
\x01(\r\x12\x0f\n\x07kb_char\x18\x02 \x01(\r\x12\x0f\n\x07touch_x\x18\x03 
\x01(\r\x12\x0f\n\x07touch_y\x18\x04 
\x01(\r\"\xd6\x01\n\nConfigType\x12\x11\n\rDEVICE_CONFIG\x10\x00\x12\x13\n\x0fPOSITION_CONFIG\x10\x01\x12\x10\n\x0cPOWER_CONFIG\x10\x02\x12\x12\n\x0eNETWORK_CONFIG\x10\x03\x12\x12\n\x0e\x44ISPLAY_CONFIG\x10\x04\x12\x0f\n\x0bLORA_CONFIG\x10\x05\x12\x14\n\x10\x42LUETOOTH_CONFIG\x10\x06\x12\x13\n\x0fSECURITY_CONFIG\x10\x07\x12\x15\n\x11SESSIONKEY_CONFIG\x10\x08\x12\x13\n\x0f\x44\x45VIC
 
EUI_CONFIG\x10\t\"\xbb\x02\n\x10ModuleConfigType\x12\x0f\n\x0bMQTT_CONFIG\x10\x00\x12\x11\n\rSERIAL_CONFIG\x10\x01\x12\x13\n\x0f\x45XTNOTIF_CONFIG\x10\x02\x12\x17\n\x13STOREFORWARD_CONFIG\x10\x03\x12\x14\n\x10RANGETEST_CONFIG\x10\x04\x12\x14\n\x10TELEMETRY_CONFIG\x10\x05\x12\x14\n\x10\x43\x41NNEDMSG_CONFIG\x10\x06\x12\x10\n\x0c\x41UDIO_CONFIG\x10\x07\x12\x19\n\x15REMOTEHARDWARE_CONFIG\x10\x08\x12\x17\n\x13NEIGHBORINFO_CONFIG\x10\t\x12\x1a\n\x16\x41MBIENTLIGHTING_CONFIG\x10\n\x12\x1a\n\x16\x44\x45TECTIONSENSOR_CONFIG\x10\x0b\x12\x15\n\x11PAXCOUNTER_CONFIG\x10\x0c\"#\n\x0e\x42\x61\x63kupLocation\x12\t\n\x05\x46LASH\x10\x00\x12\x06\n\x02SD\x10\x01\x42\x11\n\x0fpayload_variant\"[\n\rHamParameters\x12\x11\n\tcall_sign\x18\x01
 \x01(\t\x12\x10\n\x08tx_power\x18\x02 \x01(\x05\x12\x11\n\tfrequency\x18\x03 
\x01(\x02\x12\x12\n\nshort_name\x18\x04 
\x01(\t\"o\n\x1eNodeRemoteHardwarePinsResponse\x12M\n\x19node_remote_hardware_pins\x18\x01
 \x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePin\"
 |\n\rSharedContact\x12\x10\n\x08node_num\x18\x01 
\x01(\r\x12\'\n\x04user\x18\x02 
\x01(\x0b\x32\x19.meshtastic.protobuf.User\x12\x15\n\rshould_ignore\x18\x03 
\x01(\x08\x12\x19\n\x11manually_verified\x18\x04 
\x01(\x08\"\xa5\x02\n\x14KeyVerificationAdmin\x12K\n\x0cmessage_type\x18\x01 
\x01(\x0e\x32\x35.meshtastic.protobuf.KeyVerificationAdmin.MessageType\x12\x16\n\x0eremote_nodenum\x18\x02
 \x01(\r\x12\r\n\x05nonce\x18\x03 
\x01(\x04\x12\x1c\n\x0fsecurity_number\x18\x04 
\x01(\rH\x00\x88\x01\x01\"g\n\x0bMessageType\x12\x19\n\x15INITIATE_VERIFICATION\x10\x00\x12\x1b\n\x17PROVIDE_SECURITY_NUMBER\x10\x01\x12\r\n\tDO_VERIFY\x10\x02\x12\x11\n\rDO_NOT_VERIFY\x10\x03\x42\x12\n\x10_security_numberBa\n\x14org.meshtastic.protoB\x0b\x41\x64minProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = 
_descriptor_pool.Default().AddSerializedFile(b'\n\x1fmeshtastic/protobuf/admin.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a
 
meshtastic/protobuf/config.proto\x1a+meshtastic/protobuf/connection_status.proto\x1a#meshtastic/protobuf/device_ui.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a\'meshtastic/protobuf/module_config.proto\"\xe2\x1a\n\x0c\x41\x64minMessage\x12\x17\n\x0fsession_passkey\x18\x65
 \x01(\x0c\x12\x1d\n\x13get_channel_request\x18\x01 
\x01(\rH\x00\x12<\n\x14get_channel_response\x18\x02 
\x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x1b\n\x11get_owner_request\x18\x03
 \x01(\x08H\x00\x12\x37\n\x12get_owner_response\x18\x04 
\x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12J\n\x12get_config_request\x18\x05
 
\x01(\x0e\x32,.meshtastic.protobuf.AdminMessage.ConfigTypeH\x00\x12:\n\x13get_config_response\x18\x06
 
\x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12W\n\x19get_module_config_request\x18\x07
 \x01(\x0e\x32\x32.meshtast
 
ic.protobuf.AdminMessage.ModuleConfigTypeH\x00\x12G\n\x1aget_module_config_response\x18\x08
 
\x01(\x0b\x32!.meshtastic.protobuf.ModuleConfigH\x00\x12\x34\n*get_canned_message_module_messages_request\x18\n
 \x01(\x08H\x00\x12\x35\n+get_canned_message_module_messages_response\x18\x0b 
\x01(\tH\x00\x12%\n\x1bget_device_metadata_request\x18\x0c 
\x01(\x08H\x00\x12K\n\x1cget_device_metadata_response\x18\r 
\x01(\x0b\x32#.meshtastic.protobuf.DeviceMetadataH\x00\x12\x1e\n\x14get_ringtone_request\x18\x0e
 \x01(\x08H\x00\x12\x1f\n\x15get_ringtone_response\x18\x0f 
\x01(\tH\x00\x12.\n$get_device_connection_status_request\x18\x10 
\x01(\x08H\x00\x12\\\n%get_device_connection_status_response\x18\x11 
\x01(\x0b\x32+.meshtastic.protobuf.DeviceConnectionStatusH\x00\x12:\n\x0cset_ham_mode\x18\x12
 
\x01(\x0b\x32\".meshtastic.protobuf.HamParametersH\x00\x12/\n%get_node_remote_hardware_pins_request\x18\x13
 \x01(\x08H\x00\x12\x65\n&get_node_remote_hardware_pins_response\x18\x14 
\x01(\x0b\x32\x33.meshtastic.proto
 buf.NodeRemoteHardwarePinsResponseH\x00\x12 
\n\x16\x65nter_dfu_mode_request\x18\x15 
\x01(\x08H\x00\x12\x1d\n\x13\x64\x65lete_file_request\x18\x16 
\x01(\tH\x00\x12\x13\n\tset_scale\x18\x17 
\x01(\rH\x00\x12N\n\x12\x62\x61\x63kup_preferences\x18\x18 
\x01(\x0e\x32\x30.meshtastic.protobuf.AdminMessage.BackupLocationH\x00\x12O\n\x13restore_preferences\x18\x19
 
\x01(\x0e\x32\x30.meshtastic.protobuf.AdminMessage.BackupLocationH\x00\x12U\n\x19remove_backup_preferences\x18\x1a
 
\x01(\x0e\x32\x30.meshtastic.protobuf.AdminMessage.BackupLocationH\x00\x12H\n\x10send_input_event\x18\x1b
 
\x01(\x0b\x32,.meshtastic.protobuf.AdminMessage.InputEventH\x00\x12.\n\tset_owner\x18
  \x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12\x33\n\x0bset_channel\x18! 
\x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x31\n\nset_config\x18\" 
\x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12>\n\x11set_module_config\x18#
 
\x01(\x0b\x32!.meshtastic.protobuf.ModuleConfigH\x00\x12,\n\"set_canned_message_module_messag
 es\x18$ \x01(\tH\x00\x12\x1e\n\x14set_ringtone_message\x18% 
\x01(\tH\x00\x12\x1b\n\x11remove_by_nodenum\x18& 
\x01(\rH\x00\x12\x1b\n\x11set_favorite_node\x18\' 
\x01(\rH\x00\x12\x1e\n\x14remove_favorite_node\x18( 
\x01(\rH\x00\x12;\n\x12set_fixed_position\x18) 
\x01(\x0b\x32\x1d.meshtastic.protobuf.PositionH\x00\x12\x1f\n\x15remove_fixed_position\x18*
 \x01(\x08H\x00\x12\x17\n\rset_time_only\x18+ 
\x01(\x07H\x00\x12\x1f\n\x15get_ui_config_request\x18, 
\x01(\x08H\x00\x12\x45\n\x16get_ui_config_response\x18- 
\x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x12>\n\x0fstore_ui_config\x18.
 
\x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x12\x1a\n\x10set_ignored_node\x18/
 \x01(\rH\x00\x12\x1d\n\x13remove_ignored_node\x18\x30 
\x01(\rH\x00\x12\x1d\n\x13\x62\x65gin_edit_settings\x18@ 
\x01(\x08H\x00\x12\x1e\n\x14\x63ommit_edit_settings\x18\x41 
\x01(\x08H\x00\x12\x39\n\x0b\x61\x64\x64_contact\x18\x42 
\x01(\x0b\x32\".meshtastic.protobuf.SharedContactH\x00\x12\x45\n\x10key_verification\x1
 8\x43 
\x01(\x0b\x32).meshtastic.protobuf.KeyVerificationAdminH\x00\x12\x37\n\x0freboot_ota_mode\x18\x44
 
\x01(\x0e\x32\x1c.meshtastic.protobuf.OTAModeH\x00\x12\x1e\n\x14\x66\x61\x63tory_reset_device\x18^
 \x01(\x05H\x00\x12 \n\x12reboot_ota_seconds\x18_ 
\x01(\x05\x42\x02\x18\x01H\x00\x12\x18\n\x0e\x65xit_simulator\x18` 
\x01(\x08H\x00\x12\x18\n\x0ereboot_seconds\x18\x61 
\x01(\x05H\x00\x12\x1a\n\x10shutdown_seconds\x18\x62 
\x01(\x05H\x00\x12\x1e\n\x14\x66\x61\x63tory_reset_config\x18\x63 
\x01(\x05H\x00\x12\x16\n\x0cnodedb_reset\x18\x64 
\x01(\x08H\x00\x1aS\n\nInputEvent\x12\x12\n\nevent_code\x18\x01 
\x01(\r\x12\x0f\n\x07kb_char\x18\x02 \x01(\r\x12\x0f\n\x07touch_x\x18\x03 
\x01(\r\x12\x0f\n\x07touch_y\x18\x04 
\x01(\r\"\xd6\x01\n\nConfigType\x12\x11\n\rDEVICE_CONFIG\x10\x00\x12\x13\n\x0fPOSITION_CONFIG\x10\x01\x12\x10\n\x0cPOWER_CONFIG\x10\x02\x12\x12\n\x0eNETWORK_CONFIG\x10\x03\x12\x12\n\x0e\x44ISPLAY_CONFIG\x10\x04\x12\x0f\n\x0bLORA_CONFIG\x10\x05\x12\x14\n\x10\x42LUETOOTH_CONFIG\x10\x06
 
\x12\x13\n\x0fSECURITY_CONFIG\x10\x07\x12\x15\n\x11SESSIONKEY_CONFIG\x10\x08\x12\x13\n\x0f\x44\x45VICEUI_CONFIG\x10\t\"\xbb\x02\n\x10ModuleConfigType\x12\x0f\n\x0bMQTT_CONFIG\x10\x00\x12\x11\n\rSERIAL_CONFIG\x10\x01\x12\x13\n\x0f\x45XTNOTIF_CONFIG\x10\x02\x12\x17\n\x13STOREFORWARD_CONFIG\x10\x03\x12\x14\n\x10RANGETEST_CONFIG\x10\x04\x12\x14\n\x10TELEMETRY_CONFIG\x10\x05\x12\x14\n\x10\x43\x41NNEDMSG_CONFIG\x10\x06\x12\x10\n\x0c\x41UDIO_CONFIG\x10\x07\x12\x19\n\x15REMOTEHARDWARE_CONFIG\x10\x08\x12\x17\n\x13NEIGHBORINFO_CONFIG\x10\t\x12\x1a\n\x16\x41MBIENTLIGHTING_CONFIG\x10\n\x12\x1a\n\x16\x44\x45TECTIONSENSOR_CONFIG\x10\x0b\x12\x15\n\x11PAXCOUNTER_CONFIG\x10\x0c\"#\n\x0e\x42\x61\x63kupLocation\x12\t\n\x05\x46LASH\x10\x00\x12\x06\n\x02SD\x10\x01\x42\x11\n\x0fpayload_variant\"[\n\rHamParameters\x12\x11\n\tcall_sign\x18\x01
 \x01(\t\x12\x10\n\x08tx_power\x18\x02 \x01(\x05\x12\x11\n\tfrequency\x18\x03 
\x01(\x02\x12\x12\n\nshort_name\x18\x04 
\x01(\t\"o\n\x1eNodeRemoteHardwarePinsResponse\x
 12M\n\x19node_remote_hardware_pins\x18\x01 
\x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePin\"|\n\rSharedContact\x12\x10\n\x08node_num\x18\x01
 \x01(\r\x12\'\n\x04user\x18\x02 
\x01(\x0b\x32\x19.meshtastic.protobuf.User\x12\x15\n\rshould_ignore\x18\x03 
\x01(\x08\x12\x19\n\x11manually_verified\x18\x04 
\x01(\x08\"\xa5\x02\n\x14KeyVerificationAdmin\x12K\n\x0cmessage_type\x18\x01 
\x01(\x0e\x32\x35.meshtastic.protobuf.KeyVerificationAdmin.MessageType\x12\x16\n\x0eremote_nodenum\x18\x02
 \x01(\r\x12\r\n\x05nonce\x18\x03 
\x01(\x04\x12\x1c\n\x0fsecurity_number\x18\x04 
\x01(\rH\x00\x88\x01\x01\"g\n\x0bMessageType\x12\x19\n\x15INITIATE_VERIFICATION\x10\x00\x12\x1b\n\x17PROVIDE_SECURITY_NUMBER\x10\x01\x12\r\n\tDO_VERIFY\x10\x02\x12\x11\n\rDO_NOT_VERIFY\x10\x03\x42\x12\n\x10_security_number*7\n\x07OTAMode\x12\x11\n\rNO_REBOOT_OTA\x10\x00\x12\x0b\n\x07OTA_BLE\x10\x01\x12\x0c\n\x08OTA_WIFI\x10\x02\x42\x61\n\x14org.meshtastic.protoB\x0b\x41\x64minProtosZ\"github.com/meshtastic/go/generated\xaa
 \x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
 
 _globals = globals()
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -27,24 +27,28 @@
 if _descriptor._USE_C_DESCRIPTORS == False:
   DESCRIPTOR._options = None
   DESCRIPTOR._serialized_options = 
b'\n\024org.meshtastic.protoB\013AdminProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
+  _ADMINMESSAGE.fields_by_name['reboot_ota_seconds']._options = None
+  _ADMINMESSAGE.fields_by_name['reboot_ota_seconds']._serialized_options = 
b'\030\001'
+  _globals['_OTAMODE']._serialized_start=4337
+  _globals['_OTAMODE']._serialized_end=4392
   _globals['_ADMINMESSAGE']._serialized_start=281
-  _globals['_ADMINMESSAGE']._serialized_end=3646
-  _globals['_ADMINMESSAGE_INPUTEVENT']._serialized_start=2972
-  _globals['_ADMINMESSAGE_INPUTEVENT']._serialized_end=3055
-  _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_start=3058
-  _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_end=3272
-  _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_start=3275
-  _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_end=3590
-  _globals['_ADMINMESSAGE_BACKUPLOCATION']._serialized_start=3592
-  _globals['_ADMINMESSAGE_BACKUPLOCATION']._serialized_end=3627
-  _globals['_HAMPARAMETERS']._serialized_start=3648
-  _globals['_HAMPARAMETERS']._serialized_end=3739
-  _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_start=3741
-  _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_end=3852
-  _globals['_SHAREDCONTACT']._serialized_start=3854
-  _globals['_SHAREDCONTACT']._serialized_end=3978
-  _globals['_KEYVERIFICATIONADMIN']._serialized_start=3981
-  _globals['_KEYVERIFICATIONADMIN']._serialized_end=4274
-  _globals['_KEYVERIFICATIONADMIN_MESSAGETYPE']._serialized_start=4151
-  _globals['_KEYVERIFICATIONADMIN_MESSAGETYPE']._serialized_end=4254
+  _globals['_ADMINMESSAGE']._serialized_end=3707
+  _globals['_ADMINMESSAGE_INPUTEVENT']._serialized_start=3033
+  _globals['_ADMINMESSAGE_INPUTEVENT']._serialized_end=3116
+  _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_start=3119
+  _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_end=3333
+  _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_start=3336
+  _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_end=3651
+  _globals['_ADMINMESSAGE_BACKUPLOCATION']._serialized_start=3653
+  _globals['_ADMINMESSAGE_BACKUPLOCATION']._serialized_end=3688
+  _globals['_HAMPARAMETERS']._serialized_start=3709
+  _globals['_HAMPARAMETERS']._serialized_end=3800
+  _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_start=3802
+  _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_end=3913
+  _globals['_SHAREDCONTACT']._serialized_start=3915
+  _globals['_SHAREDCONTACT']._serialized_end=4039
+  _globals['_KEYVERIFICATIONADMIN']._serialized_start=4042
+  _globals['_KEYVERIFICATIONADMIN']._serialized_end=4335
+  _globals['_KEYVERIFICATIONADMIN_MESSAGETYPE']._serialized_start=4212
+  _globals['_KEYVERIFICATIONADMIN_MESSAGETYPE']._serialized_end=4315
 # @@protoc_insertion_point(module_scope)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/meshtastic-2.7.4/meshtastic/protobuf/admin_pb2.pyi 
new/meshtastic-2.7.6/meshtastic/protobuf/admin_pb2.pyi
--- old/meshtastic-2.7.4/meshtastic/protobuf/admin_pb2.pyi      1970-01-01 
01:00:00.000000000 +0100
+++ new/meshtastic-2.7.6/meshtastic/protobuf/admin_pb2.pyi      1970-01-01 
01:00:00.000000000 +0100
@@ -25,6 +25,44 @@
 
 DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
 
+class _OTAMode:
+    ValueType = typing.NewType("ValueType", builtins.int)
+    V: typing_extensions.TypeAlias = ValueType
+
+class 
_OTAModeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_OTAMode.ValueType],
 builtins.type):
+    DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+    NO_REBOOT_OTA: _OTAMode.ValueType  # 0
+    """
+    Do not reboot into OTA mode
+    """
+    OTA_BLE: _OTAMode.ValueType  # 1
+    """
+    Reboot into OTA mode for BLE firmware update
+    """
+    OTA_WIFI: _OTAMode.ValueType  # 2
+    """
+    Reboot into OTA mode for WiFi firmware update
+    """
+
+class OTAMode(_OTAMode, metaclass=_OTAModeEnumTypeWrapper):
+    """
+    Firmware update mode for OTA updates
+    """
+
+NO_REBOOT_OTA: OTAMode.ValueType  # 0
+"""
+Do not reboot into OTA mode
+"""
+OTA_BLE: OTAMode.ValueType  # 1
+"""
+Reboot into OTA mode for BLE firmware update
+"""
+OTA_WIFI: OTAMode.ValueType  # 2
+"""
+Reboot into OTA mode for WiFi firmware update
+"""
+global___OTAMode = OTAMode
+
 @typing.final
 class AdminMessage(google.protobuf.message.Message):
     """
@@ -356,6 +394,7 @@
     COMMIT_EDIT_SETTINGS_FIELD_NUMBER: builtins.int
     ADD_CONTACT_FIELD_NUMBER: builtins.int
     KEY_VERIFICATION_FIELD_NUMBER: builtins.int
+    REBOOT_OTA_MODE_FIELD_NUMBER: builtins.int
     FACTORY_RESET_DEVICE_FIELD_NUMBER: builtins.int
     REBOOT_OTA_SECONDS_FIELD_NUMBER: builtins.int
     EXIT_SIMULATOR_FIELD_NUMBER: builtins.int
@@ -489,6 +528,10 @@
     """
     Commits an open transaction for any edits made to config, module config, 
owner, and channel settings
     """
+    reboot_ota_mode: global___OTAMode.ValueType
+    """
+    Tell the node to reboot into OTA mode for firmware update via BLE or WiFi 
(ESP32 only for now)
+    """
     factory_reset_device: builtins.int
     """
     Tell the node to factory reset config everything; all device state and 
configuration will be returned to factory defaults and BLE bonds will be 
cleared.
@@ -497,6 +540,7 @@
     """
     Tell the node to reboot into the OTA Firmware in this many seconds (or <0 
to cancel reboot)
     Only Implemented for ESP32 Devices. This needs to be issued to send a new 
main firmware via bluetooth.
+    Deprecated in favor of reboot_ota_mode in 2.7.17
     """
     exit_simulator: builtins.bool
     """
@@ -515,9 +559,10 @@
     """
     Tell the node to factory reset config; all device state and configuration 
will be returned to factory defaults; BLE bonds will be preserved.
     """
-    nodedb_reset: builtins.int
+    nodedb_reset: builtins.bool
     """
     Tell the node to reset the nodedb.
+    When true, favorites are preserved through reset.
     """
     @property
     def get_channel_response(self) -> meshtastic.protobuf.channel_pb2.Channel:
@@ -683,17 +728,18 @@
         commit_edit_settings: builtins.bool = ...,
         add_contact: global___SharedContact | None = ...,
         key_verification: global___KeyVerificationAdmin | None = ...,
+        reboot_ota_mode: global___OTAMode.ValueType = ...,
         factory_reset_device: builtins.int = ...,
         reboot_ota_seconds: builtins.int = ...,
         exit_simulator: builtins.bool = ...,
         reboot_seconds: builtins.int = ...,
         shutdown_seconds: builtins.int = ...,
         factory_reset_config: builtins.int = ...,
-        nodedb_reset: builtins.int = ...,
+        nodedb_reset: builtins.bool = ...,
     ) -> None: ...
-    def HasField(self, field_name: typing.Literal["add_contact", 
b"add_contact", "backup_preferences", b"backup_preferences", 
"begin_edit_settings", b"begin_edit_settings", "commit_edit_settings", 
b"commit_edit_settings", "delete_file_request", b"delete_file_request", 
"enter_dfu_mode_request", b"enter_dfu_mode_request", "exit_simulator", 
b"exit_simulator", "factory_reset_config", b"factory_reset_config", 
"factory_reset_device", b"factory_reset_device", 
"get_canned_message_module_messages_request", 
b"get_canned_message_module_messages_request", 
"get_canned_message_module_messages_response", 
b"get_canned_message_module_messages_response", "get_channel_request", 
b"get_channel_request", "get_channel_response", b"get_channel_response", 
"get_config_request", b"get_config_request", "get_config_response", 
b"get_config_response", "get_device_connection_status_request", 
b"get_device_connection_status_request", 
"get_device_connection_status_response", 
b"get_device_connection_status_response", 
 "get_device_metadata_request", b"get_device_metadata_request", 
"get_device_metadata_response", b"get_device_metadata_response", 
"get_module_config_request", b"get_module_config_request", 
"get_module_config_response", b"get_module_config_response", 
"get_node_remote_hardware_pins_request", 
b"get_node_remote_hardware_pins_request", 
"get_node_remote_hardware_pins_response", 
b"get_node_remote_hardware_pins_response", "get_owner_request", 
b"get_owner_request", "get_owner_response", b"get_owner_response", 
"get_ringtone_request", b"get_ringtone_request", "get_ringtone_response", 
b"get_ringtone_response", "get_ui_config_request", b"get_ui_config_request", 
"get_ui_config_response", b"get_ui_config_response", "key_verification", 
b"key_verification", "nodedb_reset", b"nodedb_reset", "payload_variant", 
b"payload_variant", "reboot_ota_seconds", b"reboot_ota_seconds", 
"reboot_seconds", b"reboot_seconds", "remove_backup_preferences", 
b"remove_backup_preferences", "remove_by_nodenum", b"remove_by_no
 denum", "remove_favorite_node", b"remove_favorite_node", 
"remove_fixed_position", b"remove_fixed_position", "remove_ignored_node", 
b"remove_ignored_node", "restore_preferences", b"restore_preferences", 
"send_input_event", b"send_input_event", "set_canned_message_module_messages", 
b"set_canned_message_module_messages", "set_channel", b"set_channel", 
"set_config", b"set_config", "set_favorite_node", b"set_favorite_node", 
"set_fixed_position", b"set_fixed_position", "set_ham_mode", b"set_ham_mode", 
"set_ignored_node", b"set_ignored_node", "set_module_config", 
b"set_module_config", "set_owner", b"set_owner", "set_ringtone_message", 
b"set_ringtone_message", "set_scale", b"set_scale", "set_time_only", 
b"set_time_only", "shutdown_seconds", b"shutdown_seconds", "store_ui_config", 
b"store_ui_config"]) -> builtins.bool: ...
-    def ClearField(self, field_name: typing.Literal["add_contact", 
b"add_contact", "backup_preferences", b"backup_preferences", 
"begin_edit_settings", b"begin_edit_settings", "commit_edit_settings", 
b"commit_edit_settings", "delete_file_request", b"delete_file_request", 
"enter_dfu_mode_request", b"enter_dfu_mode_request", "exit_simulator", 
b"exit_simulator", "factory_reset_config", b"factory_reset_config", 
"factory_reset_device", b"factory_reset_device", 
"get_canned_message_module_messages_request", 
b"get_canned_message_module_messages_request", 
"get_canned_message_module_messages_response", 
b"get_canned_message_module_messages_response", "get_channel_request", 
b"get_channel_request", "get_channel_response", b"get_channel_response", 
"get_config_request", b"get_config_request", "get_config_response", 
b"get_config_response", "get_device_connection_status_request", 
b"get_device_connection_status_request", 
"get_device_connection_status_response", 
b"get_device_connection_status_response"
 , "get_device_metadata_request", b"get_device_metadata_request", 
"get_device_metadata_response", b"get_device_metadata_response", 
"get_module_config_request", b"get_module_config_request", 
"get_module_config_response", b"get_module_config_response", 
"get_node_remote_hardware_pins_request", 
b"get_node_remote_hardware_pins_request", 
"get_node_remote_hardware_pins_response", 
b"get_node_remote_hardware_pins_response", "get_owner_request", 
b"get_owner_request", "get_owner_response", b"get_owner_response", 
"get_ringtone_request", b"get_ringtone_request", "get_ringtone_response", 
b"get_ringtone_response", "get_ui_config_request", b"get_ui_config_request", 
"get_ui_config_response", b"get_ui_config_response", "key_verification", 
b"key_verification", "nodedb_reset", b"nodedb_reset", "payload_variant", 
b"payload_variant", "reboot_ota_seconds", b"reboot_ota_seconds", 
"reboot_seconds", b"reboot_seconds", "remove_backup_preferences", 
b"remove_backup_preferences", "remove_by_nodenum", b"remove_by_
 nodenum", "remove_favorite_node", b"remove_favorite_node", 
"remove_fixed_position", b"remove_fixed_position", "remove_ignored_node", 
b"remove_ignored_node", "restore_preferences", b"restore_preferences", 
"send_input_event", b"send_input_event", "session_passkey", b"session_passkey", 
"set_canned_message_module_messages", b"set_canned_message_module_messages", 
"set_channel", b"set_channel", "set_config", b"set_config", 
"set_favorite_node", b"set_favorite_node", "set_fixed_position", 
b"set_fixed_position", "set_ham_mode", b"set_ham_mode", "set_ignored_node", 
b"set_ignored_node", "set_module_config", b"set_module_config", "set_owner", 
b"set_owner", "set_ringtone_message", b"set_ringtone_message", "set_scale", 
b"set_scale", "set_time_only", b"set_time_only", "shutdown_seconds", 
b"shutdown_seconds", "store_ui_config", b"store_ui_config"]) -> None: ...
-    def WhichOneof(self, oneof_group: typing.Literal["payload_variant", 
b"payload_variant"]) -> typing.Literal["get_channel_request", 
"get_channel_response", "get_owner_request", "get_owner_response", 
"get_config_request", "get_config_response", "get_module_config_request", 
"get_module_config_response", "get_canned_message_module_messages_request", 
"get_canned_message_module_messages_response", "get_device_metadata_request", 
"get_device_metadata_response", "get_ringtone_request", 
"get_ringtone_response", "get_device_connection_status_request", 
"get_device_connection_status_response", "set_ham_mode", 
"get_node_remote_hardware_pins_request", 
"get_node_remote_hardware_pins_response", "enter_dfu_mode_request", 
"delete_file_request", "set_scale", "backup_preferences", 
"restore_preferences", "remove_backup_preferences", "send_input_event", 
"set_owner", "set_channel", "set_config", "set_module_config", 
"set_canned_message_module_messages", "set_ringtone_message", 
"remove_by_nodenum", "set_
 favorite_node", "remove_favorite_node", "set_fixed_position", 
"remove_fixed_position", "set_time_only", "get_ui_config_request", 
"get_ui_config_response", "store_ui_config", "set_ignored_node", 
"remove_ignored_node", "begin_edit_settings", "commit_edit_settings", 
"add_contact", "key_verification", "factory_reset_device", 
"reboot_ota_seconds", "exit_simulator", "reboot_seconds", "shutdown_seconds", 
"factory_reset_config", "nodedb_reset"] | None: ...
+    def HasField(self, field_name: typing.Literal["add_contact", 
b"add_contact", "backup_preferences", b"backup_preferences", 
"begin_edit_settings", b"begin_edit_settings", "commit_edit_settings", 
b"commit_edit_settings", "delete_file_request", b"delete_file_request", 
"enter_dfu_mode_request", b"enter_dfu_mode_request", "exit_simulator", 
b"exit_simulator", "factory_reset_config", b"factory_reset_config", 
"factory_reset_device", b"factory_reset_device", 
"get_canned_message_module_messages_request", 
b"get_canned_message_module_messages_request", 
"get_canned_message_module_messages_response", 
b"get_canned_message_module_messages_response", "get_channel_request", 
b"get_channel_request", "get_channel_response", b"get_channel_response", 
"get_config_request", b"get_config_request", "get_config_response", 
b"get_config_response", "get_device_connection_status_request", 
b"get_device_connection_status_request", 
"get_device_connection_status_response", 
b"get_device_connection_status_response", 
 "get_device_metadata_request", b"get_device_metadata_request", 
"get_device_metadata_response", b"get_device_metadata_response", 
"get_module_config_request", b"get_module_config_request", 
"get_module_config_response", b"get_module_config_response", 
"get_node_remote_hardware_pins_request", 
b"get_node_remote_hardware_pins_request", 
"get_node_remote_hardware_pins_response", 
b"get_node_remote_hardware_pins_response", "get_owner_request", 
b"get_owner_request", "get_owner_response", b"get_owner_response", 
"get_ringtone_request", b"get_ringtone_request", "get_ringtone_response", 
b"get_ringtone_response", "get_ui_config_request", b"get_ui_config_request", 
"get_ui_config_response", b"get_ui_config_response", "key_verification", 
b"key_verification", "nodedb_reset", b"nodedb_reset", "payload_variant", 
b"payload_variant", "reboot_ota_mode", b"reboot_ota_mode", 
"reboot_ota_seconds", b"reboot_ota_seconds", "reboot_seconds", 
b"reboot_seconds", "remove_backup_preferences", b"remove_backup_preference
 s", "remove_by_nodenum", b"remove_by_nodenum", "remove_favorite_node", 
b"remove_favorite_node", "remove_fixed_position", b"remove_fixed_position", 
"remove_ignored_node", b"remove_ignored_node", "restore_preferences", 
b"restore_preferences", "send_input_event", b"send_input_event", 
"set_canned_message_module_messages", b"set_canned_message_module_messages", 
"set_channel", b"set_channel", "set_config", b"set_config", 
"set_favorite_node", b"set_favorite_node", "set_fixed_position", 
b"set_fixed_position", "set_ham_mode", b"set_ham_mode", "set_ignored_node", 
b"set_ignored_node", "set_module_config", b"set_module_config", "set_owner", 
b"set_owner", "set_ringtone_message", b"set_ringtone_message", "set_scale", 
b"set_scale", "set_time_only", b"set_time_only", "shutdown_seconds", 
b"shutdown_seconds", "store_ui_config", b"store_ui_config"]) -> builtins.bool: 
...
+    def ClearField(self, field_name: typing.Literal["add_contact", 
b"add_contact", "backup_preferences", b"backup_preferences", 
"begin_edit_settings", b"begin_edit_settings", "commit_edit_settings", 
b"commit_edit_settings", "delete_file_request", b"delete_file_request", 
"enter_dfu_mode_request", b"enter_dfu_mode_request", "exit_simulator", 
b"exit_simulator", "factory_reset_config", b"factory_reset_config", 
"factory_reset_device", b"factory_reset_device", 
"get_canned_message_module_messages_request", 
b"get_canned_message_module_messages_request", 
"get_canned_message_module_messages_response", 
b"get_canned_message_module_messages_response", "get_channel_request", 
b"get_channel_request", "get_channel_response", b"get_channel_response", 
"get_config_request", b"get_config_request", "get_config_response", 
b"get_config_response", "get_device_connection_status_request", 
b"get_device_connection_status_request", 
"get_device_connection_status_response", 
b"get_device_connection_status_response"
 , "get_device_metadata_request", b"get_device_metadata_request", 
"get_device_metadata_response", b"get_device_metadata_response", 
"get_module_config_request", b"get_module_config_request", 
"get_module_config_response", b"get_module_config_response", 
"get_node_remote_hardware_pins_request", 
b"get_node_remote_hardware_pins_request", 
"get_node_remote_hardware_pins_response", 
b"get_node_remote_hardware_pins_response", "get_owner_request", 
b"get_owner_request", "get_owner_response", b"get_owner_response", 
"get_ringtone_request", b"get_ringtone_request", "get_ringtone_response", 
b"get_ringtone_response", "get_ui_config_request", b"get_ui_config_request", 
"get_ui_config_response", b"get_ui_config_response", "key_verification", 
b"key_verification", "nodedb_reset", b"nodedb_reset", "payload_variant", 
b"payload_variant", "reboot_ota_mode", b"reboot_ota_mode", 
"reboot_ota_seconds", b"reboot_ota_seconds", "reboot_seconds", 
b"reboot_seconds", "remove_backup_preferences", b"remove_backup_preferen
 ces", "remove_by_nodenum", b"remove_by_nodenum", "remove_favorite_node", 
b"remove_favorite_node", "remove_fixed_position", b"remove_fixed_position", 
"remove_ignored_node", b"remove_ignored_node", "restore_preferences", 
b"restore_preferences", "send_input_event", b"send_input_event", 
"session_passkey", b"session_passkey", "set_canned_message_module_messages", 
b"set_canned_message_module_messages", "set_channel", b"set_channel", 
"set_config", b"set_config", "set_favorite_node", b"set_favorite_node", 
"set_fixed_position", b"set_fixed_position", "set_ham_mode", b"set_ham_mode", 
"set_ignored_node", b"set_ignored_node", "set_module_config", 
b"set_module_config", "set_owner", b"set_owner", "set_ringtone_message", 
b"set_ringtone_message", "set_scale", b"set_scale", "set_time_only", 
b"set_time_only", "shutdown_seconds", b"shutdown_seconds", "store_ui_config", 
b"store_ui_config"]) -> None: ...
+    def WhichOneof(self, oneof_group: typing.Literal["payload_variant", 
b"payload_variant"]) -> typing.Literal["get_channel_request", 
"get_channel_response", "get_owner_request", "get_owner_response", 
"get_config_request", "get_config_response", "get_module_config_request", 
"get_module_config_response", "get_canned_message_module_messages_request", 
"get_canned_message_module_messages_response", "get_device_metadata_request", 
"get_device_metadata_response", "get_ringtone_request", 
"get_ringtone_response", "get_device_connection_status_request", 
"get_device_connection_status_response", "set_ham_mode", 
"get_node_remote_hardware_pins_request", 
"get_node_remote_hardware_pins_response", "enter_dfu_mode_request", 
"delete_file_request", "set_scale", "backup_preferences", 
"restore_preferences", "remove_backup_preferences", "send_input_event", 
"set_owner", "set_channel", "set_config", "set_module_config", 
"set_canned_message_module_messages", "set_ringtone_message", 
"remove_by_nodenum", "set_
 favorite_node", "remove_favorite_node", "set_fixed_position", 
"remove_fixed_position", "set_time_only", "get_ui_config_request", 
"get_ui_config_response", "store_ui_config", "set_ignored_node", 
"remove_ignored_node", "begin_edit_settings", "commit_edit_settings", 
"add_contact", "key_verification", "reboot_ota_mode", "factory_reset_device", 
"reboot_ota_seconds", "exit_simulator", "reboot_seconds", "shutdown_seconds", 
"factory_reset_config", "nodedb_reset"] | None: ...
 
 global___AdminMessage = AdminMessage
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/meshtastic-2.7.4/meshtastic/protobuf/atak_pb2.pyi 
new/meshtastic-2.7.6/meshtastic/protobuf/atak_pb2.pyi
--- old/meshtastic-2.7.4/meshtastic/protobuf/atak_pb2.pyi       1970-01-01 
01:00:00.000000000 +0100
+++ new/meshtastic-2.7.6/meshtastic/protobuf/atak_pb2.pyi       1970-01-01 
01:00:00.000000000 +0100
@@ -1,7 +1,7 @@
 """
 @generated by mypy-protobuf.  Do not edit manually!
 isort:skip_file
-"""
+trunk-ignore(buf-lint/PACKAGE_DIRECTORY_MATCH)"""
 
 import builtins
 import google.protobuf.descriptor
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/meshtastic-2.7.4/meshtastic/protobuf/channel_pb2.pyi 
new/meshtastic-2.7.6/meshtastic/protobuf/channel_pb2.pyi
--- old/meshtastic-2.7.4/meshtastic/protobuf/channel_pb2.pyi    1970-01-01 
01:00:00.000000000 +0100
+++ new/meshtastic-2.7.6/meshtastic/protobuf/channel_pb2.pyi    1970-01-01 
01:00:00.000000000 +0100
@@ -1,7 +1,7 @@
 """
 @generated by mypy-protobuf.  Do not edit manually!
 isort:skip_file
-"""
+trunk-ignore(buf-lint/PACKAGE_DIRECTORY_MATCH)"""
 
 import builtins
 import google.protobuf.descriptor
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/meshtastic-2.7.4/meshtastic/protobuf/config_pb2.py 
new/meshtastic-2.7.6/meshtastic/protobuf/config_pb2.py
--- old/meshtastic-2.7.4/meshtastic/protobuf/config_pb2.py      1970-01-01 
01:00:00.000000000 +0100
+++ new/meshtastic-2.7.6/meshtastic/protobuf/config_pb2.py      1970-01-01 
01:00:00.000000000 +0100
@@ -14,7 +14,7 @@
 from meshtastic.protobuf import device_ui_pb2 as 
meshtastic_dot_protobuf_dot_device__ui__pb2
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n 
meshtastic/protobuf/config.proto\x12\x13meshtastic.protobuf\x1a#meshtastic/protobuf/device_ui.proto\"\xe5*\n\x06\x43onfig\x12:\n\x06\x64\x65vice\x18\x01
 
\x01(\x0b\x32(.meshtastic.protobuf.Config.DeviceConfigH\x00\x12>\n\x08position\x18\x02
 
\x01(\x0b\x32*.meshtastic.protobuf.Config.PositionConfigH\x00\x12\x38\n\x05power\x18\x03
 
\x01(\x0b\x32\'.meshtastic.protobuf.Config.PowerConfigH\x00\x12<\n\x07network\x18\x04
 
\x01(\x0b\x32).meshtastic.protobuf.Config.NetworkConfigH\x00\x12<\n\x07\x64isplay\x18\x05
 
\x01(\x0b\x32).meshtastic.protobuf.Config.DisplayConfigH\x00\x12\x36\n\x04lora\x18\x06
 
\x01(\x0b\x32&.meshtastic.protobuf.Config.LoRaConfigH\x00\x12@\n\tbluetooth\x18\x07
 
\x01(\x0b\x32+.meshtastic.protobuf.Config.BluetoothConfigH\x00\x12>\n\x08security\x18\x08
 
\x01(\x0b\x32*.meshtastic.protobuf.Config.SecurityConfigH\x00\x12\x42\n\nsessionkey\x18\t
 \x01(\x0b\x32,.meshtastic.protobuf.Config.SessionkeyConfigH\x00\x12\x38\n\tdev
 ice_ui\x18\n 
\x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x1a\x91\x07\n\x0c\x44\x65viceConfig\x12;\n\x04role\x18\x01
 
\x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x1a\n\x0eserial_enabled\x18\x02
 \x01(\x08\x42\x02\x18\x01\x12\x13\n\x0b\x62utton_gpio\x18\x04 
\x01(\r\x12\x13\n\x0b\x62uzzer_gpio\x18\x05 
\x01(\r\x12R\n\x10rebroadcast_mode\x18\x06 
\x01(\x0e\x32\x38.meshtastic.protobuf.Config.DeviceConfig.RebroadcastMode\x12 
\n\x18node_info_broadcast_secs\x18\x07 
\x01(\r\x12\"\n\x1a\x64ouble_tap_as_button_press\x18\x08 
\x01(\x08\x12\x16\n\nis_managed\x18\t 
\x01(\x08\x42\x02\x18\x01\x12\x1c\n\x14\x64isable_triple_click\x18\n 
\x01(\x08\x12\r\n\x05tzdef\x18\x0b 
\x01(\t\x12\x1e\n\x16led_heartbeat_disabled\x18\x0c 
\x01(\x08\x12H\n\x0b\x62uzzer_mode\x18\r 
\x01(\x0e\x32\x33.meshtastic.protobuf.Config.DeviceConfig.BuzzerMode\"\xd4\x01\n\x04Role\x12\n\n\x06\x43LIENT\x10\x00\x12\x0f\n\x0b\x43LIENT_MUTE\x10\x01\x12\n\n\x06ROUTER\x10\x02\x12\x15\n\rROUTER_CLIENT\x10\x03\x1a
 
\x02\x08\x01\x12\x10\n\x08REPEATER\x10\x04\x1a\x02\x08\x01\x12\x0b\n\x07TRACKER\x10\x05\x12\n\n\x06SENSOR\x10\x06\x12\x07\n\x03TAK\x10\x07\x12\x11\n\rCLIENT_HIDDEN\x10\x08\x12\x12\n\x0eLOST_AND_FOUND\x10\t\x12\x0f\n\x0bTAK_TRACKER\x10\n\x12\x0f\n\x0bROUTER_LATE\x10\x0b\x12\x0f\n\x0b\x43LIENT_BASE\x10\x0c\"s\n\x0fRebroadcastMode\x12\x07\n\x03\x41LL\x10\x00\x12\x15\n\x11\x41LL_SKIP_DECODING\x10\x01\x12\x0e\n\nLOCAL_ONLY\x10\x02\x12\x0e\n\nKNOWN_ONLY\x10\x03\x12\x08\n\x04NONE\x10\x04\x12\x16\n\x12\x43ORE_PORTNUMS_ONLY\x10\x05\"i\n\nBuzzerMode\x12\x0f\n\x0b\x41LL_ENABLED\x10\x00\x12\x0c\n\x08\x44ISABLED\x10\x01\x12\x16\n\x12NOTIFICATIONS_ONLY\x10\x02\x12\x0f\n\x0bSYSTEM_ONLY\x10\x03\x12\x13\n\x0f\x44IRECT_MSG_ONLY\x10\x04\x1a\x9a\x05\n\x0ePositionConfig\x12\x1f\n\x17position_broadcast_secs\x18\x01
 \x01(\r\x12(\n position_broadcast_smart_enabled\x18\x02 
\x01(\x08\x12\x16\n\x0e\x66ixed_position\x18\x03 
\x01(\x08\x12\x17\n\x0bgps_enabled\x18\x04 
\x01(\x08\x42\x02\x18\x01\x12\x1b\n\x13gps_u
 pdate_interval\x18\x05 \x01(\r\x12\x1c\n\x10gps_attempt_time\x18\x06 
\x01(\rB\x02\x18\x01\x12\x16\n\x0eposition_flags\x18\x07 
\x01(\r\x12\x0f\n\x07rx_gpio\x18\x08 \x01(\r\x12\x0f\n\x07tx_gpio\x18\t 
\x01(\r\x12(\n broadcast_smart_minimum_distance\x18\n 
\x01(\r\x12-\n%broadcast_smart_minimum_interval_secs\x18\x0b 
\x01(\r\x12\x13\n\x0bgps_en_gpio\x18\x0c \x01(\r\x12\x44\n\x08gps_mode\x18\r 
\x01(\x0e\x32\x32.meshtastic.protobuf.Config.PositionConfig.GpsMode\"\xab\x01\n\rPositionFlags\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x41LTITUDE\x10\x01\x12\x10\n\x0c\x41LTITUDE_MSL\x10\x02\x12\x16\n\x12GEOIDAL_SEPARATION\x10\x04\x12\x07\n\x03\x44OP\x10\x08\x12\t\n\x05HVDOP\x10\x10\x12\r\n\tSATINVIEW\x10
 
\x12\n\n\x06SEQ_NO\x10@\x12\x0e\n\tTIMESTAMP\x10\x80\x01\x12\x0c\n\x07HEADING\x10\x80\x02\x12\n\n\x05SPEED\x10\x80\x04\"5\n\x07GpsMode\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07\x45NABLED\x10\x01\x12\x0f\n\x0bNOT_PRESENT\x10\x02\x1a\x84\x02\n\x0bPowerConfig\x12\x17\n\x0fis_power_saving\x18\x01
 \x
 01(\x08\x12&\n\x1eon_battery_shutdown_after_secs\x18\x02 
\x01(\r\x12\x1f\n\x17\x61\x64\x63_multiplier_override\x18\x03 
\x01(\x02\x12\x1b\n\x13wait_bluetooth_secs\x18\x04 
\x01(\r\x12\x10\n\x08sds_secs\x18\x06 \x01(\r\x12\x0f\n\x07ls_secs\x18\x07 
\x01(\r\x12\x15\n\rmin_wake_secs\x18\x08 
\x01(\r\x12\"\n\x1a\x64\x65vice_battery_ina_address\x18\t 
\x01(\r\x12\x18\n\x10powermon_enables\x18  
\x01(\x04\x1a\xf7\x03\n\rNetworkConfig\x12\x14\n\x0cwifi_enabled\x18\x01 
\x01(\x08\x12\x11\n\twifi_ssid\x18\x03 \x01(\t\x12\x10\n\x08wifi_psk\x18\x04 
\x01(\t\x12\x12\n\nntp_server\x18\x05 
\x01(\t\x12\x13\n\x0b\x65th_enabled\x18\x06 
\x01(\x08\x12K\n\x0c\x61\x64\x64ress_mode\x18\x07 
\x01(\x0e\x32\x35.meshtastic.protobuf.Config.NetworkConfig.AddressMode\x12I\n\x0bipv4_config\x18\x08
 
\x01(\x0b\x32\x34.meshtastic.protobuf.Config.NetworkConfig.IpV4Config\x12\x16\n\x0ersyslog_server\x18\t
 \x01(\t\x12\x19\n\x11\x65nabled_protocols\x18\n 
\x01(\r\x12\x14\n\x0cipv6_enabled\x18\x0b \x01(\x08\x1a\x46\n\nIpV4Config\x
 12\n\n\x02ip\x18\x01 \x01(\x07\x12\x0f\n\x07gateway\x18\x02 
\x01(\x07\x12\x0e\n\x06subnet\x18\x03 \x01(\x07\x12\x0b\n\x03\x64ns\x18\x04 
\x01(\x07\"#\n\x0b\x41\x64\x64ressMode\x12\x08\n\x04\x44HCP\x10\x00\x12\n\n\x06STATIC\x10\x01\"4\n\rProtocolFlags\x12\x10\n\x0cNO_BROADCAST\x10\x00\x12\x11\n\rUDP_BROADCAST\x10\x01\x1a\xb6\x08\n\rDisplayConfig\x12\x16\n\x0escreen_on_secs\x18\x01
 \x01(\r\x12_\n\ngps_format\x18\x02 
\x01(\x0e\x32G.meshtastic.protobuf.Config.DisplayConfig.DeprecatedGpsCoordinateFormatB\x02\x18\x01\x12!\n\x19\x61uto_screen_carousel_secs\x18\x03
 \x01(\r\x12\x1d\n\x11\x63ompass_north_top\x18\x04 
\x01(\x08\x42\x02\x18\x01\x12\x13\n\x0b\x66lip_screen\x18\x05 
\x01(\x08\x12\x45\n\x05units\x18\x06 
\x01(\x0e\x32\x36.meshtastic.protobuf.Config.DisplayConfig.DisplayUnits\x12@\n\x04oled\x18\x07
 
\x01(\x0e\x32\x32.meshtastic.protobuf.Config.DisplayConfig.OledType\x12J\n\x0b\x64isplaymode\x18\x08
 
\x01(\x0e\x32\x35.meshtastic.protobuf.Config.DisplayConfig.DisplayMode\x12\x14\n\x0cheadi
 ng_bold\x18\t \x01(\x08\x12\x1d\n\x15wake_on_tap_or_motion\x18\n 
\x01(\x08\x12Y\n\x13\x63ompass_orientation\x18\x0b 
\x01(\x0e\x32<.meshtastic.protobuf.Config.DisplayConfig.CompassOrientation\x12\x15\n\ruse_12h_clock\x18\x0c
 \x01(\x08\x12\x1a\n\x12use_long_node_name\x18\r 
\x01(\x08\"+\n\x1d\x44\x65precatedGpsCoordinateFormat\x12\n\n\x06UNUSED\x10\x00\"(\n\x0c\x44isplayUnits\x12\n\n\x06METRIC\x10\x00\x12\x0c\n\x08IMPERIAL\x10\x01\"f\n\x08OledType\x12\r\n\tOLED_AUTO\x10\x00\x12\x10\n\x0cOLED_SSD1306\x10\x01\x12\x0f\n\x0bOLED_SH1106\x10\x02\x12\x0f\n\x0bOLED_SH1107\x10\x03\x12\x17\n\x13OLED_SH1107_128_128\x10\x04\"A\n\x0b\x44isplayMode\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\x0c\n\x08TWOCOLOR\x10\x01\x12\x0c\n\x08INVERTED\x10\x02\x12\t\n\x05\x43OLOR\x10\x03\"\xba\x01\n\x12\x43ompassOrientation\x12\r\n\tDEGREES_0\x10\x00\x12\x0e\n\nDEGREES_90\x10\x01\x12\x0f\n\x0b\x44\x45GREES_180\x10\x02\x12\x0f\n\x0b\x44\x45GREES_270\x10\x03\x12\x16\n\x12\x44\x45GREES_0_INVERTED\x10\x04\x12\x17\n\
 
x13\x44\x45GREES_90_INVERTED\x10\x05\x12\x18\n\x14\x44\x45GREES_180_INVERTED\x10\x06\x12\x18\n\x14\x44\x45GREES_270_INVERTED\x10\x07\x1a\xec\x07\n\nLoRaConfig\x12\x12\n\nuse_preset\x18\x01
 \x01(\x08\x12H\n\x0cmodem_preset\x18\x02 
\x01(\x0e\x32\x32.meshtastic.protobuf.Config.LoRaConfig.ModemPreset\x12\x11\n\tbandwidth\x18\x03
 \x01(\r\x12\x15\n\rspread_factor\x18\x04 
\x01(\r\x12\x13\n\x0b\x63oding_rate\x18\x05 
\x01(\r\x12\x18\n\x10\x66requency_offset\x18\x06 
\x01(\x02\x12\x41\n\x06region\x18\x07 
\x01(\x0e\x32\x31.meshtastic.protobuf.Config.LoRaConfig.RegionCode\x12\x11\n\thop_limit\x18\x08
 \x01(\r\x12\x12\n\ntx_enabled\x18\t \x01(\x08\x12\x10\n\x08tx_power\x18\n 
\x01(\x05\x12\x13\n\x0b\x63hannel_num\x18\x0b 
\x01(\r\x12\x1b\n\x13override_duty_cycle\x18\x0c 
\x01(\x08\x12\x1e\n\x16sx126x_rx_boosted_gain\x18\r 
\x01(\x08\x12\x1a\n\x12override_frequency\x18\x0e 
\x01(\x02\x12\x17\n\x0fpa_fan_disabled\x18\x0f 
\x01(\x08\x12\x17\n\x0fignore_incoming\x18g 
\x03(\r\x12\x13\n\x0bignore_mqtt\x18h \x
 01(\x08\x12\x19\n\x11\x63onfig_ok_to_mqtt\x18i 
\x01(\x08\"\xae\x02\n\nRegionCode\x12\t\n\x05UNSET\x10\x00\x12\x06\n\x02US\x10\x01\x12\n\n\x06\x45U_433\x10\x02\x12\n\n\x06\x45U_868\x10\x03\x12\x06\n\x02\x43N\x10\x04\x12\x06\n\x02JP\x10\x05\x12\x07\n\x03\x41NZ\x10\x06\x12\x06\n\x02KR\x10\x07\x12\x06\n\x02TW\x10\x08\x12\x06\n\x02RU\x10\t\x12\x06\n\x02IN\x10\n\x12\n\n\x06NZ_865\x10\x0b\x12\x06\n\x02TH\x10\x0c\x12\x0b\n\x07LORA_24\x10\r\x12\n\n\x06UA_433\x10\x0e\x12\n\n\x06UA_868\x10\x0f\x12\n\n\x06MY_433\x10\x10\x12\n\n\x06MY_919\x10\x11\x12\n\n\x06SG_923\x10\x12\x12\n\n\x06PH_433\x10\x13\x12\n\n\x06PH_868\x10\x14\x12\n\n\x06PH_915\x10\x15\x12\x0b\n\x07\x41NZ_433\x10\x16\x12\n\n\x06KZ_433\x10\x17\x12\n\n\x06KZ_863\x10\x18\x12\n\n\x06NP_865\x10\x19\x12\n\n\x06\x42R_902\x10\x1a\"\xa9\x01\n\x0bModemPreset\x12\r\n\tLONG_FAST\x10\x00\x12\r\n\tLONG_SLOW\x10\x01\x12\x16\n\x0eVERY_LONG_SLOW\x10\x02\x1a\x02\x08\x01\x12\x0f\n\x0bMEDIUM_SLOW\x10\x03\x12\x0f\n\x0bMEDIUM_FAST\x10\x04\x12\x0e\n\nSHOR
 
T_SLOW\x10\x05\x12\x0e\n\nSHORT_FAST\x10\x06\x12\x11\n\rLONG_MODERATE\x10\x07\x12\x0f\n\x0bSHORT_TURBO\x10\x08\x1a\xb6\x01\n\x0f\x42luetoothConfig\x12\x0f\n\x07\x65nabled\x18\x01
 \x01(\x08\x12\x45\n\x04mode\x18\x02 
\x01(\x0e\x32\x37.meshtastic.protobuf.Config.BluetoothConfig.PairingMode\x12\x11\n\tfixed_pin\x18\x03
 
\x01(\r\"8\n\x0bPairingMode\x12\x0e\n\nRANDOM_PIN\x10\x00\x12\r\n\tFIXED_PIN\x10\x01\x12\n\n\x06NO_PIN\x10\x02\x1a\xb6\x01\n\x0eSecurityConfig\x12\x12\n\npublic_key\x18\x01
 \x01(\x0c\x12\x13\n\x0bprivate_key\x18\x02 
\x01(\x0c\x12\x11\n\tadmin_key\x18\x03 \x03(\x0c\x12\x12\n\nis_managed\x18\x04 
\x01(\x08\x12\x16\n\x0eserial_enabled\x18\x05 
\x01(\x08\x12\x1d\n\x15\x64\x65\x62ug_log_api_enabled\x18\x06 
\x01(\x08\x12\x1d\n\x15\x61\x64min_channel_enabled\x18\x08 
\x01(\x08\x1a\x12\n\x10SessionkeyConfigB\x11\n\x0fpayload_variantBb\n\x14org.meshtastic.protoB\x0c\x43onfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n 
meshtastic/protobuf/config.proto\x12\x13meshtastic.protobuf\x1a#meshtastic/protobuf/device_ui.proto\"\xf9*\n\x06\x43onfig\x12:\n\x06\x64\x65vice\x18\x01
 
\x01(\x0b\x32(.meshtastic.protobuf.Config.DeviceConfigH\x00\x12>\n\x08position\x18\x02
 
\x01(\x0b\x32*.meshtastic.protobuf.Config.PositionConfigH\x00\x12\x38\n\x05power\x18\x03
 
\x01(\x0b\x32\'.meshtastic.protobuf.Config.PowerConfigH\x00\x12<\n\x07network\x18\x04
 
\x01(\x0b\x32).meshtastic.protobuf.Config.NetworkConfigH\x00\x12<\n\x07\x64isplay\x18\x05
 
\x01(\x0b\x32).meshtastic.protobuf.Config.DisplayConfigH\x00\x12\x36\n\x04lora\x18\x06
 
\x01(\x0b\x32&.meshtastic.protobuf.Config.LoRaConfigH\x00\x12@\n\tbluetooth\x18\x07
 
\x01(\x0b\x32+.meshtastic.protobuf.Config.BluetoothConfigH\x00\x12>\n\x08security\x18\x08
 
\x01(\x0b\x32*.meshtastic.protobuf.Config.SecurityConfigH\x00\x12\x42\n\nsessionkey\x18\t
 \x01(\x0b\x32,.meshtastic.protobuf.Config.SessionkeyConfigH\x00\x12\x38\n\tdev
 ice_ui\x18\n 
\x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x1a\x91\x07\n\x0c\x44\x65viceConfig\x12;\n\x04role\x18\x01
 
\x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x1a\n\x0eserial_enabled\x18\x02
 \x01(\x08\x42\x02\x18\x01\x12\x13\n\x0b\x62utton_gpio\x18\x04 
\x01(\r\x12\x13\n\x0b\x62uzzer_gpio\x18\x05 
\x01(\r\x12R\n\x10rebroadcast_mode\x18\x06 
\x01(\x0e\x32\x38.meshtastic.protobuf.Config.DeviceConfig.RebroadcastMode\x12 
\n\x18node_info_broadcast_secs\x18\x07 
\x01(\r\x12\"\n\x1a\x64ouble_tap_as_button_press\x18\x08 
\x01(\x08\x12\x16\n\nis_managed\x18\t 
\x01(\x08\x42\x02\x18\x01\x12\x1c\n\x14\x64isable_triple_click\x18\n 
\x01(\x08\x12\r\n\x05tzdef\x18\x0b 
\x01(\t\x12\x1e\n\x16led_heartbeat_disabled\x18\x0c 
\x01(\x08\x12H\n\x0b\x62uzzer_mode\x18\r 
\x01(\x0e\x32\x33.meshtastic.protobuf.Config.DeviceConfig.BuzzerMode\"\xd4\x01\n\x04Role\x12\n\n\x06\x43LIENT\x10\x00\x12\x0f\n\x0b\x43LIENT_MUTE\x10\x01\x12\n\n\x06ROUTER\x10\x02\x12\x15\n\rROUTER_CLIENT\x10\x03\x1a
 
\x02\x08\x01\x12\x10\n\x08REPEATER\x10\x04\x1a\x02\x08\x01\x12\x0b\n\x07TRACKER\x10\x05\x12\n\n\x06SENSOR\x10\x06\x12\x07\n\x03TAK\x10\x07\x12\x11\n\rCLIENT_HIDDEN\x10\x08\x12\x12\n\x0eLOST_AND_FOUND\x10\t\x12\x0f\n\x0bTAK_TRACKER\x10\n\x12\x0f\n\x0bROUTER_LATE\x10\x0b\x12\x0f\n\x0b\x43LIENT_BASE\x10\x0c\"s\n\x0fRebroadcastMode\x12\x07\n\x03\x41LL\x10\x00\x12\x15\n\x11\x41LL_SKIP_DECODING\x10\x01\x12\x0e\n\nLOCAL_ONLY\x10\x02\x12\x0e\n\nKNOWN_ONLY\x10\x03\x12\x08\n\x04NONE\x10\x04\x12\x16\n\x12\x43ORE_PORTNUMS_ONLY\x10\x05\"i\n\nBuzzerMode\x12\x0f\n\x0b\x41LL_ENABLED\x10\x00\x12\x0c\n\x08\x44ISABLED\x10\x01\x12\x16\n\x12NOTIFICATIONS_ONLY\x10\x02\x12\x0f\n\x0bSYSTEM_ONLY\x10\x03\x12\x13\n\x0f\x44IRECT_MSG_ONLY\x10\x04\x1a\x9a\x05\n\x0ePositionConfig\x12\x1f\n\x17position_broadcast_secs\x18\x01
 \x01(\r\x12(\n position_broadcast_smart_enabled\x18\x02 
\x01(\x08\x12\x16\n\x0e\x66ixed_position\x18\x03 
\x01(\x08\x12\x17\n\x0bgps_enabled\x18\x04 
\x01(\x08\x42\x02\x18\x01\x12\x1b\n\x13gps_u
 pdate_interval\x18\x05 \x01(\r\x12\x1c\n\x10gps_attempt_time\x18\x06 
\x01(\rB\x02\x18\x01\x12\x16\n\x0eposition_flags\x18\x07 
\x01(\r\x12\x0f\n\x07rx_gpio\x18\x08 \x01(\r\x12\x0f\n\x07tx_gpio\x18\t 
\x01(\r\x12(\n broadcast_smart_minimum_distance\x18\n 
\x01(\r\x12-\n%broadcast_smart_minimum_interval_secs\x18\x0b 
\x01(\r\x12\x13\n\x0bgps_en_gpio\x18\x0c \x01(\r\x12\x44\n\x08gps_mode\x18\r 
\x01(\x0e\x32\x32.meshtastic.protobuf.Config.PositionConfig.GpsMode\"\xab\x01\n\rPositionFlags\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x41LTITUDE\x10\x01\x12\x10\n\x0c\x41LTITUDE_MSL\x10\x02\x12\x16\n\x12GEOIDAL_SEPARATION\x10\x04\x12\x07\n\x03\x44OP\x10\x08\x12\t\n\x05HVDOP\x10\x10\x12\r\n\tSATINVIEW\x10
 
\x12\n\n\x06SEQ_NO\x10@\x12\x0e\n\tTIMESTAMP\x10\x80\x01\x12\x0c\n\x07HEADING\x10\x80\x02\x12\n\n\x05SPEED\x10\x80\x04\"5\n\x07GpsMode\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07\x45NABLED\x10\x01\x12\x0f\n\x0bNOT_PRESENT\x10\x02\x1a\x84\x02\n\x0bPowerConfig\x12\x17\n\x0fis_power_saving\x18\x01
 \x
 01(\x08\x12&\n\x1eon_battery_shutdown_after_secs\x18\x02 
\x01(\r\x12\x1f\n\x17\x61\x64\x63_multiplier_override\x18\x03 
\x01(\x02\x12\x1b\n\x13wait_bluetooth_secs\x18\x04 
\x01(\r\x12\x10\n\x08sds_secs\x18\x06 \x01(\r\x12\x0f\n\x07ls_secs\x18\x07 
\x01(\r\x12\x15\n\rmin_wake_secs\x18\x08 
\x01(\r\x12\"\n\x1a\x64\x65vice_battery_ina_address\x18\t 
\x01(\r\x12\x18\n\x10powermon_enables\x18  
\x01(\x04\x1a\xf7\x03\n\rNetworkConfig\x12\x14\n\x0cwifi_enabled\x18\x01 
\x01(\x08\x12\x11\n\twifi_ssid\x18\x03 \x01(\t\x12\x10\n\x08wifi_psk\x18\x04 
\x01(\t\x12\x12\n\nntp_server\x18\x05 
\x01(\t\x12\x13\n\x0b\x65th_enabled\x18\x06 
\x01(\x08\x12K\n\x0c\x61\x64\x64ress_mode\x18\x07 
\x01(\x0e\x32\x35.meshtastic.protobuf.Config.NetworkConfig.AddressMode\x12I\n\x0bipv4_config\x18\x08
 
\x01(\x0b\x32\x34.meshtastic.protobuf.Config.NetworkConfig.IpV4Config\x12\x16\n\x0ersyslog_server\x18\t
 \x01(\t\x12\x19\n\x11\x65nabled_protocols\x18\n 
\x01(\r\x12\x14\n\x0cipv6_enabled\x18\x0b \x01(\x08\x1a\x46\n\nIpV4Config\x
 12\n\n\x02ip\x18\x01 \x01(\x07\x12\x0f\n\x07gateway\x18\x02 
\x01(\x07\x12\x0e\n\x06subnet\x18\x03 \x01(\x07\x12\x0b\n\x03\x64ns\x18\x04 
\x01(\x07\"#\n\x0b\x41\x64\x64ressMode\x12\x08\n\x04\x44HCP\x10\x00\x12\n\n\x06STATIC\x10\x01\"4\n\rProtocolFlags\x12\x10\n\x0cNO_BROADCAST\x10\x00\x12\x11\n\rUDP_BROADCAST\x10\x01\x1a\xb6\x08\n\rDisplayConfig\x12\x16\n\x0escreen_on_secs\x18\x01
 \x01(\r\x12_\n\ngps_format\x18\x02 
\x01(\x0e\x32G.meshtastic.protobuf.Config.DisplayConfig.DeprecatedGpsCoordinateFormatB\x02\x18\x01\x12!\n\x19\x61uto_screen_carousel_secs\x18\x03
 \x01(\r\x12\x1d\n\x11\x63ompass_north_top\x18\x04 
\x01(\x08\x42\x02\x18\x01\x12\x13\n\x0b\x66lip_screen\x18\x05 
\x01(\x08\x12\x45\n\x05units\x18\x06 
\x01(\x0e\x32\x36.meshtastic.protobuf.Config.DisplayConfig.DisplayUnits\x12@\n\x04oled\x18\x07
 
\x01(\x0e\x32\x32.meshtastic.protobuf.Config.DisplayConfig.OledType\x12J\n\x0b\x64isplaymode\x18\x08
 
\x01(\x0e\x32\x35.meshtastic.protobuf.Config.DisplayConfig.DisplayMode\x12\x14\n\x0cheadi
 ng_bold\x18\t \x01(\x08\x12\x1d\n\x15wake_on_tap_or_motion\x18\n 
\x01(\x08\x12Y\n\x13\x63ompass_orientation\x18\x0b 
\x01(\x0e\x32<.meshtastic.protobuf.Config.DisplayConfig.CompassOrientation\x12\x15\n\ruse_12h_clock\x18\x0c
 \x01(\x08\x12\x1a\n\x12use_long_node_name\x18\r 
\x01(\x08\"+\n\x1d\x44\x65precatedGpsCoordinateFormat\x12\n\n\x06UNUSED\x10\x00\"(\n\x0c\x44isplayUnits\x12\n\n\x06METRIC\x10\x00\x12\x0c\n\x08IMPERIAL\x10\x01\"f\n\x08OledType\x12\r\n\tOLED_AUTO\x10\x00\x12\x10\n\x0cOLED_SSD1306\x10\x01\x12\x0f\n\x0bOLED_SH1106\x10\x02\x12\x0f\n\x0bOLED_SH1107\x10\x03\x12\x17\n\x13OLED_SH1107_128_128\x10\x04\"A\n\x0b\x44isplayMode\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\x0c\n\x08TWOCOLOR\x10\x01\x12\x0c\n\x08INVERTED\x10\x02\x12\t\n\x05\x43OLOR\x10\x03\"\xba\x01\n\x12\x43ompassOrientation\x12\r\n\tDEGREES_0\x10\x00\x12\x0e\n\nDEGREES_90\x10\x01\x12\x0f\n\x0b\x44\x45GREES_180\x10\x02\x12\x0f\n\x0b\x44\x45GREES_270\x10\x03\x12\x16\n\x12\x44\x45GREES_0_INVERTED\x10\x04\x12\x17\n\
 
x13\x44\x45GREES_90_INVERTED\x10\x05\x12\x18\n\x14\x44\x45GREES_180_INVERTED\x10\x06\x12\x18\n\x14\x44\x45GREES_270_INVERTED\x10\x07\x1a\x80\x08\n\nLoRaConfig\x12\x12\n\nuse_preset\x18\x01
 \x01(\x08\x12H\n\x0cmodem_preset\x18\x02 
\x01(\x0e\x32\x32.meshtastic.protobuf.Config.LoRaConfig.ModemPreset\x12\x11\n\tbandwidth\x18\x03
 \x01(\r\x12\x15\n\rspread_factor\x18\x04 
\x01(\r\x12\x13\n\x0b\x63oding_rate\x18\x05 
\x01(\r\x12\x18\n\x10\x66requency_offset\x18\x06 
\x01(\x02\x12\x41\n\x06region\x18\x07 
\x01(\x0e\x32\x31.meshtastic.protobuf.Config.LoRaConfig.RegionCode\x12\x11\n\thop_limit\x18\x08
 \x01(\r\x12\x12\n\ntx_enabled\x18\t \x01(\x08\x12\x10\n\x08tx_power\x18\n 
\x01(\x05\x12\x13\n\x0b\x63hannel_num\x18\x0b 
\x01(\r\x12\x1b\n\x13override_duty_cycle\x18\x0c 
\x01(\x08\x12\x1e\n\x16sx126x_rx_boosted_gain\x18\r 
\x01(\x08\x12\x1a\n\x12override_frequency\x18\x0e 
\x01(\x02\x12\x17\n\x0fpa_fan_disabled\x18\x0f 
\x01(\x08\x12\x17\n\x0fignore_incoming\x18g 
\x03(\r\x12\x13\n\x0bignore_mqtt\x18h \x
 01(\x08\x12\x19\n\x11\x63onfig_ok_to_mqtt\x18i 
\x01(\x08\"\xae\x02\n\nRegionCode\x12\t\n\x05UNSET\x10\x00\x12\x06\n\x02US\x10\x01\x12\n\n\x06\x45U_433\x10\x02\x12\n\n\x06\x45U_868\x10\x03\x12\x06\n\x02\x43N\x10\x04\x12\x06\n\x02JP\x10\x05\x12\x07\n\x03\x41NZ\x10\x06\x12\x06\n\x02KR\x10\x07\x12\x06\n\x02TW\x10\x08\x12\x06\n\x02RU\x10\t\x12\x06\n\x02IN\x10\n\x12\n\n\x06NZ_865\x10\x0b\x12\x06\n\x02TH\x10\x0c\x12\x0b\n\x07LORA_24\x10\r\x12\n\n\x06UA_433\x10\x0e\x12\n\n\x06UA_868\x10\x0f\x12\n\n\x06MY_433\x10\x10\x12\n\n\x06MY_919\x10\x11\x12\n\n\x06SG_923\x10\x12\x12\n\n\x06PH_433\x10\x13\x12\n\n\x06PH_868\x10\x14\x12\n\n\x06PH_915\x10\x15\x12\x0b\n\x07\x41NZ_433\x10\x16\x12\n\n\x06KZ_433\x10\x17\x12\n\n\x06KZ_863\x10\x18\x12\n\n\x06NP_865\x10\x19\x12\n\n\x06\x42R_902\x10\x1a\"\xbd\x01\n\x0bModemPreset\x12\r\n\tLONG_FAST\x10\x00\x12\x11\n\tLONG_SLOW\x10\x01\x1a\x02\x08\x01\x12\x16\n\x0eVERY_LONG_SLOW\x10\x02\x1a\x02\x08\x01\x12\x0f\n\x0bMEDIUM_SLOW\x10\x03\x12\x0f\n\x0bMEDIUM_FAST\x10\x
 
04\x12\x0e\n\nSHORT_SLOW\x10\x05\x12\x0e\n\nSHORT_FAST\x10\x06\x12\x11\n\rLONG_MODERATE\x10\x07\x12\x0f\n\x0bSHORT_TURBO\x10\x08\x12\x0e\n\nLONG_TURBO\x10\t\x1a\xb6\x01\n\x0f\x42luetoothConfig\x12\x0f\n\x07\x65nabled\x18\x01
 \x01(\x08\x12\x45\n\x04mode\x18\x02 
\x01(\x0e\x32\x37.meshtastic.protobuf.Config.BluetoothConfig.PairingMode\x12\x11\n\tfixed_pin\x18\x03
 
\x01(\r\"8\n\x0bPairingMode\x12\x0e\n\nRANDOM_PIN\x10\x00\x12\r\n\tFIXED_PIN\x10\x01\x12\n\n\x06NO_PIN\x10\x02\x1a\xb6\x01\n\x0eSecurityConfig\x12\x12\n\npublic_key\x18\x01
 \x01(\x0c\x12\x13\n\x0bprivate_key\x18\x02 
\x01(\x0c\x12\x11\n\tadmin_key\x18\x03 \x03(\x0c\x12\x12\n\nis_managed\x18\x04 
\x01(\x08\x12\x16\n\x0eserial_enabled\x18\x05 
\x01(\x08\x12\x1d\n\x15\x64\x65\x62ug_log_api_enabled\x18\x06 
\x01(\x08\x12\x1d\n\x15\x61\x64min_channel_enabled\x18\x08 
\x01(\x08\x1a\x12\n\x10SessionkeyConfigB\x11\n\x0fpayload_variantBb\n\x14org.meshtastic.protoB\x0c\x43onfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic
 .Protobufs\xba\x02\x00\x62\x06proto3')
 
 _globals = globals()
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -38,10 +38,12 @@
   _CONFIG_DISPLAYCONFIG.fields_by_name['gps_format']._serialized_options = 
b'\030\001'
   _CONFIG_DISPLAYCONFIG.fields_by_name['compass_north_top']._options = None
   
_CONFIG_DISPLAYCONFIG.fields_by_name['compass_north_top']._serialized_options = 
b'\030\001'
+  _CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LONG_SLOW"]._options = None
+  
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LONG_SLOW"]._serialized_options 
= b'\010\001'
   _CONFIG_LORACONFIG_MODEMPRESET.values_by_name["VERY_LONG_SLOW"]._options = 
None
   
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["VERY_LONG_SLOW"]._serialized_options
 = b'\010\001'
   _globals['_CONFIG']._serialized_start=95
-  _globals['_CONFIG']._serialized_end=5572
+  _globals['_CONFIG']._serialized_end=5592
   _globals['_CONFIG_DEVICECONFIG']._serialized_start=724
   _globals['_CONFIG_DEVICECONFIG']._serialized_end=1637
   _globals['_CONFIG_DEVICECONFIG_ROLE']._serialized_start=1201
@@ -79,17 +81,17 @@
   _globals['_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_start=3970
   _globals['_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_end=4156
   _globals['_CONFIG_LORACONFIG']._serialized_start=4159
-  _globals['_CONFIG_LORACONFIG']._serialized_end=5163
+  _globals['_CONFIG_LORACONFIG']._serialized_end=5183
   _globals['_CONFIG_LORACONFIG_REGIONCODE']._serialized_start=4689
   _globals['_CONFIG_LORACONFIG_REGIONCODE']._serialized_end=4991
   _globals['_CONFIG_LORACONFIG_MODEMPRESET']._serialized_start=4994
-  _globals['_CONFIG_LORACONFIG_MODEMPRESET']._serialized_end=5163
-  _globals['_CONFIG_BLUETOOTHCONFIG']._serialized_start=5166
-  _globals['_CONFIG_BLUETOOTHCONFIG']._serialized_end=5348
-  _globals['_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_start=5292
-  _globals['_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_end=5348
-  _globals['_CONFIG_SECURITYCONFIG']._serialized_start=5351
-  _globals['_CONFIG_SECURITYCONFIG']._serialized_end=5533
-  _globals['_CONFIG_SESSIONKEYCONFIG']._serialized_start=5535
-  _globals['_CONFIG_SESSIONKEYCONFIG']._serialized_end=5553
+  _globals['_CONFIG_LORACONFIG_MODEMPRESET']._serialized_end=5183
+  _globals['_CONFIG_BLUETOOTHCONFIG']._serialized_start=5186
+  _globals['_CONFIG_BLUETOOTHCONFIG']._serialized_end=5368
+  _globals['_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_start=5312
+  _globals['_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_end=5368
+  _globals['_CONFIG_SECURITYCONFIG']._serialized_start=5371
+  _globals['_CONFIG_SECURITYCONFIG']._serialized_end=5553
+  _globals['_CONFIG_SESSIONKEYCONFIG']._serialized_start=5555
+  _globals['_CONFIG_SESSIONKEYCONFIG']._serialized_end=5573
 # @@protoc_insertion_point(module_scope)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/meshtastic-2.7.4/meshtastic/protobuf/config_pb2.pyi 
new/meshtastic-2.7.6/meshtastic/protobuf/config_pb2.pyi
--- old/meshtastic-2.7.4/meshtastic/protobuf/config_pb2.pyi     1970-01-01 
01:00:00.000000000 +0100
+++ new/meshtastic-2.7.6/meshtastic/protobuf/config_pb2.pyi     1970-01-01 
01:00:00.000000000 +0100
@@ -1487,6 +1487,7 @@
             LONG_SLOW: Config.LoRaConfig._ModemPreset.ValueType  # 1
             """
             Long Range - Slow
+            Deprecated in 2.7: Unpopular slow preset.
             """
             VERY_LONG_SLOW: Config.LoRaConfig._ModemPreset.ValueType  # 2
             """
@@ -1519,6 +1520,11 @@
             This is the fastest preset and the only one with 500kHz bandwidth.
             It is not legal to use in all regions due to this wider bandwidth.
             """
+            LONG_TURBO: Config.LoRaConfig._ModemPreset.ValueType  # 9
+            """
+            Long Range - Turbo
+            This preset performs similarly to LongFast, but with 500Khz 
bandwidth.
+            """
 
         class ModemPreset(_ModemPreset, metaclass=_ModemPresetEnumTypeWrapper):
             """
@@ -1533,6 +1539,7 @@
         LONG_SLOW: Config.LoRaConfig.ModemPreset.ValueType  # 1
         """
         Long Range - Slow
+        Deprecated in 2.7: Unpopular slow preset.
         """
         VERY_LONG_SLOW: Config.LoRaConfig.ModemPreset.ValueType  # 2
         """
@@ -1565,6 +1572,11 @@
         This is the fastest preset and the only one with 500kHz bandwidth.
         It is not legal to use in all regions due to this wider bandwidth.
         """
+        LONG_TURBO: Config.LoRaConfig.ModemPreset.ValueType  # 9
+        """
+        Long Range - Turbo
+        This preset performs similarly to LongFast, but with 500Khz bandwidth.
+        """
 
         USE_PRESET_FIELD_NUMBER: builtins.int
         MODEM_PRESET_FIELD_NUMBER: builtins.int
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/meshtastic-2.7.4/meshtastic/protobuf/mesh_pb2.py 
new/meshtastic-2.7.6/meshtastic/protobuf/mesh_pb2.py
--- old/meshtastic-2.7.4/meshtastic/protobuf/mesh_pb2.py        1970-01-01 
01:00:00.000000000 +0100
+++ new/meshtastic-2.7.6/meshtastic/protobuf/mesh_pb2.py        1970-01-01 
01:00:00.000000000 +0100
@@ -20,7 +20,7 @@
 from meshtastic.protobuf import xmodem_pb2 as 
meshtastic_dot_protobuf_dot_xmodem__pb2
 
 
-DESCRIPTOR = 
_descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/mesh.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a
 
meshtastic/protobuf/config.proto\x1a#meshtastic/protobuf/device_ui.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a\"meshtastic/protobuf/portnums.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a
 
meshtastic/protobuf/xmodem.proto\"\x99\x07\n\x08Position\x12\x17\n\nlatitude_i\x18\x01
 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x02 
\x01(\x0fH\x01\x88\x01\x01\x12\x15\n\x08\x61ltitude\x18\x03 
\x01(\x05H\x02\x88\x01\x01\x12\x0c\n\x04time\x18\x04 
\x01(\x07\x12@\n\x0flocation_source\x18\x05 
\x01(\x0e\x32\'.meshtastic.protobuf.Position.LocSource\x12@\n\x0f\x61ltitude_source\x18\x06
 
\x01(\x0e\x32\'.meshtastic.protobuf.Position.AltSource\x12\x11\n\ttimestamp\x18\x07
 \x01(\x07\x12\x1f\n\x17timestamp_millis_adjust\x18\x08 
\x01(\x05\x12\x19\n\x0c\x61ltitude_hae\x18\t 
\x01(\x11H\x03\x88\x01\x01\x12(\n\x1b\x61ltitude_
 geoidal_separation\x18\n \x01(\x11H\x04\x88\x01\x01\x12\x0c\n\x04PDOP\x18\x0b 
\x01(\r\x12\x0c\n\x04HDOP\x18\x0c \x01(\r\x12\x0c\n\x04VDOP\x18\r 
\x01(\r\x12\x14\n\x0cgps_accuracy\x18\x0e 
\x01(\r\x12\x19\n\x0cground_speed\x18\x0f 
\x01(\rH\x05\x88\x01\x01\x12\x19\n\x0cground_track\x18\x10 
\x01(\rH\x06\x88\x01\x01\x12\x13\n\x0b\x66ix_quality\x18\x11 
\x01(\r\x12\x10\n\x08\x66ix_type\x18\x12 
\x01(\r\x12\x14\n\x0csats_in_view\x18\x13 \x01(\r\x12\x11\n\tsensor_id\x18\x14 
\x01(\r\x12\x13\n\x0bnext_update\x18\x15 \x01(\r\x12\x12\n\nseq_number\x18\x16 
\x01(\r\x12\x16\n\x0eprecision_bits\x18\x17 
\x01(\r\"N\n\tLocSource\x12\r\n\tLOC_UNSET\x10\x00\x12\x0e\n\nLOC_MANUAL\x10\x01\x12\x10\n\x0cLOC_INTERNAL\x10\x02\x12\x10\n\x0cLOC_EXTERNAL\x10\x03\"b\n\tAltSource\x12\r\n\tALT_UNSET\x10\x00\x12\x0e\n\nALT_MANUAL\x10\x01\x12\x10\n\x0c\x41LT_INTERNAL\x10\x02\x12\x10\n\x0c\x41LT_EXTERNAL\x10\x03\x12\x12\n\x0e\x41LT_BAROMETRIC\x10\x04\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_iB\x0b\n\t_altitudeB\x0f\n\
 
r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separationB\x0f\n\r_ground_speedB\x0f\n\r_ground_track\"\x9c\x02\n\x04User\x12\n\n\x02id\x18\x01
 \x01(\t\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 
\x01(\t\x12\x13\n\x07macaddr\x18\x04 
\x01(\x0c\x42\x02\x18\x01\x12\x34\n\x08hw_model\x18\x05 
\x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x13\n\x0bis_licensed\x18\x06
 \x01(\x08\x12;\n\x04role\x18\x07 
\x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x08
 \x01(\x0c\x12\x1c\n\x0fis_unmessagable\x18\t 
\x01(\x08H\x00\x88\x01\x01\x42\x12\n\x10_is_unmessagable\"Z\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x01
 \x03(\x07\x12\x13\n\x0bsnr_towards\x18\x02 
\x03(\x05\x12\x12\n\nroute_back\x18\x03 \x03(\x07\x12\x10\n\x08snr_back\x18\x04 
\x03(\x05\"\x96\x04\n\x07Routing\x12<\n\rroute_request\x18\x01 
\x01(\x0b\x32#.meshtastic.protobuf.RouteDiscoveryH\x00\x12:\n\x0broute_reply\x18\x02
 \x01(\x0b\x32#.meshtastic.protobuf.RouteDiscoveryH\x00\x12:\n\
 x0c\x65rror_reason\x18\x03 
\x01(\x0e\x32\".meshtastic.protobuf.Routing.ErrorH\x00\"\xc9\x02\n\x05\x45rror\x12\x08\n\x04NONE\x10\x00\x12\x0c\n\x08NO_ROUTE\x10\x01\x12\x0b\n\x07GOT_NAK\x10\x02\x12\x0b\n\x07TIMEOUT\x10\x03\x12\x10\n\x0cNO_INTERFACE\x10\x04\x12\x12\n\x0eMAX_RETRANSMIT\x10\x05\x12\x0e\n\nNO_CHANNEL\x10\x06\x12\r\n\tTOO_LARGE\x10\x07\x12\x0f\n\x0bNO_RESPONSE\x10\x08\x12\x14\n\x10\x44UTY_CYCLE_LIMIT\x10\t\x12\x0f\n\x0b\x42\x41\x44_REQUEST\x10
 
\x12\x12\n\x0eNOT_AUTHORIZED\x10!\x12\x0e\n\nPKI_FAILED\x10\"\x12\x16\n\x12PKI_UNKNOWN_PUBKEY\x10#\x12\x19\n\x15\x41\x44MIN_BAD_SESSION_KEY\x10$\x12!\n\x1d\x41\x44MIN_PUBLIC_KEY_UNAUTHORIZED\x10%\x12\x17\n\x13RATE_LIMIT_EXCEEDED\x10&B\t\n\x07variant\"\xd4\x01\n\x04\x44\x61ta\x12-\n\x07portnum\x18\x01
 \x01(\x0e\x32\x1c.meshtastic.protobuf.PortNum\x12\x0f\n\x07payload\x18\x02 
\x01(\x0c\x12\x15\n\rwant_response\x18\x03 
\x01(\x08\x12\x0c\n\x04\x64\x65st\x18\x04 \x01(\x07\x12\x0e\n\x06source\x18\x05 
\x01(\x07\x12\x12\n\nrequest_id\x18\x06 
 \x01(\x07\x12\x10\n\x08reply_id\x18\x07 \x01(\x07\x12\r\n\x05\x65moji\x18\x08 
\x01(\x07\x12\x15\n\x08\x62itfield\x18\t 
\x01(\rH\x00\x88\x01\x01\x42\x0b\n\t_bitfield\">\n\x0fKeyVerification\x12\r\n\x05nonce\x18\x01
 \x01(\x04\x12\r\n\x05hash1\x18\x02 \x01(\x0c\x12\r\n\x05hash2\x18\x03 
\x01(\x0c\"\xbc\x01\n\x08Waypoint\x12\n\n\x02id\x18\x01 
\x01(\r\x12\x17\n\nlatitude_i\x18\x02 
\x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x03 
\x01(\x0fH\x01\x88\x01\x01\x12\x0e\n\x06\x65xpire\x18\x04 
\x01(\r\x12\x11\n\tlocked_to\x18\x05 \x01(\r\x12\x0c\n\x04name\x18\x06 
\x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x07 
\x01(\t\x12\x0c\n\x04icon\x18\x08 
\x01(\x07\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_i\"l\n\x16MqttClientProxyMessage\x12\r\n\x05topic\x18\x01
 \x01(\t\x12\x0e\n\x04\x64\x61ta\x18\x02 
\x01(\x0cH\x00\x12\x0e\n\x04text\x18\x03 
\x01(\tH\x00\x12\x10\n\x08retained\x18\x04 
\x01(\x08\x42\x11\n\x0fpayload_variant\"\xd9\x07\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01
 \x01(\x07\x12\n\n\x02
 to\x18\x02 \x01(\x07\x12\x0f\n\x07\x63hannel\x18\x03 
\x01(\r\x12,\n\x07\x64\x65\x63oded\x18\x04 
\x01(\x0b\x32\x19.meshtastic.protobuf.DataH\x00\x12\x13\n\tencrypted\x18\x05 
\x01(\x0cH\x00\x12\n\n\x02id\x18\x06 \x01(\x07\x12\x0f\n\x07rx_time\x18\x07 
\x01(\x07\x12\x0e\n\x06rx_snr\x18\x08 \x01(\x02\x12\x11\n\thop_limit\x18\t 
\x01(\r\x12\x10\n\x08want_ack\x18\n \x01(\x08\x12:\n\x08priority\x18\x0b 
\x01(\x0e\x32(.meshtastic.protobuf.MeshPacket.Priority\x12\x0f\n\x07rx_rssi\x18\x0c
 \x01(\x05\x12<\n\x07\x64\x65layed\x18\r 
\x01(\x0e\x32\'.meshtastic.protobuf.MeshPacket.DelayedB\x02\x18\x01\x12\x10\n\x08via_mqtt\x18\x0e
 \x01(\x08\x12\x11\n\thop_start\x18\x0f \x01(\r\x12\x12\n\npublic_key\x18\x10 
\x01(\x0c\x12\x15\n\rpki_encrypted\x18\x11 
\x01(\x08\x12\x10\n\x08next_hop\x18\x12 \x01(\r\x12\x12\n\nrelay_node\x18\x13 
\x01(\r\x12\x10\n\x08tx_after\x18\x14 
\x01(\r\x12O\n\x13transport_mechanism\x18\x15 
\x01(\x0e\x32\x32.meshtastic.protobuf.MeshPacket.TransportMechanism\"~\n\x08Priority\x12\t\n\x05
 
UNSET\x10\x00\x12\x07\n\x03MIN\x10\x01\x12\x0e\n\nBACKGROUND\x10\n\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10@\x12\x0c\n\x08RELIABLE\x10\x46\x12\x0c\n\x08RESPONSE\x10P\x12\x08\n\x04HIGH\x10\x64\x12\t\n\x05\x41LERT\x10n\x12\x07\n\x03\x41\x43K\x10x\x12\x07\n\x03MAX\x10\x7f\"B\n\x07\x44\x65layed\x12\x0c\n\x08NO_DELAY\x10\x00\x12\x15\n\x11\x44\x45LAYED_BROADCAST\x10\x01\x12\x12\n\x0e\x44\x45LAYED_DIRECT\x10\x02\"\xcf\x01\n\x12TransportMechanism\x12\x16\n\x12TRANSPORT_INTERNAL\x10\x00\x12\x12\n\x0eTRANSPORT_LORA\x10\x01\x12\x17\n\x13TRANSPORT_LORA_ALT1\x10\x02\x12\x17\n\x13TRANSPORT_LORA_ALT2\x10\x03\x12\x17\n\x13TRANSPORT_LORA_ALT3\x10\x04\x12\x12\n\x0eTRANSPORT_MQTT\x10\x05\x12\x1b\n\x17TRANSPORT_MULTICAST_UDP\x10\x06\x12\x11\n\rTRANSPORT_API\x10\x07\x42\x11\n\x0fpayload_variant\"\xe2\x02\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01
 \x01(\r\x12\'\n\x04user\x18\x02 
\x01(\x0b\x32\x19.meshtastic.protobuf.User\x12/\n\x08position\x18\x03 
\x01(\x0b\x32\x1d.meshtastic.protobuf.Position\x12\x0b\n\x03snr\x
 18\x04 \x01(\x02\x12\x12\n\nlast_heard\x18\x05 
\x01(\x07\x12:\n\x0e\x64\x65vice_metrics\x18\x06 
\x01(\x0b\x32\".meshtastic.protobuf.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07
 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x16\n\thops_away\x18\t 
\x01(\rH\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n 
\x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x12 
\n\x18is_key_manually_verified\x18\x0c 
\x01(\x08\x42\x0c\n\n_hops_away\"\xca\x01\n\nMyNodeInfo\x12\x13\n\x0bmy_node_num\x18\x01
 \x01(\r\x12\x14\n\x0creboot_count\x18\x08 
\x01(\r\x12\x17\n\x0fmin_app_version\x18\x0b 
\x01(\r\x12\x11\n\tdevice_id\x18\x0c \x01(\x0c\x12\x0f\n\x07pio_env\x18\r 
\x01(\t\x12>\n\x10\x66irmware_edition\x18\x0e 
\x01(\x0e\x32$.meshtastic.protobuf.FirmwareEdition\x12\x14\n\x0cnodedb_count\x18\x0f
 \x01(\r\"\xc9\x01\n\tLogRecord\x12\x0f\n\x07message\x18\x01 
\x01(\t\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12\x0e\n\x06source\x18\x03 
\x01(\t\x12\x33\n\x05level\x18\x04 
\x01(\x0e\x32$.meshtastic.protobuf.LogRecord.Le
 
vel\"X\n\x05Level\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x43RITICAL\x10\x32\x12\t\n\x05\x45RROR\x10(\x12\x0b\n\x07WARNING\x10\x1e\x12\x08\n\x04INFO\x10\x14\x12\t\n\x05\x44\x45\x42UG\x10\n\x12\t\n\x05TRACE\x10\x05\"P\n\x0bQueueStatus\x12\x0b\n\x03res\x18\x01
 \x01(\x05\x12\x0c\n\x04\x66ree\x18\x02 \x01(\r\x12\x0e\n\x06maxlen\x18\x03 
\x01(\r\x12\x16\n\x0emesh_packet_id\x18\x04 
\x01(\r\"\xf7\x06\n\tFromRadio\x12\n\n\x02id\x18\x01 
\x01(\r\x12\x31\n\x06packet\x18\x02 
\x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x32\n\x07my_info\x18\x03
 
\x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfoH\x00\x12\x32\n\tnode_info\x18\x04
 
\x01(\x0b\x32\x1d.meshtastic.protobuf.NodeInfoH\x00\x12-\n\x06\x63onfig\x18\x05 
\x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12\x34\n\nlog_record\x18\x06 
\x01(\x0b\x32\x1e.meshtastic.protobuf.LogRecordH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x07
 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\x08 
\x01(\x08H\x00\x12\x39\n\x0cmoduleConfig\x18\t \x01(\x0b\x32!.mesh
 tastic.protobuf.ModuleConfigH\x00\x12/\n\x07\x63hannel\x18\n 
\x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x37\n\x0bqueueStatus\x18\x0b
 \x01(\x0b\x32 
.meshtastic.protobuf.QueueStatusH\x00\x12\x33\n\x0cxmodemPacket\x18\x0c 
\x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12\x37\n\x08metadata\x18\r 
\x01(\x0b\x32#.meshtastic.protobuf.DeviceMetadataH\x00\x12M\n\x16mqttClientProxyMessage\x18\x0e
 
\x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x31\n\x08\x66ileInfo\x18\x0f
 
\x01(\x0b\x32\x1d.meshtastic.protobuf.FileInfoH\x00\x12\x45\n\x12\x63lientNotification\x18\x10
 
\x01(\x0b\x32\'.meshtastic.protobuf.ClientNotificationH\x00\x12=\n\x0e\x64\x65viceuiConfig\x18\x11
 
\x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x42\x11\n\x0fpayload_variant\"\xb0\x04\n\x12\x43lientNotification\x12\x15\n\x08reply_id\x18\x01
 \x01(\rH\x01\x88\x01\x01\x12\x0c\n\x04time\x18\x02 
\x01(\x07\x12\x33\n\x05level\x18\x03 
\x01(\x0e\x32$.meshtastic.protobuf.LogRecord.Level\x12\x0f\n\x0
 7message\x18\x04 \x01(\t\x12Z\n\x1ekey_verification_number_inform\x18\x0b 
\x01(\x0b\x32\x30.meshtastic.protobuf.KeyVerificationNumberInformH\x00\x12\\\n\x1fkey_verification_number_request\x18\x0c
 
\x01(\x0b\x32\x31.meshtastic.protobuf.KeyVerificationNumberRequestH\x00\x12K\n\x16key_verification_final\x18\r
 
\x01(\x0b\x32).meshtastic.protobuf.KeyVerificationFinalH\x00\x12I\n\x15\x64uplicated_public_key\x18\x0e
 
\x01(\x0b\x32(.meshtastic.protobuf.DuplicatedPublicKeyH\x00\x12=\n\x0flow_entropy_key\x18\x0f
 
\x01(\x0b\x32\".meshtastic.protobuf.LowEntropyKeyH\x00\x42\x11\n\x0fpayload_variantB\x0b\n\t_reply_id\"^\n\x1bKeyVerificationNumberInform\x12\r\n\x05nonce\x18\x01
 \x01(\x04\x12\x17\n\x0fremote_longname\x18\x02 
\x01(\t\x12\x17\n\x0fsecurity_number\x18\x03 
\x01(\r\"F\n\x1cKeyVerificationNumberRequest\x12\r\n\x05nonce\x18\x01 
\x01(\x04\x12\x17\n\x0fremote_longname\x18\x02 
\x01(\t\"q\n\x14KeyVerificationFinal\x12\r\n\x05nonce\x18\x01 
\x01(\x04\x12\x17\n\x0fremote_longname\x18\x02 \x01(\t\x12
 \x10\n\x08isSender\x18\x03 
\x01(\x08\x12\x1f\n\x17verification_characters\x18\x04 
\x01(\t\"\x15\n\x13\x44uplicatedPublicKey\"\x0f\n\rLowEntropyKey\"1\n\x08\x46ileInfo\x12\x11\n\tfile_name\x18\x01
 \x01(\t\x12\x12\n\nsize_bytes\x18\x02 
\x01(\r\"\xb8\x02\n\x07ToRadio\x12\x31\n\x06packet\x18\x01 
\x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x03
 \x01(\rH\x00\x12\x14\n\ndisconnect\x18\x04 
\x01(\x08H\x00\x12\x33\n\x0cxmodemPacket\x18\x05 
\x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12M\n\x16mqttClientProxyMessage\x18\x06
 
\x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x33\n\theartbeat\x18\x07
 
\x01(\x0b\x32\x1e.meshtastic.protobuf.HeartbeatH\x00\x42\x11\n\x0fpayload_variant\"I\n\nCompressed\x12-\n\x07portnum\x18\x01
 \x01(\x0e\x32\x1c.meshtastic.protobuf.PortNum\x12\x0c\n\x04\x64\x61ta\x18\x02 
\x01(\x0c\"\x90\x01\n\x0cNeighborInfo\x12\x0f\n\x07node_id\x18\x01 
\x01(\r\x12\x17\n\x0flast_sent_by_id\x18\x02 \x01(\r\x12$\n\x1cnode_b
 roadcast_interval_secs\x18\x03 \x01(\r\x12\x30\n\tneighbors\x18\x04 
\x03(\x0b\x32\x1d.meshtastic.protobuf.Neighbor\"d\n\x08Neighbor\x12\x0f\n\x07node_id\x18\x01
 \x01(\r\x12\x0b\n\x03snr\x18\x02 \x01(\x02\x12\x14\n\x0clast_rx_time\x18\x03 
\x01(\x07\x12$\n\x1cnode_broadcast_interval_secs\x18\x04 
\x01(\r\"\xe9\x02\n\x0e\x44\x65viceMetadata\x12\x18\n\x10\x66irmware_version\x18\x01
 \x01(\t\x12\x1c\n\x14\x64\x65vice_state_version\x18\x02 
\x01(\r\x12\x13\n\x0b\x63\x61nShutdown\x18\x03 
\x01(\x08\x12\x0f\n\x07hasWifi\x18\x04 
\x01(\x08\x12\x14\n\x0chasBluetooth\x18\x05 
\x01(\x08\x12\x13\n\x0bhasEthernet\x18\x06 \x01(\x08\x12;\n\x04role\x18\x07 
\x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x16\n\x0eposition_flags\x18\x08
 \x01(\r\x12\x34\n\x08hw_model\x18\t 
\x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x19\n\x11hasRemoteHardware\x18\n
 \x01(\x08\x12\x0e\n\x06hasPKC\x18\x0b 
\x01(\x08\x12\x18\n\x10\x65xcluded_modules\x18\x0c 
\x01(\r\"\x1a\n\tHeartbeat\x12\r\n\x05nonce\x18
 \x01 \x01(\r\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 
\x01(\r\x12\x33\n\x03pin\x18\x02 
\x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"e\n\x0e\x43hunkedPayload\x12\x12\n\npayload_id\x18\x01
 \x01(\r\x12\x13\n\x0b\x63hunk_count\x18\x02 
\x01(\r\x12\x13\n\x0b\x63hunk_index\x18\x03 
\x01(\r\x12\x15\n\rpayload_chunk\x18\x04 
\x01(\x0c\"\x1f\n\rresend_chunks\x12\x0e\n\x06\x63hunks\x18\x01 
\x03(\r\"\xb3\x01\n\x16\x43hunkedPayloadResponse\x12\x12\n\npayload_id\x18\x01 
\x01(\r\x12\x1a\n\x10request_transfer\x18\x02 
\x01(\x08H\x00\x12\x19\n\x0f\x61\x63\x63\x65pt_transfer\x18\x03 
\x01(\x08H\x00\x12;\n\rresend_chunks\x18\x04 
\x01(\x0b\x32\".meshtastic.protobuf.resend_chunksH\x00\x42\x11\n\x0fpayload_variant*\xe2\x11\n\rHardwareModel\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08TLORA_V2\x10\x01\x12\x0c\n\x08TLORA_V1\x10\x02\x12\x12\n\x0eTLORA_V2_1_1P6\x10\x03\x12\t\n\x05TBEAM\x10\x04\x12\x0f\n\x0bHELTEC_V2_0\x10\x05\x12\x0e\n\nTBEAM_V0P7\x10\x06\x12\n\n\x06T_ECHO\x10\x07\x12\x10\n\
 
x0cTLORA_V1_1P3\x10\x08\x12\x0b\n\x07RAK4631\x10\t\x12\x0f\n\x0bHELTEC_V2_1\x10\n\x12\r\n\tHELTEC_V1\x10\x0b\x12\x18\n\x14LILYGO_TBEAM_S3_CORE\x10\x0c\x12\x0c\n\x08RAK11200\x10\r\x12\x0b\n\x07NANO_G1\x10\x0e\x12\x12\n\x0eTLORA_V2_1_1P8\x10\x0f\x12\x0f\n\x0bTLORA_T3_S3\x10\x10\x12\x14\n\x10NANO_G1_EXPLORER\x10\x11\x12\x11\n\rNANO_G2_ULTRA\x10\x12\x12\r\n\tLORA_TYPE\x10\x13\x12\x0b\n\x07WIPHONE\x10\x14\x12\x0e\n\nWIO_WM1110\x10\x15\x12\x0b\n\x07RAK2560\x10\x16\x12\x13\n\x0fHELTEC_HRU_3601\x10\x17\x12\x1a\n\x16HELTEC_WIRELESS_BRIDGE\x10\x18\x12\x0e\n\nSTATION_G1\x10\x19\x12\x0c\n\x08RAK11310\x10\x1a\x12\x14\n\x10SENSELORA_RP2040\x10\x1b\x12\x10\n\x0cSENSELORA_S3\x10\x1c\x12\r\n\tCANARYONE\x10\x1d\x12\x0f\n\x0bRP2040_LORA\x10\x1e\x12\x0e\n\nSTATION_G2\x10\x1f\x12\x11\n\rLORA_RELAY_V1\x10
 
\x12\x0e\n\nNRF52840DK\x10!\x12\x07\n\x03PPR\x10\"\x12\x0f\n\x0bGENIEBLOCKS\x10#\x12\x11\n\rNRF52_UNKNOWN\x10$\x12\r\n\tPORTDUINO\x10%\x12\x0f\n\x0b\x41NDROID_SIM\x10&\x12\n\n\x06\x44IY_V1\x10\'\x12\x15
 
\n\x11NRF52840_PCA10059\x10(\x12\n\n\x06\x44R_DEV\x10)\x12\x0b\n\x07M5STACK\x10*\x12\r\n\tHELTEC_V3\x10+\x12\x11\n\rHELTEC_WSL_V3\x10,\x12\x13\n\x0f\x42\x45TAFPV_2400_TX\x10-\x12\x17\n\x13\x42\x45TAFPV_900_NANO_TX\x10.\x12\x0c\n\x08RPI_PICO\x10/\x12\x1b\n\x17HELTEC_WIRELESS_TRACKER\x10\x30\x12\x19\n\x15HELTEC_WIRELESS_PAPER\x10\x31\x12\n\n\x06T_DECK\x10\x32\x12\x0e\n\nT_WATCH_S3\x10\x33\x12\x11\n\rPICOMPUTER_S3\x10\x34\x12\x0f\n\x0bHELTEC_HT62\x10\x35\x12\x12\n\x0e\x45\x42YTE_ESP32_S3\x10\x36\x12\x11\n\rESP32_S3_PICO\x10\x37\x12\r\n\tCHATTER_2\x10\x38\x12\x1e\n\x1aHELTEC_WIRELESS_PAPER_V1_0\x10\x39\x12
 
\n\x1cHELTEC_WIRELESS_TRACKER_V1_0\x10:\x12\x0b\n\x07UNPHONE\x10;\x12\x0c\n\x08TD_LORAC\x10<\x12\x13\n\x0f\x43\x44\x45\x42YTE_EORA_S3\x10=\x12\x0f\n\x0bTWC_MESH_V4\x10>\x12\x16\n\x12NRF52_PROMICRO_DIY\x10?\x12\x1f\n\x1bRADIOMASTER_900_BANDIT_NANO\x10@\x12\x1c\n\x18HELTEC_CAPSULE_SENSOR_V3\x10\x41\x12\x1d\n\x19HELTEC_VISION_MASTER_T190\x10\x42\x12\x1d\n\x19HELTEC_VISION_MASTER_E213\x10
 
\x43\x12\x1d\n\x19HELTEC_VISION_MASTER_E290\x10\x44\x12\x19\n\x15HELTEC_MESH_NODE_T114\x10\x45\x12\x16\n\x12SENSECAP_INDICATOR\x10\x46\x12\x13\n\x0fTRACKER_T1000_E\x10G\x12\x0b\n\x07RAK3172\x10H\x12\n\n\x06WIO_E5\x10I\x12\x1a\n\x16RADIOMASTER_900_BANDIT\x10J\x12\x13\n\x0fME25LS01_4Y10TD\x10K\x12\x18\n\x14RP2040_FEATHER_RFM95\x10L\x12\x15\n\x11M5STACK_COREBASIC\x10M\x12\x11\n\rM5STACK_CORE2\x10N\x12\r\n\tRPI_PICO2\x10O\x12\x12\n\x0eM5STACK_CORES3\x10P\x12\x11\n\rSEEED_XIAO_S3\x10Q\x12\x0b\n\x07MS24SF1\x10R\x12\x0c\n\x08TLORA_C6\x10S\x12\x0f\n\x0bWISMESH_TAP\x10T\x12\r\n\tROUTASTIC\x10U\x12\x0c\n\x08MESH_TAB\x10V\x12\x0c\n\x08MESHLINK\x10W\x12\x12\n\x0eXIAO_NRF52_KIT\x10X\x12\x10\n\x0cTHINKNODE_M1\x10Y\x12\x10\n\x0cTHINKNODE_M2\x10Z\x12\x0f\n\x0bT_ETH_ELITE\x10[\x12\x15\n\x11HELTEC_SENSOR_HUB\x10\\\x12\x1a\n\x16RESERVED_FRIED_CHICKEN\x10]\x12\x16\n\x12HELTEC_MESH_POCKET\x10^\x12\x14\n\x10SEEED_SOLAR_NODE\x10_\x12\x18\n\x14NOMADSTAR_METEOR_PRO\x10`\x12\r\n\tCROWPANEL\x10\x61\x12\x0b\n\
 
x07LINK_32\x10\x62\x12\x18\n\x14SEEED_WIO_TRACKER_L1\x10\x63\x12\x1d\n\x19SEEED_WIO_TRACKER_L1_EINK\x10\x64\x12\x0f\n\x0bMUZI_R1_NEO\x10\x65\x12\x0e\n\nT_DECK_PRO\x10\x66\x12\x10\n\x0cT_LORA_PAGER\x10g\x12\x14\n\x10M5STACK_RESERVED\x10h\x12\x0f\n\x0bWISMESH_TAG\x10i\x12\x0b\n\x07RAK3312\x10j\x12\x10\n\x0cTHINKNODE_M5\x10k\x12\x15\n\x11HELTEC_MESH_SOLAR\x10l\x12\x0f\n\x0bT_ECHO_LITE\x10m\x12\r\n\tHELTEC_V4\x10n\x12\x0f\n\x0bM5STACK_C6L\x10o\x12\x19\n\x15M5STACK_CARDPUTER_ADV\x10p\x12\x1e\n\x1aHELTEC_WIRELESS_TRACKER_V2\x10q\x12\x11\n\rT_WATCH_ULTRA\x10r\x12\x10\n\x0cTHINKNODE_M3\x10s\x12\x12\n\x0eWISMESH_TAP_V2\x10t\x12\x0b\n\x07RAK3401\x10u\x12\x0f\n\nPRIVATE_HW\x10\xff\x01*,\n\tConstants\x12\x08\n\x04ZERO\x10\x00\x12\x15\n\x10\x44\x41TA_PAYLOAD_LEN\x10\xe9\x01*\xb4\x02\n\x11\x43riticalErrorCode\x12\x08\n\x04NONE\x10\x00\x12\x0f\n\x0bTX_WATCHDOG\x10\x01\x12\x14\n\x10SLEEP_ENTER_WAIT\x10\x02\x12\x0c\n\x08NO_RADIO\x10\x03\x12\x0f\n\x0bUNSPECIFIED\x10\x04\x12\x15\n\x11UBLOX_UNIT_FAILED
 
\x10\x05\x12\r\n\tNO_AXP192\x10\x06\x12\x19\n\x15INVALID_RADIO_SETTING\x10\x07\x12\x13\n\x0fTRANSMIT_FAILED\x10\x08\x12\x0c\n\x08\x42ROWNOUT\x10\t\x12\x12\n\x0eSX1262_FAILURE\x10\n\x12\x11\n\rRADIO_SPI_BUG\x10\x0b\x12
 
\n\x1c\x46LASH_CORRUPTION_RECOVERABLE\x10\x0c\x12\"\n\x1e\x46LASH_CORRUPTION_UNRECOVERABLE\x10\r*\x7f\n\x0f\x46irmwareEdition\x12\x0b\n\x07VANILLA\x10\x00\x12\x11\n\rSMART_CITIZEN\x10\x01\x12\x0e\n\nOPEN_SAUCE\x10\x10\x12\n\n\x06\x44\x45\x46\x43ON\x10\x11\x12\x0f\n\x0b\x42URNING_MAN\x10\x12\x12\x0e\n\nHAMVENTION\x10\x13\x12\x0f\n\x0b\x44IY_EDITION\x10\x7f*\x80\x03\n\x0f\x45xcludedModules\x12\x11\n\rEXCLUDED_NONE\x10\x00\x12\x0f\n\x0bMQTT_CONFIG\x10\x01\x12\x11\n\rSERIAL_CONFIG\x10\x02\x12\x13\n\x0f\x45XTNOTIF_CONFIG\x10\x04\x12\x17\n\x13STOREFORWARD_CONFIG\x10\x08\x12\x14\n\x10RANGETEST_CONFIG\x10\x10\x12\x14\n\x10TELEMETRY_CONFIG\x10
 
\x12\x14\n\x10\x43\x41NNEDMSG_CONFIG\x10@\x12\x11\n\x0c\x41UDIO_CONFIG\x10\x80\x01\x12\x1a\n\x15REMOTEHARDWARE_CONFIG\x10\x80\x02\x12\x1
 
8\n\x13NEIGHBORINFO_CONFIG\x10\x80\x04\x12\x1b\n\x16\x41MBIENTLIGHTING_CONFIG\x10\x80\x08\x12\x1b\n\x16\x44\x45TECTIONSENSOR_CONFIG\x10\x80\x10\x12\x16\n\x11PAXCOUNTER_CONFIG\x10\x80
 
\x12\x15\n\x10\x42LUETOOTH_CONFIG\x10\x80@\x12\x14\n\x0eNETWORK_CONFIG\x10\x80\x80\x01\x42`\n\x14org.meshtastic.protoB\nMeshProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = 
_descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/mesh.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a
 
meshtastic/protobuf/config.proto\x1a#meshtastic/protobuf/device_ui.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a\"meshtastic/protobuf/portnums.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a
 
meshtastic/protobuf/xmodem.proto\"\x99\x07\n\x08Position\x12\x17\n\nlatitude_i\x18\x01
 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x02 
\x01(\x0fH\x01\x88\x01\x01\x12\x15\n\x08\x61ltitude\x18\x03 
\x01(\x05H\x02\x88\x01\x01\x12\x0c\n\x04time\x18\x04 
\x01(\x07\x12@\n\x0flocation_source\x18\x05 
\x01(\x0e\x32\'.meshtastic.protobuf.Position.LocSource\x12@\n\x0f\x61ltitude_source\x18\x06
 
\x01(\x0e\x32\'.meshtastic.protobuf.Position.AltSource\x12\x11\n\ttimestamp\x18\x07
 \x01(\x07\x12\x1f\n\x17timestamp_millis_adjust\x18\x08 
\x01(\x05\x12\x19\n\x0c\x61ltitude_hae\x18\t 
\x01(\x11H\x03\x88\x01\x01\x12(\n\x1b\x61ltitude_
 geoidal_separation\x18\n \x01(\x11H\x04\x88\x01\x01\x12\x0c\n\x04PDOP\x18\x0b 
\x01(\r\x12\x0c\n\x04HDOP\x18\x0c \x01(\r\x12\x0c\n\x04VDOP\x18\r 
\x01(\r\x12\x14\n\x0cgps_accuracy\x18\x0e 
\x01(\r\x12\x19\n\x0cground_speed\x18\x0f 
\x01(\rH\x05\x88\x01\x01\x12\x19\n\x0cground_track\x18\x10 
\x01(\rH\x06\x88\x01\x01\x12\x13\n\x0b\x66ix_quality\x18\x11 
\x01(\r\x12\x10\n\x08\x66ix_type\x18\x12 
\x01(\r\x12\x14\n\x0csats_in_view\x18\x13 \x01(\r\x12\x11\n\tsensor_id\x18\x14 
\x01(\r\x12\x13\n\x0bnext_update\x18\x15 \x01(\r\x12\x12\n\nseq_number\x18\x16 
\x01(\r\x12\x16\n\x0eprecision_bits\x18\x17 
\x01(\r\"N\n\tLocSource\x12\r\n\tLOC_UNSET\x10\x00\x12\x0e\n\nLOC_MANUAL\x10\x01\x12\x10\n\x0cLOC_INTERNAL\x10\x02\x12\x10\n\x0cLOC_EXTERNAL\x10\x03\"b\n\tAltSource\x12\r\n\tALT_UNSET\x10\x00\x12\x0e\n\nALT_MANUAL\x10\x01\x12\x10\n\x0c\x41LT_INTERNAL\x10\x02\x12\x10\n\x0c\x41LT_EXTERNAL\x10\x03\x12\x12\n\x0e\x41LT_BAROMETRIC\x10\x04\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_iB\x0b\n\t_altitudeB\x0f\n\
 
r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separationB\x0f\n\r_ground_speedB\x0f\n\r_ground_track\"\x9c\x02\n\x04User\x12\n\n\x02id\x18\x01
 \x01(\t\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 
\x01(\t\x12\x13\n\x07macaddr\x18\x04 
\x01(\x0c\x42\x02\x18\x01\x12\x34\n\x08hw_model\x18\x05 
\x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x13\n\x0bis_licensed\x18\x06
 \x01(\x08\x12;\n\x04role\x18\x07 
\x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x08
 \x01(\x0c\x12\x1c\n\x0fis_unmessagable\x18\t 
\x01(\x08H\x00\x88\x01\x01\x42\x12\n\x10_is_unmessagable\"Z\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x01
 \x03(\x07\x12\x13\n\x0bsnr_towards\x18\x02 
\x03(\x05\x12\x12\n\nroute_back\x18\x03 \x03(\x07\x12\x10\n\x08snr_back\x18\x04 
\x03(\x05\"\x96\x04\n\x07Routing\x12<\n\rroute_request\x18\x01 
\x01(\x0b\x32#.meshtastic.protobuf.RouteDiscoveryH\x00\x12:\n\x0broute_reply\x18\x02
 \x01(\x0b\x32#.meshtastic.protobuf.RouteDiscoveryH\x00\x12:\n\
 x0c\x65rror_reason\x18\x03 
\x01(\x0e\x32\".meshtastic.protobuf.Routing.ErrorH\x00\"\xc9\x02\n\x05\x45rror\x12\x08\n\x04NONE\x10\x00\x12\x0c\n\x08NO_ROUTE\x10\x01\x12\x0b\n\x07GOT_NAK\x10\x02\x12\x0b\n\x07TIMEOUT\x10\x03\x12\x10\n\x0cNO_INTERFACE\x10\x04\x12\x12\n\x0eMAX_RETRANSMIT\x10\x05\x12\x0e\n\nNO_CHANNEL\x10\x06\x12\r\n\tTOO_LARGE\x10\x07\x12\x0f\n\x0bNO_RESPONSE\x10\x08\x12\x14\n\x10\x44UTY_CYCLE_LIMIT\x10\t\x12\x0f\n\x0b\x42\x41\x44_REQUEST\x10
 
\x12\x12\n\x0eNOT_AUTHORIZED\x10!\x12\x0e\n\nPKI_FAILED\x10\"\x12\x16\n\x12PKI_UNKNOWN_PUBKEY\x10#\x12\x19\n\x15\x41\x44MIN_BAD_SESSION_KEY\x10$\x12!\n\x1d\x41\x44MIN_PUBLIC_KEY_UNAUTHORIZED\x10%\x12\x17\n\x13RATE_LIMIT_EXCEEDED\x10&B\t\n\x07variant\"\xd4\x01\n\x04\x44\x61ta\x12-\n\x07portnum\x18\x01
 \x01(\x0e\x32\x1c.meshtastic.protobuf.PortNum\x12\x0f\n\x07payload\x18\x02 
\x01(\x0c\x12\x15\n\rwant_response\x18\x03 
\x01(\x08\x12\x0c\n\x04\x64\x65st\x18\x04 \x01(\x07\x12\x0e\n\x06source\x18\x05 
\x01(\x07\x12\x12\n\nrequest_id\x18\x06 
 \x01(\x07\x12\x10\n\x08reply_id\x18\x07 \x01(\x07\x12\r\n\x05\x65moji\x18\x08 
\x01(\x07\x12\x15\n\x08\x62itfield\x18\t 
\x01(\rH\x00\x88\x01\x01\x42\x0b\n\t_bitfield\">\n\x0fKeyVerification\x12\r\n\x05nonce\x18\x01
 \x01(\x04\x12\r\n\x05hash1\x18\x02 \x01(\x0c\x12\r\n\x05hash2\x18\x03 
\x01(\x0c\"\xbf\x03\n\x14StoreForwardPlusPlus\x12V\n\x11sfpp_message_type\x18\x01
 
\x01(\x0e\x32;.meshtastic.protobuf.StoreForwardPlusPlus.SFPP_message_type\x12\x14\n\x0cmessage_hash\x18\x02
 \x01(\x0c\x12\x13\n\x0b\x63ommit_hash\x18\x03 
\x01(\x0c\x12\x11\n\troot_hash\x18\x04 \x01(\x0c\x12\x0f\n\x07message\x18\x05 
\x01(\x0c\x12\x17\n\x0f\x65ncapsulated_id\x18\x06 
\x01(\r\x12\x17\n\x0f\x65ncapsulated_to\x18\x07 
\x01(\r\x12\x19\n\x11\x65ncapsulated_from\x18\x08 
\x01(\r\x12\x1b\n\x13\x65ncapsulated_rxtime\x18\t 
\x01(\r\"\x95\x01\n\x11SFPP_message_type\x12\x12\n\x0e\x43\x41NON_ANNOUNCE\x10\x00\x12\x0f\n\x0b\x43HAIN_QUERY\x10\x01\x12\x10\n\x0cLINK_REQUEST\x10\x03\x12\x10\n\x0cLINK_PROVIDE\x10\x04\x12\x1a\n\x16L
 
INK_PROVIDE_FIRSTHALF\x10\x05\x12\x1b\n\x17LINK_PROVIDE_SECONDHALF\x10\x06\"\xbc\x01\n\x08Waypoint\x12\n\n\x02id\x18\x01
 \x01(\r\x12\x17\n\nlatitude_i\x18\x02 
\x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x03 
\x01(\x0fH\x01\x88\x01\x01\x12\x0e\n\x06\x65xpire\x18\x04 
\x01(\r\x12\x11\n\tlocked_to\x18\x05 \x01(\r\x12\x0c\n\x04name\x18\x06 
\x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x07 
\x01(\t\x12\x0c\n\x04icon\x18\x08 
\x01(\x07\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_i\"l\n\x16MqttClientProxyMessage\x12\r\n\x05topic\x18\x01
 \x01(\t\x12\x0e\n\x04\x64\x61ta\x18\x02 
\x01(\x0cH\x00\x12\x0e\n\x04text\x18\x03 
\x01(\tH\x00\x12\x10\n\x08retained\x18\x04 
\x01(\x08\x42\x11\n\x0fpayload_variant\"\xd9\x07\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01
 \x01(\x07\x12\n\n\x02to\x18\x02 \x01(\x07\x12\x0f\n\x07\x63hannel\x18\x03 
\x01(\r\x12,\n\x07\x64\x65\x63oded\x18\x04 
\x01(\x0b\x32\x19.meshtastic.protobuf.DataH\x00\x12\x13\n\tencrypted\x18\x05 
\x01(\x0cH\x00\x12\n\n\x02id\x18\x06 \x01(\x07
 \x12\x0f\n\x07rx_time\x18\x07 \x01(\x07\x12\x0e\n\x06rx_snr\x18\x08 
\x01(\x02\x12\x11\n\thop_limit\x18\t \x01(\r\x12\x10\n\x08want_ack\x18\n 
\x01(\x08\x12:\n\x08priority\x18\x0b 
\x01(\x0e\x32(.meshtastic.protobuf.MeshPacket.Priority\x12\x0f\n\x07rx_rssi\x18\x0c
 \x01(\x05\x12<\n\x07\x64\x65layed\x18\r 
\x01(\x0e\x32\'.meshtastic.protobuf.MeshPacket.DelayedB\x02\x18\x01\x12\x10\n\x08via_mqtt\x18\x0e
 \x01(\x08\x12\x11\n\thop_start\x18\x0f \x01(\r\x12\x12\n\npublic_key\x18\x10 
\x01(\x0c\x12\x15\n\rpki_encrypted\x18\x11 
\x01(\x08\x12\x10\n\x08next_hop\x18\x12 \x01(\r\x12\x12\n\nrelay_node\x18\x13 
\x01(\r\x12\x10\n\x08tx_after\x18\x14 
\x01(\r\x12O\n\x13transport_mechanism\x18\x15 
\x01(\x0e\x32\x32.meshtastic.protobuf.MeshPacket.TransportMechanism\"~\n\x08Priority\x12\t\n\x05UNSET\x10\x00\x12\x07\n\x03MIN\x10\x01\x12\x0e\n\nBACKGROUND\x10\n\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10@\x12\x0c\n\x08RELIABLE\x10\x46\x12\x0c\n\x08RESPONSE\x10P\x12\x08\n\x04HIGH\x10\x64\x12\t\n\x05\x41LERT\x10n\x12\x0
 
7\n\x03\x41\x43K\x10x\x12\x07\n\x03MAX\x10\x7f\"B\n\x07\x44\x65layed\x12\x0c\n\x08NO_DELAY\x10\x00\x12\x15\n\x11\x44\x45LAYED_BROADCAST\x10\x01\x12\x12\n\x0e\x44\x45LAYED_DIRECT\x10\x02\"\xcf\x01\n\x12TransportMechanism\x12\x16\n\x12TRANSPORT_INTERNAL\x10\x00\x12\x12\n\x0eTRANSPORT_LORA\x10\x01\x12\x17\n\x13TRANSPORT_LORA_ALT1\x10\x02\x12\x17\n\x13TRANSPORT_LORA_ALT2\x10\x03\x12\x17\n\x13TRANSPORT_LORA_ALT3\x10\x04\x12\x12\n\x0eTRANSPORT_MQTT\x10\x05\x12\x1b\n\x17TRANSPORT_MULTICAST_UDP\x10\x06\x12\x11\n\rTRANSPORT_API\x10\x07\x42\x11\n\x0fpayload_variant\"\xe2\x02\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01
 \x01(\r\x12\'\n\x04user\x18\x02 
\x01(\x0b\x32\x19.meshtastic.protobuf.User\x12/\n\x08position\x18\x03 
\x01(\x0b\x32\x1d.meshtastic.protobuf.Position\x12\x0b\n\x03snr\x18\x04 
\x01(\x02\x12\x12\n\nlast_heard\x18\x05 
\x01(\x07\x12:\n\x0e\x64\x65vice_metrics\x18\x06 
\x01(\x0b\x32\".meshtastic.protobuf.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07
 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x0
 1(\x08\x12\x16\n\thops_away\x18\t 
\x01(\rH\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n 
\x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x12 
\n\x18is_key_manually_verified\x18\x0c 
\x01(\x08\x42\x0c\n\n_hops_away\"\xca\x01\n\nMyNodeInfo\x12\x13\n\x0bmy_node_num\x18\x01
 \x01(\r\x12\x14\n\x0creboot_count\x18\x08 
\x01(\r\x12\x17\n\x0fmin_app_version\x18\x0b 
\x01(\r\x12\x11\n\tdevice_id\x18\x0c \x01(\x0c\x12\x0f\n\x07pio_env\x18\r 
\x01(\t\x12>\n\x10\x66irmware_edition\x18\x0e 
\x01(\x0e\x32$.meshtastic.protobuf.FirmwareEdition\x12\x14\n\x0cnodedb_count\x18\x0f
 \x01(\r\"\xc9\x01\n\tLogRecord\x12\x0f\n\x07message\x18\x01 
\x01(\t\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12\x0e\n\x06source\x18\x03 
\x01(\t\x12\x33\n\x05level\x18\x04 
\x01(\x0e\x32$.meshtastic.protobuf.LogRecord.Level\"X\n\x05Level\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x43RITICAL\x10\x32\x12\t\n\x05\x45RROR\x10(\x12\x0b\n\x07WARNING\x10\x1e\x12\x08\n\x04INFO\x10\x14\x12\t\n\x05\x44\x45\x42UG\x10\n\x12\t\n\x05TRACE\x10\x05\"P\n\x
 0bQueueStatus\x12\x0b\n\x03res\x18\x01 \x01(\x05\x12\x0c\n\x04\x66ree\x18\x02 
\x01(\r\x12\x0e\n\x06maxlen\x18\x03 \x01(\r\x12\x16\n\x0emesh_packet_id\x18\x04 
\x01(\r\"\xf7\x06\n\tFromRadio\x12\n\n\x02id\x18\x01 
\x01(\r\x12\x31\n\x06packet\x18\x02 
\x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x32\n\x07my_info\x18\x03
 
\x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfoH\x00\x12\x32\n\tnode_info\x18\x04
 
\x01(\x0b\x32\x1d.meshtastic.protobuf.NodeInfoH\x00\x12-\n\x06\x63onfig\x18\x05 
\x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12\x34\n\nlog_record\x18\x06 
\x01(\x0b\x32\x1e.meshtastic.protobuf.LogRecordH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x07
 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\x08 
\x01(\x08H\x00\x12\x39\n\x0cmoduleConfig\x18\t 
\x01(\x0b\x32!.meshtastic.protobuf.ModuleConfigH\x00\x12/\n\x07\x63hannel\x18\n 
\x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x37\n\x0bqueueStatus\x18\x0b
 \x01(\x0b\x32 .meshtastic.protobuf.QueueStatusH\x00\x12\x33\n\x0cxmodemPac
 ket\x18\x0c 
\x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12\x37\n\x08metadata\x18\r 
\x01(\x0b\x32#.meshtastic.protobuf.DeviceMetadataH\x00\x12M\n\x16mqttClientProxyMessage\x18\x0e
 
\x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x31\n\x08\x66ileInfo\x18\x0f
 
\x01(\x0b\x32\x1d.meshtastic.protobuf.FileInfoH\x00\x12\x45\n\x12\x63lientNotification\x18\x10
 
\x01(\x0b\x32\'.meshtastic.protobuf.ClientNotificationH\x00\x12=\n\x0e\x64\x65viceuiConfig\x18\x11
 
\x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x42\x11\n\x0fpayload_variant\"\xb0\x04\n\x12\x43lientNotification\x12\x15\n\x08reply_id\x18\x01
 \x01(\rH\x01\x88\x01\x01\x12\x0c\n\x04time\x18\x02 
\x01(\x07\x12\x33\n\x05level\x18\x03 
\x01(\x0e\x32$.meshtastic.protobuf.LogRecord.Level\x12\x0f\n\x07message\x18\x04 
\x01(\t\x12Z\n\x1ekey_verification_number_inform\x18\x0b 
\x01(\x0b\x32\x30.meshtastic.protobuf.KeyVerificationNumberInformH\x00\x12\\\n\x1fkey_verification_number_request\x18\x0c
 \x01(\x0b\x32\x31.mesht
 
astic.protobuf.KeyVerificationNumberRequestH\x00\x12K\n\x16key_verification_final\x18\r
 
\x01(\x0b\x32).meshtastic.protobuf.KeyVerificationFinalH\x00\x12I\n\x15\x64uplicated_public_key\x18\x0e
 
\x01(\x0b\x32(.meshtastic.protobuf.DuplicatedPublicKeyH\x00\x12=\n\x0flow_entropy_key\x18\x0f
 
\x01(\x0b\x32\".meshtastic.protobuf.LowEntropyKeyH\x00\x42\x11\n\x0fpayload_variantB\x0b\n\t_reply_id\"^\n\x1bKeyVerificationNumberInform\x12\r\n\x05nonce\x18\x01
 \x01(\x04\x12\x17\n\x0fremote_longname\x18\x02 
\x01(\t\x12\x17\n\x0fsecurity_number\x18\x03 
\x01(\r\"F\n\x1cKeyVerificationNumberRequest\x12\r\n\x05nonce\x18\x01 
\x01(\x04\x12\x17\n\x0fremote_longname\x18\x02 
\x01(\t\"q\n\x14KeyVerificationFinal\x12\r\n\x05nonce\x18\x01 
\x01(\x04\x12\x17\n\x0fremote_longname\x18\x02 
\x01(\t\x12\x10\n\x08isSender\x18\x03 
\x01(\x08\x12\x1f\n\x17verification_characters\x18\x04 
\x01(\t\"\x15\n\x13\x44uplicatedPublicKey\"\x0f\n\rLowEntropyKey\"1\n\x08\x46ileInfo\x12\x11\n\tfile_name\x18\x01
 \x01(\t\x12\x12\n\nsize
 _bytes\x18\x02 \x01(\r\"\xb8\x02\n\x07ToRadio\x12\x31\n\x06packet\x18\x01 
\x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x03
 \x01(\rH\x00\x12\x14\n\ndisconnect\x18\x04 
\x01(\x08H\x00\x12\x33\n\x0cxmodemPacket\x18\x05 
\x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12M\n\x16mqttClientProxyMessage\x18\x06
 
\x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x33\n\theartbeat\x18\x07
 
\x01(\x0b\x32\x1e.meshtastic.protobuf.HeartbeatH\x00\x42\x11\n\x0fpayload_variant\"I\n\nCompressed\x12-\n\x07portnum\x18\x01
 \x01(\x0e\x32\x1c.meshtastic.protobuf.PortNum\x12\x0c\n\x04\x64\x61ta\x18\x02 
\x01(\x0c\"\x90\x01\n\x0cNeighborInfo\x12\x0f\n\x07node_id\x18\x01 
\x01(\r\x12\x17\n\x0flast_sent_by_id\x18\x02 
\x01(\r\x12$\n\x1cnode_broadcast_interval_secs\x18\x03 
\x01(\r\x12\x30\n\tneighbors\x18\x04 
\x03(\x0b\x32\x1d.meshtastic.protobuf.Neighbor\"d\n\x08Neighbor\x12\x0f\n\x07node_id\x18\x01
 \x01(\r\x12\x0b\n\x03snr\x18\x02 \x01(\x02\x12\x14\n\x0cla
 st_rx_time\x18\x03 \x01(\x07\x12$\n\x1cnode_broadcast_interval_secs\x18\x04 
\x01(\r\"\xe9\x02\n\x0e\x44\x65viceMetadata\x12\x18\n\x10\x66irmware_version\x18\x01
 \x01(\t\x12\x1c\n\x14\x64\x65vice_state_version\x18\x02 
\x01(\r\x12\x13\n\x0b\x63\x61nShutdown\x18\x03 
\x01(\x08\x12\x0f\n\x07hasWifi\x18\x04 
\x01(\x08\x12\x14\n\x0chasBluetooth\x18\x05 
\x01(\x08\x12\x13\n\x0bhasEthernet\x18\x06 \x01(\x08\x12;\n\x04role\x18\x07 
\x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x16\n\x0eposition_flags\x18\x08
 \x01(\r\x12\x34\n\x08hw_model\x18\t 
\x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x19\n\x11hasRemoteHardware\x18\n
 \x01(\x08\x12\x0e\n\x06hasPKC\x18\x0b 
\x01(\x08\x12\x18\n\x10\x65xcluded_modules\x18\x0c 
\x01(\r\"\x1a\n\tHeartbeat\x12\r\n\x05nonce\x18\x01 
\x01(\r\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 
\x01(\r\x12\x33\n\x03pin\x18\x02 
\x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"e\n\x0e\x43hunkedPayload\x12\x12\n\npayload_id\x18\x01
 \x01
 (\r\x12\x13\n\x0b\x63hunk_count\x18\x02 
\x01(\r\x12\x13\n\x0b\x63hunk_index\x18\x03 
\x01(\r\x12\x15\n\rpayload_chunk\x18\x04 
\x01(\x0c\"\x1f\n\rresend_chunks\x12\x0e\n\x06\x63hunks\x18\x01 
\x03(\r\"\xb3\x01\n\x16\x43hunkedPayloadResponse\x12\x12\n\npayload_id\x18\x01 
\x01(\r\x12\x1a\n\x10request_transfer\x18\x02 
\x01(\x08H\x00\x12\x19\n\x0f\x61\x63\x63\x65pt_transfer\x18\x03 
\x01(\x08H\x00\x12;\n\rresend_chunks\x18\x04 
\x01(\x0b\x32\".meshtastic.protobuf.resend_chunksH\x00\x42\x11\n\x0fpayload_variant*\x86\x12\n\rHardwareModel\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08TLORA_V2\x10\x01\x12\x0c\n\x08TLORA_V1\x10\x02\x12\x12\n\x0eTLORA_V2_1_1P6\x10\x03\x12\t\n\x05TBEAM\x10\x04\x12\x0f\n\x0bHELTEC_V2_0\x10\x05\x12\x0e\n\nTBEAM_V0P7\x10\x06\x12\n\n\x06T_ECHO\x10\x07\x12\x10\n\x0cTLORA_V1_1P3\x10\x08\x12\x0b\n\x07RAK4631\x10\t\x12\x0f\n\x0bHELTEC_V2_1\x10\n\x12\r\n\tHELTEC_V1\x10\x0b\x12\x18\n\x14LILYGO_TBEAM_S3_CORE\x10\x0c\x12\x0c\n\x08RAK11200\x10\r\x12\x0b\n\x07NANO_G1\x10\x0e\x12\x12\n\x
 
0eTLORA_V2_1_1P8\x10\x0f\x12\x0f\n\x0bTLORA_T3_S3\x10\x10\x12\x14\n\x10NANO_G1_EXPLORER\x10\x11\x12\x11\n\rNANO_G2_ULTRA\x10\x12\x12\r\n\tLORA_TYPE\x10\x13\x12\x0b\n\x07WIPHONE\x10\x14\x12\x0e\n\nWIO_WM1110\x10\x15\x12\x0b\n\x07RAK2560\x10\x16\x12\x13\n\x0fHELTEC_HRU_3601\x10\x17\x12\x1a\n\x16HELTEC_WIRELESS_BRIDGE\x10\x18\x12\x0e\n\nSTATION_G1\x10\x19\x12\x0c\n\x08RAK11310\x10\x1a\x12\x14\n\x10SENSELORA_RP2040\x10\x1b\x12\x10\n\x0cSENSELORA_S3\x10\x1c\x12\r\n\tCANARYONE\x10\x1d\x12\x0f\n\x0bRP2040_LORA\x10\x1e\x12\x0e\n\nSTATION_G2\x10\x1f\x12\x11\n\rLORA_RELAY_V1\x10
 
\x12\x0e\n\nNRF52840DK\x10!\x12\x07\n\x03PPR\x10\"\x12\x0f\n\x0bGENIEBLOCKS\x10#\x12\x11\n\rNRF52_UNKNOWN\x10$\x12\r\n\tPORTDUINO\x10%\x12\x0f\n\x0b\x41NDROID_SIM\x10&\x12\n\n\x06\x44IY_V1\x10\'\x12\x15\n\x11NRF52840_PCA10059\x10(\x12\n\n\x06\x44R_DEV\x10)\x12\x0b\n\x07M5STACK\x10*\x12\r\n\tHELTEC_V3\x10+\x12\x11\n\rHELTEC_WSL_V3\x10,\x12\x13\n\x0f\x42\x45TAFPV_2400_TX\x10-\x12\x17\n\x13\x42\x45TAFPV_900_NANO_TX\x10.\
 
x12\x0c\n\x08RPI_PICO\x10/\x12\x1b\n\x17HELTEC_WIRELESS_TRACKER\x10\x30\x12\x19\n\x15HELTEC_WIRELESS_PAPER\x10\x31\x12\n\n\x06T_DECK\x10\x32\x12\x0e\n\nT_WATCH_S3\x10\x33\x12\x11\n\rPICOMPUTER_S3\x10\x34\x12\x0f\n\x0bHELTEC_HT62\x10\x35\x12\x12\n\x0e\x45\x42YTE_ESP32_S3\x10\x36\x12\x11\n\rESP32_S3_PICO\x10\x37\x12\r\n\tCHATTER_2\x10\x38\x12\x1e\n\x1aHELTEC_WIRELESS_PAPER_V1_0\x10\x39\x12
 
\n\x1cHELTEC_WIRELESS_TRACKER_V1_0\x10:\x12\x0b\n\x07UNPHONE\x10;\x12\x0c\n\x08TD_LORAC\x10<\x12\x13\n\x0f\x43\x44\x45\x42YTE_EORA_S3\x10=\x12\x0f\n\x0bTWC_MESH_V4\x10>\x12\x16\n\x12NRF52_PROMICRO_DIY\x10?\x12\x1f\n\x1bRADIOMASTER_900_BANDIT_NANO\x10@\x12\x1c\n\x18HELTEC_CAPSULE_SENSOR_V3\x10\x41\x12\x1d\n\x19HELTEC_VISION_MASTER_T190\x10\x42\x12\x1d\n\x19HELTEC_VISION_MASTER_E213\x10\x43\x12\x1d\n\x19HELTEC_VISION_MASTER_E290\x10\x44\x12\x19\n\x15HELTEC_MESH_NODE_T114\x10\x45\x12\x16\n\x12SENSECAP_INDICATOR\x10\x46\x12\x13\n\x0fTRACKER_T1000_E\x10G\x12\x0b\n\x07RAK3172\x10H\x12\n\n\x06WIO_E5\x10I\x
 
12\x1a\n\x16RADIOMASTER_900_BANDIT\x10J\x12\x13\n\x0fME25LS01_4Y10TD\x10K\x12\x18\n\x14RP2040_FEATHER_RFM95\x10L\x12\x15\n\x11M5STACK_COREBASIC\x10M\x12\x11\n\rM5STACK_CORE2\x10N\x12\r\n\tRPI_PICO2\x10O\x12\x12\n\x0eM5STACK_CORES3\x10P\x12\x11\n\rSEEED_XIAO_S3\x10Q\x12\x0b\n\x07MS24SF1\x10R\x12\x0c\n\x08TLORA_C6\x10S\x12\x0f\n\x0bWISMESH_TAP\x10T\x12\r\n\tROUTASTIC\x10U\x12\x0c\n\x08MESH_TAB\x10V\x12\x0c\n\x08MESHLINK\x10W\x12\x12\n\x0eXIAO_NRF52_KIT\x10X\x12\x10\n\x0cTHINKNODE_M1\x10Y\x12\x10\n\x0cTHINKNODE_M2\x10Z\x12\x0f\n\x0bT_ETH_ELITE\x10[\x12\x15\n\x11HELTEC_SENSOR_HUB\x10\\\x12\r\n\tMUZI_BASE\x10]\x12\x16\n\x12HELTEC_MESH_POCKET\x10^\x12\x14\n\x10SEEED_SOLAR_NODE\x10_\x12\x18\n\x14NOMADSTAR_METEOR_PRO\x10`\x12\r\n\tCROWPANEL\x10\x61\x12\x0b\n\x07LINK_32\x10\x62\x12\x18\n\x14SEEED_WIO_TRACKER_L1\x10\x63\x12\x1d\n\x19SEEED_WIO_TRACKER_L1_EINK\x10\x64\x12\x0f\n\x0bMUZI_R1_NEO\x10\x65\x12\x0e\n\nT_DECK_PRO\x10\x66\x12\x10\n\x0cT_LORA_PAGER\x10g\x12\x14\n\x10M5STACK_RESERVED\x10h
 
\x12\x0f\n\x0bWISMESH_TAG\x10i\x12\x0b\n\x07RAK3312\x10j\x12\x10\n\x0cTHINKNODE_M5\x10k\x12\x15\n\x11HELTEC_MESH_SOLAR\x10l\x12\x0f\n\x0bT_ECHO_LITE\x10m\x12\r\n\tHELTEC_V4\x10n\x12\x0f\n\x0bM5STACK_C6L\x10o\x12\x19\n\x15M5STACK_CARDPUTER_ADV\x10p\x12\x1e\n\x1aHELTEC_WIRELESS_TRACKER_V2\x10q\x12\x11\n\rT_WATCH_ULTRA\x10r\x12\x10\n\x0cTHINKNODE_M3\x10s\x12\x12\n\x0eWISMESH_TAP_V2\x10t\x12\x0b\n\x07RAK3401\x10u\x12\x0b\n\x07RAK6421\x10v\x12\x10\n\x0cTHINKNODE_M4\x10w\x12\x10\n\x0cTHINKNODE_M6\x10x\x12\x0f\n\nPRIVATE_HW\x10\xff\x01*,\n\tConstants\x12\x08\n\x04ZERO\x10\x00\x12\x15\n\x10\x44\x41TA_PAYLOAD_LEN\x10\xe9\x01*\xb4\x02\n\x11\x43riticalErrorCode\x12\x08\n\x04NONE\x10\x00\x12\x0f\n\x0bTX_WATCHDOG\x10\x01\x12\x14\n\x10SLEEP_ENTER_WAIT\x10\x02\x12\x0c\n\x08NO_RADIO\x10\x03\x12\x0f\n\x0bUNSPECIFIED\x10\x04\x12\x15\n\x11UBLOX_UNIT_FAILED\x10\x05\x12\r\n\tNO_AXP192\x10\x06\x12\x19\n\x15INVALID_RADIO_SETTING\x10\x07\x12\x13\n\x0fTRANSMIT_FAILED\x10\x08\x12\x0c\n\x08\x42ROWNOUT\x10\t\x
 12\x12\n\x0eSX1262_FAILURE\x10\n\x12\x11\n\rRADIO_SPI_BUG\x10\x0b\x12 
\n\x1c\x46LASH_CORRUPTION_RECOVERABLE\x10\x0c\x12\"\n\x1e\x46LASH_CORRUPTION_UNRECOVERABLE\x10\r*\x7f\n\x0f\x46irmwareEdition\x12\x0b\n\x07VANILLA\x10\x00\x12\x11\n\rSMART_CITIZEN\x10\x01\x12\x0e\n\nOPEN_SAUCE\x10\x10\x12\n\n\x06\x44\x45\x46\x43ON\x10\x11\x12\x0f\n\x0b\x42URNING_MAN\x10\x12\x12\x0e\n\nHAMVENTION\x10\x13\x12\x0f\n\x0b\x44IY_EDITION\x10\x7f*\x80\x03\n\x0f\x45xcludedModules\x12\x11\n\rEXCLUDED_NONE\x10\x00\x12\x0f\n\x0bMQTT_CONFIG\x10\x01\x12\x11\n\rSERIAL_CONFIG\x10\x02\x12\x13\n\x0f\x45XTNOTIF_CONFIG\x10\x04\x12\x17\n\x13STOREFORWARD_CONFIG\x10\x08\x12\x14\n\x10RANGETEST_CONFIG\x10\x10\x12\x14\n\x10TELEMETRY_CONFIG\x10
 
\x12\x14\n\x10\x43\x41NNEDMSG_CONFIG\x10@\x12\x11\n\x0c\x41UDIO_CONFIG\x10\x80\x01\x12\x1a\n\x15REMOTEHARDWARE_CONFIG\x10\x80\x02\x12\x18\n\x13NEIGHBORINFO_CONFIG\x10\x80\x04\x12\x1b\n\x16\x41MBIENTLIGHTING_CONFIG\x10\x80\x08\x12\x1b\n\x16\x44\x45TECTIONSENSOR_CONFIG\x10\x80\x10\x12\
 x16\n\x11PAXCOUNTER_CONFIG\x10\x80 
\x12\x15\n\x10\x42LUETOOTH_CONFIG\x10\x80@\x12\x14\n\x0eNETWORK_CONFIG\x10\x80\x80\x01\x42`\n\x14org.meshtastic.protoB\nMeshProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
 
 _globals = globals()
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -32,16 +32,16 @@
   _USER.fields_by_name['macaddr']._serialized_options = b'\030\001'
   _MESHPACKET.fields_by_name['delayed']._options = None
   _MESHPACKET.fields_by_name['delayed']._serialized_options = b'\030\001'
-  _globals['_HARDWAREMODEL']._serialized_start=7838
-  _globals['_HARDWAREMODEL']._serialized_end=10112
-  _globals['_CONSTANTS']._serialized_start=10114
-  _globals['_CONSTANTS']._serialized_end=10158
-  _globals['_CRITICALERRORCODE']._serialized_start=10161
-  _globals['_CRITICALERRORCODE']._serialized_end=10469
-  _globals['_FIRMWAREEDITION']._serialized_start=10471
-  _globals['_FIRMWAREEDITION']._serialized_end=10598
-  _globals['_EXCLUDEDMODULES']._serialized_start=10601
-  _globals['_EXCLUDEDMODULES']._serialized_end=10985
+  _globals['_HARDWAREMODEL']._serialized_start=8288
+  _globals['_HARDWAREMODEL']._serialized_end=10598
+  _globals['_CONSTANTS']._serialized_start=10600
+  _globals['_CONSTANTS']._serialized_end=10644
+  _globals['_CRITICALERRORCODE']._serialized_start=10647
+  _globals['_CRITICALERRORCODE']._serialized_end=10955
+  _globals['_FIRMWAREEDITION']._serialized_start=10957
+  _globals['_FIRMWAREEDITION']._serialized_end=11084
+  _globals['_EXCLUDEDMODULES']._serialized_start=11087
+  _globals['_EXCLUDEDMODULES']._serialized_end=11471
   _globals['_POSITION']._serialized_start=310
   _globals['_POSITION']._serialized_end=1231
   _globals['_POSITION_LOCSOURCE']._serialized_start=926
@@ -60,62 +60,66 @@
   _globals['_DATA']._serialized_end=2362
   _globals['_KEYVERIFICATION']._serialized_start=2364
   _globals['_KEYVERIFICATION']._serialized_end=2426
-  _globals['_WAYPOINT']._serialized_start=2429
-  _globals['_WAYPOINT']._serialized_end=2617
-  _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_start=2619
-  _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_end=2727
-  _globals['_MESHPACKET']._serialized_start=2730
-  _globals['_MESHPACKET']._serialized_end=3715
-  _globals['_MESHPACKET_PRIORITY']._serialized_start=3292
-  _globals['_MESHPACKET_PRIORITY']._serialized_end=3418
-  _globals['_MESHPACKET_DELAYED']._serialized_start=3420
-  _globals['_MESHPACKET_DELAYED']._serialized_end=3486
-  _globals['_MESHPACKET_TRANSPORTMECHANISM']._serialized_start=3489
-  _globals['_MESHPACKET_TRANSPORTMECHANISM']._serialized_end=3696
-  _globals['_NODEINFO']._serialized_start=3718
-  _globals['_NODEINFO']._serialized_end=4072
-  _globals['_MYNODEINFO']._serialized_start=4075
-  _globals['_MYNODEINFO']._serialized_end=4277
-  _globals['_LOGRECORD']._serialized_start=4280
-  _globals['_LOGRECORD']._serialized_end=4481
-  _globals['_LOGRECORD_LEVEL']._serialized_start=4393
-  _globals['_LOGRECORD_LEVEL']._serialized_end=4481
-  _globals['_QUEUESTATUS']._serialized_start=4483
-  _globals['_QUEUESTATUS']._serialized_end=4563
-  _globals['_FROMRADIO']._serialized_start=4566
-  _globals['_FROMRADIO']._serialized_end=5453
-  _globals['_CLIENTNOTIFICATION']._serialized_start=5456
-  _globals['_CLIENTNOTIFICATION']._serialized_end=6016
-  _globals['_KEYVERIFICATIONNUMBERINFORM']._serialized_start=6018
-  _globals['_KEYVERIFICATIONNUMBERINFORM']._serialized_end=6112
-  _globals['_KEYVERIFICATIONNUMBERREQUEST']._serialized_start=6114
-  _globals['_KEYVERIFICATIONNUMBERREQUEST']._serialized_end=6184
-  _globals['_KEYVERIFICATIONFINAL']._serialized_start=6186
-  _globals['_KEYVERIFICATIONFINAL']._serialized_end=6299
-  _globals['_DUPLICATEDPUBLICKEY']._serialized_start=6301
-  _globals['_DUPLICATEDPUBLICKEY']._serialized_end=6322
-  _globals['_LOWENTROPYKEY']._serialized_start=6324
-  _globals['_LOWENTROPYKEY']._serialized_end=6339
-  _globals['_FILEINFO']._serialized_start=6341
-  _globals['_FILEINFO']._serialized_end=6390
-  _globals['_TORADIO']._serialized_start=6393
-  _globals['_TORADIO']._serialized_end=6705
-  _globals['_COMPRESSED']._serialized_start=6707
-  _globals['_COMPRESSED']._serialized_end=6780
-  _globals['_NEIGHBORINFO']._serialized_start=6783
-  _globals['_NEIGHBORINFO']._serialized_end=6927
-  _globals['_NEIGHBOR']._serialized_start=6929
-  _globals['_NEIGHBOR']._serialized_end=7029
-  _globals['_DEVICEMETADATA']._serialized_start=7032
-  _globals['_DEVICEMETADATA']._serialized_end=7393
-  _globals['_HEARTBEAT']._serialized_start=7395
-  _globals['_HEARTBEAT']._serialized_end=7421
-  _globals['_NODEREMOTEHARDWAREPIN']._serialized_start=7423
-  _globals['_NODEREMOTEHARDWAREPIN']._serialized_end=7517
-  _globals['_CHUNKEDPAYLOAD']._serialized_start=7519
-  _globals['_CHUNKEDPAYLOAD']._serialized_end=7620
-  _globals['_RESEND_CHUNKS']._serialized_start=7622
-  _globals['_RESEND_CHUNKS']._serialized_end=7653
-  _globals['_CHUNKEDPAYLOADRESPONSE']._serialized_start=7656
-  _globals['_CHUNKEDPAYLOADRESPONSE']._serialized_end=7835
+  _globals['_STOREFORWARDPLUSPLUS']._serialized_start=2429
+  _globals['_STOREFORWARDPLUSPLUS']._serialized_end=2876
+  _globals['_STOREFORWARDPLUSPLUS_SFPP_MESSAGE_TYPE']._serialized_start=2727
+  _globals['_STOREFORWARDPLUSPLUS_SFPP_MESSAGE_TYPE']._serialized_end=2876
+  _globals['_WAYPOINT']._serialized_start=2879
+  _globals['_WAYPOINT']._serialized_end=3067
+  _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_start=3069
+  _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_end=3177
+  _globals['_MESHPACKET']._serialized_start=3180
+  _globals['_MESHPACKET']._serialized_end=4165
+  _globals['_MESHPACKET_PRIORITY']._serialized_start=3742
+  _globals['_MESHPACKET_PRIORITY']._serialized_end=3868
+  _globals['_MESHPACKET_DELAYED']._serialized_start=3870
+  _globals['_MESHPACKET_DELAYED']._serialized_end=3936
+  _globals['_MESHPACKET_TRANSPORTMECHANISM']._serialized_start=3939
+  _globals['_MESHPACKET_TRANSPORTMECHANISM']._serialized_end=4146
+  _globals['_NODEINFO']._serialized_start=4168
+  _globals['_NODEINFO']._serialized_end=4522
+  _globals['_MYNODEINFO']._serialized_start=4525
+  _globals['_MYNODEINFO']._serialized_end=4727
+  _globals['_LOGRECORD']._serialized_start=4730
+  _globals['_LOGRECORD']._serialized_end=4931
+  _globals['_LOGRECORD_LEVEL']._serialized_start=4843
+  _globals['_LOGRECORD_LEVEL']._serialized_end=4931
+  _globals['_QUEUESTATUS']._serialized_start=4933
+  _globals['_QUEUESTATUS']._serialized_end=5013
+  _globals['_FROMRADIO']._serialized_start=5016
+  _globals['_FROMRADIO']._serialized_end=5903
+  _globals['_CLIENTNOTIFICATION']._serialized_start=5906
+  _globals['_CLIENTNOTIFICATION']._serialized_end=6466
+  _globals['_KEYVERIFICATIONNUMBERINFORM']._serialized_start=6468
+  _globals['_KEYVERIFICATIONNUMBERINFORM']._serialized_end=6562
+  _globals['_KEYVERIFICATIONNUMBERREQUEST']._serialized_start=6564
+  _globals['_KEYVERIFICATIONNUMBERREQUEST']._serialized_end=6634
+  _globals['_KEYVERIFICATIONFINAL']._serialized_start=6636
+  _globals['_KEYVERIFICATIONFINAL']._serialized_end=6749
+  _globals['_DUPLICATEDPUBLICKEY']._serialized_start=6751
+  _globals['_DUPLICATEDPUBLICKEY']._serialized_end=6772
+  _globals['_LOWENTROPYKEY']._serialized_start=6774
+  _globals['_LOWENTROPYKEY']._serialized_end=6789
+  _globals['_FILEINFO']._serialized_start=6791
+  _globals['_FILEINFO']._serialized_end=6840
+  _globals['_TORADIO']._serialized_start=6843
+  _globals['_TORADIO']._serialized_end=7155
+  _globals['_COMPRESSED']._serialized_start=7157
+  _globals['_COMPRESSED']._serialized_end=7230
+  _globals['_NEIGHBORINFO']._serialized_start=7233
+  _globals['_NEIGHBORINFO']._serialized_end=7377
+  _globals['_NEIGHBOR']._serialized_start=7379
+  _globals['_NEIGHBOR']._serialized_end=7479
+  _globals['_DEVICEMETADATA']._serialized_start=7482
+  _globals['_DEVICEMETADATA']._serialized_end=7843
+  _globals['_HEARTBEAT']._serialized_start=7845
+  _globals['_HEARTBEAT']._serialized_end=7871
+  _globals['_NODEREMOTEHARDWAREPIN']._serialized_start=7873
+  _globals['_NODEREMOTEHARDWAREPIN']._serialized_end=7967
+  _globals['_CHUNKEDPAYLOAD']._serialized_start=7969
+  _globals['_CHUNKEDPAYLOAD']._serialized_end=8070
+  _globals['_RESEND_CHUNKS']._serialized_start=8072
+  _globals['_RESEND_CHUNKS']._serialized_end=8103
+  _globals['_CHUNKEDPAYLOADRESPONSE']._serialized_start=8106
+  _globals['_CHUNKEDPAYLOADRESPONSE']._serialized_end=8285
 # @@protoc_insertion_point(module_scope)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/meshtastic-2.7.4/meshtastic/protobuf/mesh_pb2.pyi 
new/meshtastic-2.7.6/meshtastic/protobuf/mesh_pb2.pyi
--- old/meshtastic-2.7.4/meshtastic/protobuf/mesh_pb2.pyi       1970-01-01 
01:00:00.000000000 +0100
+++ new/meshtastic-2.7.6/meshtastic/protobuf/mesh_pb2.pyi       1970-01-01 
01:00:00.000000000 +0100
@@ -421,9 +421,9 @@
     """
     Heltec HRI-3621 industrial probe
     """
-    RESERVED_FRIED_CHICKEN: _HardwareModel.ValueType  # 93
+    MUZI_BASE: _HardwareModel.ValueType  # 93
     """
-    Reserved Fried Chicken ID for future use
+    Muzi Works Muzi-Base device
     """
     HELTEC_MESH_POCKET: _HardwareModel.ValueType  # 94
     """
@@ -523,6 +523,18 @@
     """
     RAK3401
     """
+    RAK6421: _HardwareModel.ValueType  # 118
+    """
+    RAK6421 Hat+
+    """
+    THINKNODE_M4: _HardwareModel.ValueType  # 119
+    """
+    Elecrow ThinkNode M4
+    """
+    THINKNODE_M6: _HardwareModel.ValueType  # 120
+    """
+    Elecrow ThinkNode M6
+    """
     PRIVATE_HW: _HardwareModel.ValueType  # 255
     """
     
------------------------------------------------------------------------------------------------------------------------------------------
@@ -927,9 +939,9 @@
 """
 Heltec HRI-3621 industrial probe
 """
-RESERVED_FRIED_CHICKEN: HardwareModel.ValueType  # 93
+MUZI_BASE: HardwareModel.ValueType  # 93
 """
-Reserved Fried Chicken ID for future use
+Muzi Works Muzi-Base device
 """
 HELTEC_MESH_POCKET: HardwareModel.ValueType  # 94
 """
@@ -1029,6 +1041,18 @@
 """
 RAK3401
 """
+RAK6421: HardwareModel.ValueType  # 118
+"""
+RAK6421 Hat+
+"""
+THINKNODE_M4: HardwareModel.ValueType  # 119
+"""
+Elecrow ThinkNode M4
+"""
+THINKNODE_M6: HardwareModel.ValueType  # 120
+"""
+Elecrow ThinkNode M6
+"""
 PRIVATE_HW: HardwareModel.ValueType  # 255
 """
 
------------------------------------------------------------------------------------------------------------------------------------------
@@ -2180,6 +2204,137 @@
 global___KeyVerification = KeyVerification
 
 @typing.final
+class StoreForwardPlusPlus(google.protobuf.message.Message):
+    """
+    The actual over-the-mesh message doing store and forward++
+    """
+
+    DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+    class _SFPP_message_type:
+        ValueType = typing.NewType("ValueType", builtins.int)
+        V: typing_extensions.TypeAlias = ValueType
+
+    class 
_SFPP_message_typeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[StoreForwardPlusPlus._SFPP_message_type.ValueType],
 builtins.type):
+        DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+        CANON_ANNOUNCE: StoreForwardPlusPlus._SFPP_message_type.ValueType  # 0
+        """
+        Send an announcement of the canonical tip of a chain
+        """
+        CHAIN_QUERY: StoreForwardPlusPlus._SFPP_message_type.ValueType  # 1
+        """
+        Query whether a specific link is on the chain
+        """
+        LINK_REQUEST: StoreForwardPlusPlus._SFPP_message_type.ValueType  # 3
+        """
+        Request the next link in the chain
+        """
+        LINK_PROVIDE: StoreForwardPlusPlus._SFPP_message_type.ValueType  # 4
+        """
+        Provide a link to add to the chain
+        """
+        LINK_PROVIDE_FIRSTHALF: 
StoreForwardPlusPlus._SFPP_message_type.ValueType  # 5
+        """
+        If we must fragment, send the first half
+        """
+        LINK_PROVIDE_SECONDHALF: 
StoreForwardPlusPlus._SFPP_message_type.ValueType  # 6
+        """
+        If we must fragment, send the second half
+        """
+
+    class SFPP_message_type(_SFPP_message_type, 
metaclass=_SFPP_message_typeEnumTypeWrapper):
+        """
+        Enum of message types
+        """
+
+    CANON_ANNOUNCE: StoreForwardPlusPlus.SFPP_message_type.ValueType  # 0
+    """
+    Send an announcement of the canonical tip of a chain
+    """
+    CHAIN_QUERY: StoreForwardPlusPlus.SFPP_message_type.ValueType  # 1
+    """
+    Query whether a specific link is on the chain
+    """
+    LINK_REQUEST: StoreForwardPlusPlus.SFPP_message_type.ValueType  # 3
+    """
+    Request the next link in the chain
+    """
+    LINK_PROVIDE: StoreForwardPlusPlus.SFPP_message_type.ValueType  # 4
+    """
+    Provide a link to add to the chain
+    """
+    LINK_PROVIDE_FIRSTHALF: StoreForwardPlusPlus.SFPP_message_type.ValueType  
# 5
+    """
+    If we must fragment, send the first half
+    """
+    LINK_PROVIDE_SECONDHALF: StoreForwardPlusPlus.SFPP_message_type.ValueType  
# 6
+    """
+    If we must fragment, send the second half
+    """
+
+    SFPP_MESSAGE_TYPE_FIELD_NUMBER: builtins.int
+    MESSAGE_HASH_FIELD_NUMBER: builtins.int
+    COMMIT_HASH_FIELD_NUMBER: builtins.int
+    ROOT_HASH_FIELD_NUMBER: builtins.int
+    MESSAGE_FIELD_NUMBER: builtins.int
+    ENCAPSULATED_ID_FIELD_NUMBER: builtins.int
+    ENCAPSULATED_TO_FIELD_NUMBER: builtins.int
+    ENCAPSULATED_FROM_FIELD_NUMBER: builtins.int
+    ENCAPSULATED_RXTIME_FIELD_NUMBER: builtins.int
+    sfpp_message_type: 
global___StoreForwardPlusPlus.SFPP_message_type.ValueType
+    """
+    Which message type is this
+    """
+    message_hash: builtins.bytes
+    """
+    The hash of the specific message
+    """
+    commit_hash: builtins.bytes
+    """
+    The hash of a link on a chain
+    """
+    root_hash: builtins.bytes
+    """
+    the root hash of a chain
+    """
+    message: builtins.bytes
+    """
+    The encrypted bytes from a message
+    """
+    encapsulated_id: builtins.int
+    """
+    Message ID of the contained message
+    """
+    encapsulated_to: builtins.int
+    """
+    Destination of the contained message
+    """
+    encapsulated_from: builtins.int
+    """
+    Sender of the contained message
+    """
+    encapsulated_rxtime: builtins.int
+    """
+    The receive time of the message in question
+    """
+    def __init__(
+        self,
+        *,
+        sfpp_message_type: 
global___StoreForwardPlusPlus.SFPP_message_type.ValueType = ...,
+        message_hash: builtins.bytes = ...,
+        commit_hash: builtins.bytes = ...,
+        root_hash: builtins.bytes = ...,
+        message: builtins.bytes = ...,
+        encapsulated_id: builtins.int = ...,
+        encapsulated_to: builtins.int = ...,
+        encapsulated_from: builtins.int = ...,
+        encapsulated_rxtime: builtins.int = ...,
+    ) -> None: ...
+    def ClearField(self, field_name: typing.Literal["commit_hash", 
b"commit_hash", "encapsulated_from", b"encapsulated_from", "encapsulated_id", 
b"encapsulated_id", "encapsulated_rxtime", b"encapsulated_rxtime", 
"encapsulated_to", b"encapsulated_to", "message", b"message", "message_hash", 
b"message_hash", "root_hash", b"root_hash", "sfpp_message_type", 
b"sfpp_message_type"]) -> None: ...
+
+global___StoreForwardPlusPlus = StoreForwardPlusPlus
+
[email protected]
 class Waypoint(google.protobuf.message.Message):
     """
     Waypoint message, used to share arbitrary locations across the mesh
@@ -2557,6 +2712,10 @@
     to: builtins.int
     """
     The (immediate) destination for this packet
+    If the value is 4,294,967,295 (maximum value of an unsigned 32bit 
integer), this indicates that the packet was
+    not destined for a specific node, but for a channel as indicated by the 
value of `channel` below.
+    If the value is another, this indicates that the packet was destined for a 
specific
+    node (i.e. a kind of "Direct Message" to this node) and not broadcast on a 
channel.
     """
     channel: builtins.int
     """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/meshtastic-2.7.4/meshtastic/protobuf/portnums_pb2.py 
new/meshtastic-2.7.6/meshtastic/protobuf/portnums_pb2.py
--- old/meshtastic-2.7.4/meshtastic/protobuf/portnums_pb2.py    1970-01-01 
01:00:00.000000000 +0100
+++ new/meshtastic-2.7.6/meshtastic/protobuf/portnums_pb2.py    1970-01-01 
01:00:00.000000000 +0100
@@ -13,7 +13,7 @@
 
 
 
-DESCRIPTOR = 
_descriptor_pool.Default().AddSerializedFile(b'\n\"meshtastic/protobuf/portnums.proto\x12\x13meshtastic.protobuf*\xf6\x04\n\x07PortNum\x12\x0f\n\x0bUNKNOWN_APP\x10\x00\x12\x14\n\x10TEXT_MESSAGE_APP\x10\x01\x12\x17\n\x13REMOTE_HARDWARE_APP\x10\x02\x12\x10\n\x0cPOSITION_APP\x10\x03\x12\x10\n\x0cNODEINFO_APP\x10\x04\x12\x0f\n\x0bROUTING_APP\x10\x05\x12\r\n\tADMIN_APP\x10\x06\x12\x1f\n\x1bTEXT_MESSAGE_COMPRESSED_APP\x10\x07\x12\x10\n\x0cWAYPOINT_APP\x10\x08\x12\r\n\tAUDIO_APP\x10\t\x12\x18\n\x14\x44\x45TECTION_SENSOR_APP\x10\n\x12\r\n\tALERT_APP\x10\x0b\x12\x18\n\x14KEY_VERIFICATION_APP\x10\x0c\x12\r\n\tREPLY_APP\x10
 
\x12\x11\n\rIP_TUNNEL_APP\x10!\x12\x12\n\x0ePAXCOUNTER_APP\x10\"\x12\x0e\n\nSERIAL_APP\x10@\x12\x15\n\x11STORE_FORWARD_APP\x10\x41\x12\x12\n\x0eRANGE_TEST_APP\x10\x42\x12\x11\n\rTELEMETRY_APP\x10\x43\x12\x0b\n\x07ZPS_APP\x10\x44\x12\x11\n\rSIMULATOR_APP\x10\x45\x12\x12\n\x0eTRACEROUTE_APP\x10\x46\x12\x14\n\x10NEIGHBORINFO_APP\x10G\x12\x0f\n\x0b\x41TAK_PLUGIN\x1
 
0H\x12\x12\n\x0eMAP_REPORT_APP\x10I\x12\x13\n\x0fPOWERSTRESS_APP\x10J\x12\x18\n\x14RETICULUM_TUNNEL_APP\x10L\x12\x0f\n\x0b\x43\x41YENNE_APP\x10M\x12\x10\n\x0bPRIVATE_APP\x10\x80\x02\x12\x13\n\x0e\x41TAK_FORWARDER\x10\x81\x02\x12\x08\n\x03MAX\x10\xff\x03\x42^\n\x14org.meshtastic.protoB\x08PortnumsZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = 
_descriptor_pool.Default().AddSerializedFile(b'\n\"meshtastic/protobuf/portnums.proto\x12\x13meshtastic.protobuf*\x96\x05\n\x07PortNum\x12\x0f\n\x0bUNKNOWN_APP\x10\x00\x12\x14\n\x10TEXT_MESSAGE_APP\x10\x01\x12\x17\n\x13REMOTE_HARDWARE_APP\x10\x02\x12\x10\n\x0cPOSITION_APP\x10\x03\x12\x10\n\x0cNODEINFO_APP\x10\x04\x12\x0f\n\x0bROUTING_APP\x10\x05\x12\r\n\tADMIN_APP\x10\x06\x12\x1f\n\x1bTEXT_MESSAGE_COMPRESSED_APP\x10\x07\x12\x10\n\x0cWAYPOINT_APP\x10\x08\x12\r\n\tAUDIO_APP\x10\t\x12\x18\n\x14\x44\x45TECTION_SENSOR_APP\x10\n\x12\r\n\tALERT_APP\x10\x0b\x12\x18\n\x14KEY_VERIFICATION_APP\x10\x0c\x12\r\n\tREPLY_APP\x10
 
\x12\x11\n\rIP_TUNNEL_APP\x10!\x12\x12\n\x0ePAXCOUNTER_APP\x10\"\x12\x1e\n\x1aSTORE_FORWARD_PLUSPLUS_APP\x10#\x12\x0e\n\nSERIAL_APP\x10@\x12\x15\n\x11STORE_FORWARD_APP\x10\x41\x12\x12\n\x0eRANGE_TEST_APP\x10\x42\x12\x11\n\rTELEMETRY_APP\x10\x43\x12\x0b\n\x07ZPS_APP\x10\x44\x12\x11\n\rSIMULATOR_APP\x10\x45\x12\x12\n\x0eTRACEROUTE_APP\x10\x46\x12\x14\n\x10NEIGHBO
 
RINFO_APP\x10G\x12\x0f\n\x0b\x41TAK_PLUGIN\x10H\x12\x12\n\x0eMAP_REPORT_APP\x10I\x12\x13\n\x0fPOWERSTRESS_APP\x10J\x12\x18\n\x14RETICULUM_TUNNEL_APP\x10L\x12\x0f\n\x0b\x43\x41YENNE_APP\x10M\x12\x10\n\x0bPRIVATE_APP\x10\x80\x02\x12\x13\n\x0e\x41TAK_FORWARDER\x10\x81\x02\x12\x08\n\x03MAX\x10\xff\x03\x42^\n\x14org.meshtastic.protoB\x08PortnumsZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
 
 _globals = globals()
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -22,5 +22,5 @@
   DESCRIPTOR._options = None
   DESCRIPTOR._serialized_options = 
b'\n\024org.meshtastic.protoB\010PortnumsZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
   _globals['_PORTNUM']._serialized_start=60
-  _globals['_PORTNUM']._serialized_end=690
+  _globals['_PORTNUM']._serialized_end=722
 # @@protoc_insertion_point(module_scope)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/meshtastic-2.7.4/meshtastic/protobuf/portnums_pb2.pyi 
new/meshtastic-2.7.6/meshtastic/protobuf/portnums_pb2.pyi
--- old/meshtastic-2.7.4/meshtastic/protobuf/portnums_pb2.pyi   1970-01-01 
01:00:00.000000000 +0100
+++ new/meshtastic-2.7.6/meshtastic/protobuf/portnums_pb2.pyi   1970-01-01 
01:00:00.000000000 +0100
@@ -117,6 +117,13 @@
     Paxcounter lib included in the firmware
     ENCODING: protobuf
     """
+    STORE_FORWARD_PLUSPLUS_APP: _PortNum.ValueType  # 35
+    """
+    Store and Forward++ module included in the firmware
+    ENCODING: protobuf
+    This module is specifically for Native Linux nodes, and provides a 
Git-style
+    chain of messages.
+    """
     SERIAL_APP: _PortNum.ValueType  # 64
     """
     Provides a hardware serial interface to send and receive from the 
Meshtastic network.
@@ -321,6 +328,13 @@
 Paxcounter lib included in the firmware
 ENCODING: protobuf
 """
+STORE_FORWARD_PLUSPLUS_APP: PortNum.ValueType  # 35
+"""
+Store and Forward++ module included in the firmware
+ENCODING: protobuf
+This module is specifically for Native Linux nodes, and provides a Git-style
+chain of messages.
+"""
 SERIAL_APP: PortNum.ValueType  # 64
 """
 Provides a hardware serial interface to send and receive from the Meshtastic 
network.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/meshtastic-2.7.4/meshtastic/serial_interface.py 
new/meshtastic-2.7.6/meshtastic/serial_interface.py
--- old/meshtastic-2.7.4/meshtastic/serial_interface.py 1970-01-01 
01:00:00.000000000 +0100
+++ new/meshtastic-2.7.6/meshtastic/serial_interface.py 1970-01-01 
01:00:00.000000000 +0100
@@ -94,16 +94,10 @@
 
     def close(self) -> None:
         """Close a connection to the device"""
-        if hasattr(self, "stream") and self.stream and getattr(self.stream, 
"is_open", False):
-            try:
-                self.stream.flush()
-                time.sleep(0.1)
-            except Exception as e:
-                logger.debug(f"Exception during flush: {e}")
-            try:
-                self.stream.close()
-            except Exception as e:
-                logger.debug(f"Exception during close: {e}")
-            self.stream = None
+        if self.stream:  # Stream can be null if we were already closed
+            self.stream.flush()  # FIXME: why are there these  two flushes 
with 100ms sleeps?  This shouldn't be necessary
+            time.sleep(0.1)
+            self.stream.flush()
+            time.sleep(0.1)
         logger.debug("Closing Serial stream")
         StreamInterface.close(self)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/meshtastic-2.7.4/meshtastic/util.py 
new/meshtastic-2.7.6/meshtastic/util.py
--- old/meshtastic-2.7.4/meshtastic/util.py     1970-01-01 01:00:00.000000000 
+0100
+++ new/meshtastic-2.7.6/meshtastic/util.py     1970-01-01 01:00:00.000000000 
+0100
@@ -735,3 +735,16 @@
         return int(s, 10)
     except ValueError:
         return int(s, 16)
+
+def flags_to_list(flag_type, flags: int) -> List[str]:
+    """Given a flag_type that's a protobuf EnumTypeWrapper, and a flag int, 
give a list of flags enabled."""
+    ret = []
+    for key in flag_type.keys():
+        if key == "EXCLUDED_NONE":
+            continue
+        if flags & flag_type.Value(key):
+            ret.append(key)
+            flags = flags - flag_type.Value(key)
+    if flags > 0:
+        ret.append(f"UNKNOWN_ADDITIONAL_FLAGS({flags})")
+    return ret
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/meshtastic-2.7.4/pyproject.toml 
new/meshtastic-2.7.6/pyproject.toml
--- old/meshtastic-2.7.4/pyproject.toml 1970-01-01 01:00:00.000000000 +0100
+++ new/meshtastic-2.7.6/pyproject.toml 1970-01-01 01:00:00.000000000 +0100
@@ -1,20 +1,20 @@
 [tool.poetry]
 name = "meshtastic"
-version = "2.7.4"
+version = "2.7.6"
 description = "Python API & client shell for talking to Meshtastic devices"
 authors = ["Meshtastic Developers <[email protected]>"]
 license = "GPL-3.0-only"
 readme = "README.md"
 
 [tool.poetry.dependencies]
-python = "^3.9,<3.14"                                               # 3.9 is 
needed for pandas, bleak requires <3.14
+python = "^3.9,<3.15"                                               # 3.9 is 
needed for pandas
 pyserial = "^3.5"
 protobuf = ">=4.21.12"
 tabulate = "^0.9.0"
 requests = "^2.31.0"
 pyyaml = "^6.0.1"
 pypubsub = "^4.0.3"
-bleak = "^0.22.3"
+bleak = ">=0.22.3"
 packaging = "^24.0"
 argcomplete = { version = "^3.5.2", optional = true }
 pyqrcode = { version = "^1.2.1", optional = true }
@@ -34,7 +34,7 @@
 pdoc3 = "^0.10.0"
 autopep8 = "^2.1.0"
 pylint = "^3.2.3"
-pyinstaller = "^6.8.0"
+pyinstaller = "^6.10.0"
 mypy = "^1.10.0"
 mypy-protobuf = "^3.3.0"
 types-protobuf = "^5.26.0.20240422"

Reply via email to