Full Code of eclipse/tahu for AI

master 5736e404889d cached
228 files
2.3 MB
615.0k tokens
3709 symbols
1 requests
Download .txt
Showing preview only (2,461K chars total). Download the full file or copy to clipboard to get everything.
Repository: eclipse/tahu
Branch: master
Commit: 5736e404889d
Files: 228
Total size: 2.3 MB

Directory structure:
gitextract_k27y6kok/

├── .gitignore
├── LICENCE
├── README.md
├── RELEASE_NOTES.md
├── about.html
├── c/
│   ├── core/
│   │   ├── Makefile
│   │   ├── include/
│   │   │   ├── pb.h
│   │   │   ├── pb_common.h
│   │   │   ├── pb_decode.h
│   │   │   ├── pb_encode.h
│   │   │   ├── tahu.h
│   │   │   └── tahu.pb.h
│   │   ├── readme.txt
│   │   ├── src/
│   │   │   ├── pb_common.c
│   │   │   ├── pb_decode.c
│   │   │   ├── pb_encode.c
│   │   │   ├── tahu.c
│   │   │   ├── tahu.pb
│   │   │   └── tahu.pb.c
│   │   ├── tahu.options
│   │   ├── test/
│   │   │   ├── .gitignore
│   │   │   └── test.c
│   │   └── test.sh
│   └── examples/
│       ├── template_as_custom_props/
│       │   ├── Makefile
│       │   └── example.c
│       └── udt_example/
│           ├── Makefile
│           └── example.c
├── c_sharp/
│   └── core/
│       ├── readme.txt
│       └── src/
│           └── SparkplugBCSharp.cs
├── edl-v10.html
├── epl-v20.html
├── java/
│   ├── .gitignore
│   ├── README.md
│   ├── compat_impl/
│   │   ├── edge/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── org/
│   │   │           │       └── eclipse/
│   │   │           │           └── tahu/
│   │   │           │               └── edge/
│   │   │           │                   ├── CommandCallback.java
│   │   │           │                   ├── CommandListener.java
│   │   │           │                   ├── PeriodicPublisher.java
│   │   │           │                   ├── SparkplugEdgeNode.java
│   │   │           │                   └── sim/
│   │   │           │                       ├── DataSimulator.java
│   │   │           │                       └── RandomDataSimulator.java
│   │   │           └── resources/
│   │   │               └── logback.xml
│   │   └── host/
│   │       ├── pom.xml
│   │       └── src/
│   │           └── main/
│   │               ├── java/
│   │               │   └── org/
│   │               │       └── eclipse/
│   │               │           └── tahu/
│   │               │               └── host/
│   │               │                   ├── CommandListener.java
│   │               │                   └── SparkplugHostApplication.java
│   │               └── resources/
│   │                   ├── logback.out.xml
│   │                   └── logback.xml
│   ├── examples/
│   │   ├── device_timestamp/
│   │   │   ├── THIRD-PARTY.txt
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── org/
│   │   │                   └── eclipse/
│   │   │                       └── tahu/
│   │   │                           └── SparkplugExample.java
│   │   ├── edge_node_control/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── org/
│   │   │                   └── eclipse/
│   │   │                       └── tahu/
│   │   │                           └── SparkplugExample.java
│   │   ├── host_file/
│   │   │   ├── THIRD-PARTY.txt
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── org/
│   │   │                   └── eclipse/
│   │   │                       └── tahu/
│   │   │                           └── example/
│   │   │                               └── host/
│   │   │                                   └── file/
│   │   │                                       ├── FileAssembler.java
│   │   │                                       ├── Publisher.java
│   │   │                                       ├── SparkplugExample.java
│   │   │                                       ├── model/
│   │   │                                       │   ├── EdgeNode.java
│   │   │                                       │   └── FilePublishStatus.java
│   │   │                                       └── util/
│   │   │                                           └── FileValidationUtils.java
│   │   ├── listener/
│   │   │   ├── THIRD-PARTY.txt
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── org/
│   │   │           │       └── eclipse/
│   │   │           │           └── tahu/
│   │   │           │               └── SparkplugListener.java
│   │   │           └── resources/
│   │   │               └── log4j.properties
│   │   ├── pom.xml
│   │   ├── raspberry_pi/
│   │   │   ├── THIRD-PARTY.txt
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── org/
│   │   │                   └── eclipse/
│   │   │                       └── tahu/
│   │   │                           ├── SparkplugRaspberryPiExample.java
│   │   │                           ├── pi/
│   │   │                           │   ├── dio/
│   │   │                           │   │   ├── DigitalOutputPin.java
│   │   │                           │   │   ├── DioException.java
│   │   │                           │   │   ├── DioLibrary.java
│   │   │                           │   │   ├── DioPin.java
│   │   │                           │   │   ├── PinDirection.java
│   │   │                           │   │   └── Pins.java
│   │   │                           │   └── system/
│   │   │                           │       ├── BoardModels.java
│   │   │                           │       ├── SystemInfo.java
│   │   │                           │       └── SystemInfoException.java
│   │   │                           └── pibrella/
│   │   │                               ├── Pibrella.java
│   │   │                               ├── PibrellaButton.java
│   │   │                               ├── PibrellaBuzzer.java
│   │   │                               ├── PibrellaInputPin.java
│   │   │                               ├── PibrellaInputPins.java
│   │   │                               ├── PibrellaLED.java
│   │   │                               ├── PibrellaLEDs.java
│   │   │                               ├── PibrellaOutputPin.java
│   │   │                               ├── PibrellaOutputPins.java
│   │   │                               └── PibrellaPins.java
│   │   ├── records/
│   │   │   ├── THIRD-PARTY.txt
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── org/
│   │   │                   └── eclipse/
│   │   │                       └── tahu/
│   │   │                           └── SparkplugRecordsExample.java
│   │   ├── simple/
│   │   │   ├── THIRD-PARTY.txt
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── org/
│   │   │                   └── eclipse/
│   │   │                       └── tahu/
│   │   │                           └── SparkplugExample.java
│   │   └── udt/
│   │       ├── pom.xml
│   │       └── src/
│   │           └── main/
│   │               └── java/
│   │                   └── org/
│   │                       └── eclipse/
│   │                           └── tahu/
│   │                               └── SparkplugExample.java
│   ├── lib/
│   │   ├── core/
│   │   │   ├── pom.xml
│   │   │   ├── readme.txt
│   │   │   └── src/
│   │   │       ├── main/
│   │   │       │   ├── java/
│   │   │       │   │   └── org/
│   │   │       │   │       └── eclipse/
│   │   │       │   │           └── tahu/
│   │   │       │   │               ├── SparkplugException.java
│   │   │       │   │               ├── SparkplugInvalidTypeException.java
│   │   │       │   │               ├── SparkplugParsingException.java
│   │   │       │   │               ├── exception/
│   │   │       │   │               │   ├── TahuErrorCode.java
│   │   │       │   │               │   └── TahuException.java
│   │   │       │   │               ├── json/
│   │   │       │   │               │   ├── DataSetDeserializer.java
│   │   │       │   │               │   ├── DeserializerModifier.java
│   │   │       │   │               │   ├── DeserializerModule.java
│   │   │       │   │               │   ├── FileSerializer.java
│   │   │       │   │               │   ├── JsonValidator.java
│   │   │       │   │               │   ├── MetricDeserializer.java
│   │   │       │   │               │   ├── PropertySetDeserializer.java
│   │   │       │   │               │   └── TemplateDeserializer.java
│   │   │       │   │               ├── message/
│   │   │       │   │               │   ├── BdSeqManager.java
│   │   │       │   │               │   ├── DefaultBdSeqManager.java
│   │   │       │   │               │   ├── PayloadDecoder.java
│   │   │       │   │               │   ├── PayloadEncoder.java
│   │   │       │   │               │   ├── SparkplugBPayloadDecoder.java
│   │   │       │   │               │   ├── SparkplugBPayloadEncoder.java
│   │   │       │   │               │   └── model/
│   │   │       │   │               │       ├── DataSet.java
│   │   │       │   │               │       ├── DataSetDataType.java
│   │   │       │   │               │       ├── DeviceDescriptor.java
│   │   │       │   │               │       ├── EdgeNodeDescriptor.java
│   │   │       │   │               │       ├── File.java
│   │   │       │   │               │       ├── Message.java
│   │   │       │   │               │       ├── MessageType.java
│   │   │       │   │               │       ├── MetaData.java
│   │   │       │   │               │       ├── Metric.java
│   │   │       │   │               │       ├── MetricDataType.java
│   │   │       │   │               │       ├── Parameter.java
│   │   │       │   │               │       ├── ParameterDataType.java
│   │   │       │   │               │       ├── Property.java
│   │   │       │   │               │       ├── PropertyDataType.java
│   │   │       │   │               │       ├── PropertySet.java
│   │   │       │   │               │       ├── PropertyValue.java
│   │   │       │   │               │       ├── Quality.java
│   │   │       │   │               │       ├── Row.java
│   │   │       │   │               │       ├── SparkplugBPayload.java
│   │   │       │   │               │       ├── SparkplugBPayloadMap.java
│   │   │       │   │               │       ├── SparkplugDescriptor.java
│   │   │       │   │               │       ├── SparkplugMeta.java
│   │   │       │   │               │       ├── StatePayload.java
│   │   │       │   │               │       ├── Template.java
│   │   │       │   │               │       ├── TemplateMap.java
│   │   │       │   │               │       ├── Topic.java
│   │   │       │   │               │       └── Value.java
│   │   │       │   │               ├── model/
│   │   │       │   │               │   ├── MetricDataTypeMap.java
│   │   │       │   │               │   ├── MetricMap.java
│   │   │       │   │               │   └── MqttServerDefinition.java
│   │   │       │   │               ├── mqtt/
│   │   │       │   │               │   ├── ClientCallback.java
│   │   │       │   │               │   ├── MqttClientId.java
│   │   │       │   │               │   ├── MqttOperatorDefs.java
│   │   │       │   │               │   ├── MqttServerName.java
│   │   │       │   │               │   ├── MqttServerUrl.java
│   │   │       │   │               │   ├── RandomStartupDelay.java
│   │   │       │   │               │   └── TahuClient.java
│   │   │       │   │               ├── protobuf/
│   │   │       │   │               │   └── SparkplugBProto.java
│   │   │       │   │               └── util/
│   │   │       │   │                   ├── CompressionAlgorithm.java
│   │   │       │   │                   ├── GZipUtil.java
│   │   │       │   │                   ├── MessageUtil.java
│   │   │       │   │                   ├── PayloadUtil.java
│   │   │       │   │                   ├── SparkplugUtil.java
│   │   │       │   │                   ├── TopicUtil.java
│   │   │       │   │                   └── ValidationUtils.java
│   │   │       │   └── resources/
│   │   │       │       ├── logback.xml
│   │   │       │       └── payload.json
│   │   │       └── test/
│   │   │           └── java/
│   │   │               └── org/
│   │   │                   └── eclipse/
│   │   │                       └── tahu/
│   │   │                           ├── message/
│   │   │                           │   └── test/
│   │   │                           │       └── EnDeCodeTest.java
│   │   │                           ├── mqtt/
│   │   │                           │   └── test/
│   │   │                           │       └── MqttServerUrlTest.java
│   │   │                           ├── test/
│   │   │                           │   ├── SequenceTest.java
│   │   │                           │   └── SparkplugTest.java
│   │   │                           └── util/
│   │   │                               ├── MessageUtilTest.java
│   │   │                               └── PayloadUtilTest.java
│   │   ├── edge/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── org/
│   │   │                   └── eclipse/
│   │   │                       └── tahu/
│   │   │                           └── edge/
│   │   │                               ├── EdgeClient.java
│   │   │                               ├── EdgeNodeMetricMaps.java
│   │   │                               └── api/
│   │   │                                   └── MetricHandler.java
│   │   └── host/
│   │       ├── pom.xml
│   │       └── src/
│   │           └── main/
│   │               └── java/
│   │                   └── org/
│   │                       └── eclipse/
│   │                           └── tahu/
│   │                               └── host/
│   │                                   ├── CommandPublisher.java
│   │                                   ├── HostApplication.java
│   │                                   ├── TahuHostCallback.java
│   │                                   ├── TahuPayloadHandler.java
│   │                                   ├── api/
│   │                                   │   └── HostApplicationEventHandler.java
│   │                                   ├── manager/
│   │                                   │   ├── EdgeNodeManager.java
│   │                                   │   ├── MetricManager.java
│   │                                   │   ├── SparkplugDevice.java
│   │                                   │   └── SparkplugEdgeNode.java
│   │                                   ├── model/
│   │                                   │   ├── HostApplicationMetricMap.java
│   │                                   │   ├── HostMetric.java
│   │                                   │   └── MessageContext.java
│   │                                   └── seq/
│   │                                       ├── SequenceReorderContext.java
│   │                                       ├── SequenceReorderManager.java
│   │                                       └── SequenceReorderMap.java
│   └── pom.xml
├── javascript/
│   ├── core/
│   │   ├── node-red-contrib-sparkplug/
│   │   │   ├── README.md
│   │   │   ├── package.json
│   │   │   └── sparkplug/
│   │   │       ├── sparkplug.html
│   │   │       └── sparkplug.js
│   │   ├── node-red-contrib-sparkplug-payload/
│   │   │   ├── README.md
│   │   │   ├── package.json
│   │   │   ├── sparkplug-payload.html
│   │   │   └── sparkplug-payload.js
│   │   ├── sparkplug-client/
│   │   │   ├── .gitignore
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── index.ts
│   │   │   ├── package.json
│   │   │   └── tsconfig.json
│   │   └── sparkplug-payload/
│   │       ├── .gitignore
│   │       ├── README.md
│   │       ├── index.ts
│   │       ├── lib/
│   │       │   └── sparkplugbpayload.ts
│   │       ├── package.json
│   │       └── tsconfig.json
│   └── examples/
│       └── simple/
│           ├── example.js
│           └── package.json
├── nodered/
│   └── examples/
│       ├── emulated-device.js
│       └── package.json
├── notice.html
├── python/
│   ├── core/
│   │   ├── __init__.py
│   │   ├── array_packer.py
│   │   ├── host_session_establishment.py
│   │   ├── readme.md
│   │   ├── sparkplug_b.py
│   │   └── sparkplug_b_pb2.py
│   └── examples/
│       ├── THIRD-PARTY.txt
│       ├── example.py
│       ├── example_datatype.py
│       ├── example_raspberry_pi.py
│       └── example_simple.py
└── sparkplug_b/
    ├── sparkplug_b.json
    ├── sparkplug_b.proto
    └── sparkplug_b_c_sharp.proto

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
target/
bin/
node_modules/
test-output/
license/
dependency-reduced-pom.xml
.settings/
.project
.classpath
javaClientId-tcplocalhost*
javaSimpleEdgeNode-tcplocalhost*
*.o
sparkplug_example
.DS_Store
.pydevproject
*.pyc
*-tcp*
pom.xml.versionsBackup


================================================
FILE: LICENCE
================================================
Eclipse Public License - v 2.0

    THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
    PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION
    OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.

1. DEFINITIONS

"Contribution" means:

  a) in the case of the initial Contributor, the initial content
     Distributed under this Agreement, and

  b) in the case of each subsequent Contributor:
     i) changes to the Program, and
     ii) additions to the Program;
  where such changes and/or additions to the Program originate from
  and are Distributed by that particular Contributor. A Contribution
  "originates" from a Contributor if it was added to the Program by
  such Contributor itself or anyone acting on such Contributor's behalf.
  Contributions do not include changes or additions to the Program that
  are not Modified Works.

"Contributor" means any person or entity that Distributes the Program.

"Licensed Patents" mean patent claims licensable by a Contributor which
are necessarily infringed by the use or sale of its Contribution alone
or when combined with the Program.

"Program" means the Contributions Distributed in accordance with this
Agreement.

"Recipient" means anyone who receives the Program under this Agreement
or any Secondary License (as applicable), including Contributors.

"Derivative Works" shall mean any work, whether in Source Code or other
form, that is based on (or derived from) the Program and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship.

"Modified Works" shall mean any work in Source Code or other form that
results from an addition to, deletion from, or modification of the
contents of the Program, including, for purposes of clarity any new file
in Source Code form that contains any contents of the Program. Modified
Works shall not include works that contain only declarations,
interfaces, types, classes, structures, or files of the Program solely
in each case in order to link to, bind by name, or subclass the Program
or Modified Works thereof.

"Distribute" means the acts of a) distributing or b) making available
in any manner that enables the transfer of a copy.

"Source Code" means the form of a Program preferred for making
modifications, including but not limited to software source code,
documentation source, and configuration files.

"Secondary License" means either the GNU General Public License,
Version 2.0, or any later versions of that license, including any
exceptions or additional permissions as identified by the initial
Contributor.

2. GRANT OF RIGHTS

  a) Subject to the terms of this Agreement, each Contributor hereby
  grants Recipient a non-exclusive, worldwide, royalty-free copyright
  license to reproduce, prepare Derivative Works of, publicly display,
  publicly perform, Distribute and sublicense the Contribution of such
  Contributor, if any, and such Derivative Works.

  b) Subject to the terms of this Agreement, each Contributor hereby
  grants Recipient a non-exclusive, worldwide, royalty-free patent
  license under Licensed Patents to make, use, sell, offer to sell,
  import and otherwise transfer the Contribution of such Contributor,
  if any, in Source Code or other form. This patent license shall
  apply to the combination of the Contribution and the Program if, at
  the time the Contribution is added by the Contributor, such addition
  of the Contribution causes such combination to be covered by the
  Licensed Patents. The patent license shall not apply to any other
  combinations which include the Contribution. No hardware per se is
  licensed hereunder.

  c) Recipient understands that although each Contributor grants the
  licenses to its Contributions set forth herein, no assurances are
  provided by any Contributor that the Program does not infringe the
  patent or other intellectual property rights of any other entity.
  Each Contributor disclaims any liability to Recipient for claims
  brought by any other entity based on infringement of intellectual
  property rights or otherwise. As a condition to exercising the
  rights and licenses granted hereunder, each Recipient hereby
  assumes sole responsibility to secure any other intellectual
  property rights needed, if any. For example, if a third party
  patent license is required to allow Recipient to Distribute the
  Program, it is Recipient's responsibility to acquire that license
  before distributing the Program.

  d) Each Contributor represents that to its knowledge it has
  sufficient copyright rights in its Contribution, if any, to grant
  the copyright license set forth in this Agreement.

  e) Notwithstanding the terms of any Secondary License, no
  Contributor makes additional grants to any Recipient (other than
  those set forth in this Agreement) as a result of such Recipient's
  receipt of the Program under the terms of a Secondary License
  (if permitted under the terms of Section 3).

3. REQUIREMENTS

3.1 If a Contributor Distributes the Program in any form, then:

  a) the Program must also be made available as Source Code, in
  accordance with section 3.2, and the Contributor must accompany
  the Program with a statement that the Source Code for the Program
  is available under this Agreement, and informs Recipients how to
  obtain it in a reasonable manner on or through a medium customarily
  used for software exchange; and

  b) the Contributor may Distribute the Program under a license
  different than this Agreement, provided that such license:
     i) effectively disclaims on behalf of all other Contributors all
     warranties and conditions, express and implied, including
     warranties or conditions of title and non-infringement, and
     implied warranties or conditions of merchantability and fitness
     for a particular purpose;

     ii) effectively excludes on behalf of all other Contributors all
     liability for damages, including direct, indirect, special,
     incidental and consequential damages, such as lost profits;

     iii) does not attempt to limit or alter the recipients' rights
     in the Source Code under section 3.2; and

     iv) requires any subsequent distribution of the Program by any
     party to be under a license that satisfies the requirements
     of this section 3.

3.2 When the Program is Distributed as Source Code:

  a) it must be made available under this Agreement, or if the
  Program (i) is combined with other material in a separate file or
  files made available under a Secondary License, and (ii) the initial
  Contributor attached to the Source Code the notice described in
  Exhibit A of this Agreement, then the Program may be made available
  under the terms of such Secondary Licenses, and

  b) a copy of this Agreement must be included with each copy of
  the Program.

3.3 Contributors may not remove or alter any copyright, patent,
trademark, attribution notices, disclaimers of warranty, or limitations
of liability ("notices") contained within the Program from any copy of
the Program which they Distribute, provided that Contributors may add
their own appropriate notices.

4. COMMERCIAL DISTRIBUTION

Commercial distributors of software may accept certain responsibilities
with respect to end users, business partners and the like. While this
license is intended to facilitate the commercial use of the Program,
the Contributor who includes the Program in a commercial product
offering should do so in a manner which does not create potential
liability for other Contributors. Therefore, if a Contributor includes
the Program in a commercial product offering, such Contributor
("Commercial Contributor") hereby agrees to defend and indemnify every
other Contributor ("Indemnified Contributor") against any losses,
damages and costs (collectively "Losses") arising from claims, lawsuits
and other legal actions brought by a third party against the Indemnified
Contributor to the extent caused by the acts or omissions of such
Commercial Contributor in connection with its distribution of the Program
in a commercial product offering. The obligations in this section do not
apply to any claims or Losses relating to any actual or alleged
intellectual property infringement. In order to qualify, an Indemnified
Contributor must: a) promptly notify the Commercial Contributor in
writing of such claim, and b) allow the Commercial Contributor to control,
and cooperate with the Commercial Contributor in, the defense and any
related settlement negotiations. The Indemnified Contributor may
participate in any such claim at its own expense.

For example, a Contributor might include the Program in a commercial
product offering, Product X. That Contributor is then a Commercial
Contributor. If that Commercial Contributor then makes performance
claims, or offers warranties related to Product X, those performance
claims and warranties are such Commercial Contributor's responsibility
alone. Under this section, the Commercial Contributor would have to
defend claims against the other Contributors related to those performance
claims and warranties, and if a court requires any other Contributor to
pay any damages as a result, the Commercial Contributor must pay
those damages.

5. NO WARRANTY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS"
BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF
TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR
PURPOSE. Each Recipient is solely responsible for determining the
appropriateness of using and distributing the Program and assumes all
risks associated with its exercise of rights under this Agreement,
including but not limited to the risks and costs of program errors,
compliance with applicable laws, damage to or loss of data, programs
or equipment, and unavailability or interruption of operations.

6. DISCLAIMER OF LIABILITY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS
SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

7. GENERAL

If any provision of this Agreement is invalid or unenforceable under
applicable law, it shall not affect the validity or enforceability of
the remainder of the terms of this Agreement, and without further
action by the parties hereto, such provision shall be reformed to the
minimum extent necessary to make such provision valid and enforceable.

If Recipient institutes patent litigation against any entity
(including a cross-claim or counterclaim in a lawsuit) alleging that the
Program itself (excluding combinations of the Program with other software
or hardware) infringes such Recipient's patent(s), then such Recipient's
rights granted under Section 2(b) shall terminate as of the date such
litigation is filed.

All Recipient's rights under this Agreement shall terminate if it
fails to comply with any of the material terms or conditions of this
Agreement and does not cure such failure in a reasonable period of
time after becoming aware of such noncompliance. If all Recipient's
rights under this Agreement terminate, Recipient agrees to cease use
and distribution of the Program as soon as reasonably practicable.
However, Recipient's obligations under this Agreement and any licenses
granted by Recipient relating to the Program shall continue and survive.

Everyone is permitted to copy and distribute copies of this Agreement,
but in order to avoid inconsistency the Agreement is copyrighted and
may only be modified in the following manner. The Agreement Steward
reserves the right to publish new versions (including revisions) of
this Agreement from time to time. No one other than the Agreement
Steward has the right to modify this Agreement. The Eclipse Foundation
is the initial Agreement Steward. The Eclipse Foundation may assign the
responsibility to serve as the Agreement Steward to a suitable separate
entity. Each new version of the Agreement will be given a distinguishing
version number. The Program (including Contributions) may always be
Distributed subject to the version of the Agreement under which it was
received. In addition, after a new version of the Agreement is published,
Contributor may elect to Distribute the Program (including its
Contributions) under the new version.

Except as expressly stated in Sections 2(a) and 2(b) above, Recipient
receives no rights or licenses to the intellectual property of any
Contributor under this Agreement, whether expressly, by implication,
estoppel or otherwise. All rights in the Program not expressly granted
under this Agreement are reserved. Nothing in this Agreement is intended
to be enforceable by any entity that is not a Contributor or Recipient.
No third-party beneficiary rights are created under this Agreement.

Exhibit A - Form of Secondary Licenses Notice

"This Source Code may also be made available under the following 
Secondary Licenses when the conditions for such availability set forth 
in the Eclipse Public License, v. 2.0 are satisfied: {name license(s),
version(s), and exceptions or additional permissions here}."

  Simply including a copy of this Agreement, including this Exhibit A
  is not sufficient to license the Source Code under Secondary Licenses.

  If it is not possible or desirable to put the notice in a particular
  file, then You may include the notice in a location (such as a LICENSE
  file in a relevant directory) where a recipient would be likely to
  look for such a notice.

  You may add additional accurate notices of copyright ownership.


================================================
FILE: README.md
================================================
# Eclipse Tahu

Eclipse Tahu provide client libraries and reference implementations in various languages and for various devices
to show how the device/remote application must connect and disconnect from the MQTT server using the Sparkplug
specification explained below.  This includes device lifecycle messages such as the required birth and last will &
testament messages that must be sent to ensure the device lifecycle state and data integrity.

# Sparkplug

Sparkplug®, Sparkplug Compatible, and the Sparkplug Logo are trademarks of the Eclipse Foundation.

Sparkplug is a specification for MQTT enabled devices and applications to send and receive messages in a stateful way.
While MQTT is stateful by nature it doesn't ensure that all data on a receiving MQTT application is current or valid.
Sparkplug provides a mechanism for ensuring that remote device or application data is current and valid.

Sparkplug A was the original version of the Sparkplug specification and used Eclipse Kura's protobuf definition for
payload encoding.  However, it was quickly determined that this definition was too limited to handle the metadata that
typical Sparkplug payloads require.  As a result, Sparkplug B was developed to add additional features and capabilities
that were not possible in the original Kura payload definition.  These features include:
* Complex data types using templates
* Datasets
* Richer metrics with the ability to add property metadata for each metric
* Metric alias support to maintain rich metric naming while keeping bandwidth usage to a minimum
* Historical data
* File data

Sparkplug Specification v3.0.0: https://www.eclipse.org/tahu/spec/sparkplug_spec.pdf
Eclipse Sparkplug Project: https://projects.eclipse.org/projects/iot.sparkplug
Eclipse Sparkplug & TCK Github Repository: https://github.com/eclipse-sparkplug/sparkplug

# Contributing
Contributing to the Sparkplug Tahu Project is easy and contributions are welcome. In order to submit a pull request (PR) you must follow these steps. Failure to follow these steps will likely lead to the PR being rejected.
1. Sign the Eclipse Contributor Agreement (ECA): https://accounts.eclipse.org/user/eca
2. Make sure the email tied to your Github account is the same one you used to sign the ECA.
3. Submit your PR against the develop branch of the repository. PRs against master will not be accepted: https://github.com/eclipse/sparkplug/tree/develop
4. Sign off on your PR using the '-s' flag. For example: 'git commit -m"My brief comment" ChangedFile'
5. Make sure to include any important context or information associated with the PR in the PR submission. Keep your commit comment brief.


================================================
FILE: RELEASE_NOTES.md
================================================
# Eclipse Tahu v1.0.0

* Initial complete Java based Sparkplug v3.0.0 compatible implementation
* Java based library for simple creation of both Sparkplug Edge Nodes and Host Applications
* Partial example implementations exist for C, C#, JavaScript, Node RED, and Python


================================================
FILE: about.html
================================================
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
    <title>About</title>
</head>
<body lang="EN-US">
<h2>About This Content</h2>

<p>January 24, 2014</p>
<h3>License</h3>

<p>The Eclipse Foundation makes available all content in this plug-in (&ldquo;Content&rdquo;). Unless otherwise
    indicated below, the Content is provided to you under the terms and conditions of the
    <a href="http://www.eclipse.org/legal/epl-v20.html">Eclipse Public License Version 2.0 (&ldquo;EPL&rdquo;)</a>
    and <a href="http://www.opensource.org/licenses/apache2.0.php">Apache License Version 2.0</a>.
    A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v20.html">http://www.eclipse.org/legal/epl-v20.html</a>
    and a copy of the Apache License Version 2.0 is available at <a
        href="http://www.opensource.org/licenses/apache2.0.php">http://www.opensource.org/licenses/apache2.0.php</a>.
    You may elect to redistribute this code under either of these licenses.
    For purposes of the EPL, &ldquo;Program&rdquo; will mean the Content.
</p>

<p>
    If you did not receive this Content directly from the Eclipse Foundation, the Content is
    being redistributed by another party (&ldquo;Redistributor&rdquo;) and different terms and conditions may
    apply to your use of any object code in the Content. Check the Redistributor&rsquo;s license that was
    provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
    indicated below, the terms and conditions of the EPL and Apache License 2.0 still apply to any source code
    in the Content and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.
</p>

</body>
</html>


================================================
FILE: c/core/Makefile
================================================
#/********************************************************************************
# * Copyright (c) 2014-2019 Cirrus Link Solutions and others
# *
# * This program and the accompanying materials are made available under the
# * terms of the Eclipse Public License 2.0 which is available at
# * http://www.eclipse.org/legal/epl-2.0.
# *
# * SPDX-License-Identifier: EPL-2.0
# *
# * Contributors:
# *   Cirrus Link Solutions - initial implementation
# ********************************************************************************/

CC       :=  gcc
NAME     :=  tahu
SNAME    :=  lib/lib$(NAME).a
DNAME    :=  lib/lib$(NAME).so
SRC      :=  $(wildcard src/*.c)
OBJ      :=  $(SRC:.c=.o)
#CFLAGS   :=  -Wall -g3 -fPIC -Iinclude/
CFLAGS   :=  -g -g3 -fPIC -Iinclude/
LDFLAGS  :=  -L.
#LDLIBS  :=  -l$(...)

TEST     :=  test
TEST_OBJ := test/test.c
LD_TEST  := -Llib -L/usr/local/lib -l$(NAME)

.PHONY: all clean test re

all: $(SNAME) $(DNAME) $(TEST)

$(SNAME): $(OBJ)
	mkdir -p lib
	$(AR) $(ARFLAGS) $@ $^

$(DNAME): LDFLAGS += -shared
$(DNAME): $(OBJ)
	mkdir -p lib
	$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)

$(TEST): $(SNAME) $(DNAME)
	$(CC) $(CFLAGS) -o test/test_static $(TEST_OBJ) $(SNAME) -lmosquitto
	$(CC) $(CFLAGS) $(LD_TEST) -o test/test_dynamic $(TEST_OBJ) -l$(NAME) -lmosquitto

clean:
	$(RM) $(OBJ)
	$(RM) $(SNAME) $(DNAME)
	$(RM) test/test_static test/test_dynamic

re: clean all


================================================
FILE: c/core/include/pb.h
================================================
/* Common parts of the nanopb library. Most of these are quite low-level
 * stuff. For the high-level interface, see pb_encode.h and pb_decode.h.
 */

#ifndef PB_H_INCLUDED
#define PB_H_INCLUDED

/*****************************************************************
 * Nanopb compilation time options. You can change these here by *
 * uncommenting the lines, or on the compiler command line.      *
 *****************************************************************/

/* Enable support for dynamically allocated fields */
#define PB_ENABLE_MALLOC 1

/* Define this if your CPU / compiler combination does not support
 * unaligned memory access to packed structures. */
/* #define PB_NO_PACKED_STRUCTS 1 */

/* Increase the number of required fields that are tracked.
 * A compiler warning will tell if you need this. */
/* #define PB_MAX_REQUIRED_FIELDS 256 */

/* Add support for tag numbers > 65536 and fields larger than 65536 bytes. */
#define PB_FIELD_32BIT 1

/* Disable support for error messages in order to save some code space. */
/* #define PB_NO_ERRMSG 1 */

/* Disable support for custom streams (support only memory buffers). */
/* #define PB_BUFFER_ONLY 1 */

/* Disable support for 64-bit datatypes, for compilers without int64_t
   or to save some code space. */
/* #define PB_WITHOUT_64BIT 1 */

/* Don't encode scalar arrays as packed. This is only to be used when
 * the decoder on the receiving side cannot process packed scalar arrays.
 * Such example is older protobuf.js. */
/* #define PB_ENCODE_ARRAYS_UNPACKED 1 */

/* Enable conversion of doubles to floats for platforms that do not
 * support 64-bit doubles. Most commonly AVR. */
/* #define PB_CONVERT_DOUBLE_FLOAT 1 */

/* Check whether incoming strings are valid UTF-8 sequences. Slows down
 * the string processing slightly and slightly increases code size. */
/* #define PB_VALIDATE_UTF8 1 */

/******************************************************************
 * You usually don't need to change anything below this line.     *
 * Feel free to look around and use the defined macros, though.   *
 ******************************************************************/


/* Version of the nanopb library. Just in case you want to check it in
 * your own program. */
#define NANOPB_VERSION nanopb-0.4.1

/* Include all the system headers needed by nanopb. You will need the
 * definitions of the following:
 * - strlen, memcpy, memset functions
 * - [u]int_least8_t, uint_fast8_t, [u]int_least16_t, [u]int32_t, [u]int64_t
 * - size_t
 * - bool
 *
 * If you don't have the standard header files, you can instead provide
 * a custom header that defines or includes all this. In that case,
 * define PB_SYSTEM_HEADER to the path of this file.
 */
#ifdef PB_SYSTEM_HEADER
#include PB_SYSTEM_HEADER
#else
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include <string.h>
#include <limits.h>

#ifdef PB_ENABLE_MALLOC
#include <stdlib.h>
#endif
#endif

#ifdef __cplusplus
extern "C" {
#endif

/* Macro for defining packed structures (compiler dependent).
 * This just reduces memory requirements, but is not required.
 */
#if defined(PB_NO_PACKED_STRUCTS)
    /* Disable struct packing */
#   define PB_PACKED_STRUCT_START
#   define PB_PACKED_STRUCT_END
#   define pb_packed
#elif defined(__GNUC__) || defined(__clang__)
    /* For GCC and clang */
#   define PB_PACKED_STRUCT_START
#   define PB_PACKED_STRUCT_END
#   define pb_packed __attribute__((packed))
#elif defined(__ICCARM__) || defined(__CC_ARM)
    /* For IAR ARM and Keil MDK-ARM compilers */
#   define PB_PACKED_STRUCT_START _Pragma("pack(push, 1)")
#   define PB_PACKED_STRUCT_END _Pragma("pack(pop)")
#   define pb_packed
#elif defined(_MSC_VER) && (_MSC_VER >= 1500)
    /* For Microsoft Visual C++ */
#   define PB_PACKED_STRUCT_START __pragma(pack(push, 1))
#   define PB_PACKED_STRUCT_END __pragma(pack(pop))
#   define pb_packed
#else
    /* Unknown compiler */
#   define PB_PACKED_STRUCT_START
#   define PB_PACKED_STRUCT_END
#   define pb_packed
#endif

/* Handly macro for suppressing unreferenced-parameter compiler warnings. */
#ifndef PB_UNUSED
#define PB_UNUSED(x) (void)(x)
#endif

/* Harvard-architecture processors may need special attributes for storing
 * field information in program memory. */
#ifndef PB_PROGMEM
#ifdef __AVR__
#include <avr/pgmspace.h>
#define PB_PROGMEM             PROGMEM
#define PB_PROGMEM_READU32(x)  pgm_read_dword(&x)
#else
#define PB_PROGMEM
#define PB_PROGMEM_READU32(x)  (x)
#endif
#endif

/* Compile-time assertion, used for checking compatible compilation options.
 * If this does not work properly on your compiler, use
 * #define PB_NO_STATIC_ASSERT to disable it.
 *
 * But before doing that, check carefully the error message / place where it
 * comes from to see if the error has a real cause. Unfortunately the error
 * message is not always very clear to read, but you can see the reason better
 * in the place where the PB_STATIC_ASSERT macro was called.
 */
#ifndef PB_NO_STATIC_ASSERT
#  ifndef PB_STATIC_ASSERT
#    if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
       /* C11 standard _Static_assert mechanism */
#      define PB_STATIC_ASSERT(COND,MSG) _Static_assert(COND,#MSG);
#    else
       /* Classic negative-size-array static assert mechanism */
#      define PB_STATIC_ASSERT(COND,MSG) typedef char PB_STATIC_ASSERT_MSG(MSG, __LINE__, __COUNTER__)[(COND)?1:-1];
#      define PB_STATIC_ASSERT_MSG(MSG, LINE, COUNTER) PB_STATIC_ASSERT_MSG_(MSG, LINE, COUNTER)
#      define PB_STATIC_ASSERT_MSG_(MSG, LINE, COUNTER) pb_static_assertion_##MSG##_##LINE##_##COUNTER
#    endif
#  endif
#else
   /* Static asserts disabled by PB_NO_STATIC_ASSERT */
#  define PB_STATIC_ASSERT(COND,MSG)
#endif

/* Number of required fields to keep track of. */
#ifndef PB_MAX_REQUIRED_FIELDS
#define PB_MAX_REQUIRED_FIELDS 64
#endif

#if PB_MAX_REQUIRED_FIELDS < 64
#error You should not lower PB_MAX_REQUIRED_FIELDS from the default value (64).
#endif

#ifdef PB_WITHOUT_64BIT
#ifdef PB_CONVERT_DOUBLE_FLOAT
/* Cannot use doubles without 64-bit types */
#undef PB_CONVERT_DOUBLE_FLOAT
#endif
#endif

/* List of possible field types. These are used in the autogenerated code.
 * Least-significant 4 bits tell the scalar type
 * Most-significant 4 bits specify repeated/required/packed etc.
 */

typedef uint_least8_t pb_type_t;

/**** Field data types ****/

/* Numeric types */
#define PB_LTYPE_BOOL    0x00U /* bool */
#define PB_LTYPE_VARINT  0x01U /* int32, int64, enum, bool */
#define PB_LTYPE_UVARINT 0x02U /* uint32, uint64 */
#define PB_LTYPE_SVARINT 0x03U /* sint32, sint64 */
#define PB_LTYPE_FIXED32 0x04U /* fixed32, sfixed32, float */
#define PB_LTYPE_FIXED64 0x05U /* fixed64, sfixed64, double */

/* Marker for last packable field type. */
#define PB_LTYPE_LAST_PACKABLE 0x05U

/* Byte array with pre-allocated buffer.
 * data_size is the length of the allocated PB_BYTES_ARRAY structure. */
#define PB_LTYPE_BYTES 0x06U

/* String with pre-allocated buffer.
 * data_size is the maximum length. */
#define PB_LTYPE_STRING 0x07U

/* Submessage
 * submsg_fields is pointer to field descriptions */
#define PB_LTYPE_SUBMESSAGE 0x08U

/* Submessage with pre-decoding callback
 * The pre-decoding callback is stored as pb_callback_t right before pSize.
 * submsg_fields is pointer to field descriptions */
#define PB_LTYPE_SUBMSG_W_CB 0x09U

/* Extension pseudo-field
 * The field contains a pointer to pb_extension_t */
#define PB_LTYPE_EXTENSION 0x0AU

/* Byte array with inline, pre-allocated byffer.
 * data_size is the length of the inline, allocated buffer.
 * This differs from PB_LTYPE_BYTES by defining the element as
 * pb_byte_t[data_size] rather than pb_bytes_array_t. */
#define PB_LTYPE_FIXED_LENGTH_BYTES 0x0BU

/* Number of declared LTYPES */
#define PB_LTYPES_COUNT 0x0CU
#define PB_LTYPE_MASK 0x0FU

/**** Field repetition rules ****/

#define PB_HTYPE_REQUIRED 0x00U
#define PB_HTYPE_OPTIONAL 0x10U
#define PB_HTYPE_SINGULAR 0x10U
#define PB_HTYPE_REPEATED 0x20U
#define PB_HTYPE_FIXARRAY 0x20U
#define PB_HTYPE_ONEOF    0x30U
#define PB_HTYPE_MASK     0x30U

/**** Field allocation types ****/
 
#define PB_ATYPE_STATIC   0x00U
#define PB_ATYPE_POINTER  0x80U
#define PB_ATYPE_CALLBACK 0x40U
#define PB_ATYPE_MASK     0xC0U

#define PB_ATYPE(x) ((x) & PB_ATYPE_MASK)
#define PB_HTYPE(x) ((x) & PB_HTYPE_MASK)
#define PB_LTYPE(x) ((x) & PB_LTYPE_MASK)
#define PB_LTYPE_IS_SUBMSG(x) (PB_LTYPE(x) == PB_LTYPE_SUBMESSAGE || \
                               PB_LTYPE(x) == PB_LTYPE_SUBMSG_W_CB)

/* Data type used for storing sizes of struct fields
 * and array counts.
 */
#if defined(PB_FIELD_32BIT)
    typedef uint32_t pb_size_t;
    typedef int32_t pb_ssize_t;
#else
    typedef uint_least16_t pb_size_t;
    typedef int_least16_t pb_ssize_t;
#endif
#define PB_SIZE_MAX ((pb_size_t)-1)

/* Data type for storing encoded data and other byte streams.
 * This typedef exists to support platforms where uint8_t does not exist.
 * You can regard it as equivalent on uint8_t on other platforms.
 */
typedef uint_least8_t pb_byte_t;

/* Forward declaration of struct types */
typedef struct pb_istream_s pb_istream_t;
typedef struct pb_ostream_s pb_ostream_t;
typedef struct pb_field_iter_s pb_field_iter_t;

/* This structure is used in auto-generated constants
 * to specify struct fields.
 */
PB_PACKED_STRUCT_START
typedef struct pb_msgdesc_s pb_msgdesc_t;
struct pb_msgdesc_s {
    pb_size_t field_count;
    const uint32_t *field_info;
    const pb_msgdesc_t * const * submsg_info;
    const pb_byte_t *default_value;

    bool (*field_callback)(pb_istream_t *istream, pb_ostream_t *ostream, const pb_field_iter_t *field);
} pb_packed;
PB_PACKED_STRUCT_END

/* Iterator for message descriptor */
struct pb_field_iter_s {
    const pb_msgdesc_t *descriptor;  /* Pointer to message descriptor constant */
    void *message;                   /* Pointer to start of the structure */

    pb_size_t index;                 /* Index of the field */
    pb_size_t field_info_index;      /* Index to descriptor->field_info array */
    pb_size_t required_field_index;  /* Index that counts only the required fields */
    pb_size_t submessage_index;      /* Index that counts only submessages */

    pb_size_t tag;                   /* Tag of current field */
    pb_size_t data_size;             /* sizeof() of a single item */
    pb_size_t array_size;            /* Number of array entries */
    pb_type_t type;                  /* Type of current field */

    void *pField;                    /* Pointer to current field in struct */
    void *pData;                     /* Pointer to current data contents. Different than pField for arrays and pointers. */
    void *pSize;                     /* Pointer to count/has field */

    const pb_msgdesc_t *submsg_desc; /* For submessage fields, pointer to field descriptor for the submessage. */
};

/* For compatibility with legacy code */
typedef pb_field_iter_t pb_field_t;

/* Make sure that the standard integer types are of the expected sizes.
 * Otherwise fixed32/fixed64 fields can break.
 *
 * If you get errors here, it probably means that your stdint.h is not
 * correct for your platform.
 */
#ifndef PB_WITHOUT_64BIT
PB_STATIC_ASSERT(sizeof(int64_t) == 2 * sizeof(int32_t), INT64_T_WRONG_SIZE)
PB_STATIC_ASSERT(sizeof(uint64_t) == 2 * sizeof(uint32_t), UINT64_T_WRONG_SIZE)
#endif

/* This structure is used for 'bytes' arrays.
 * It has the number of bytes in the beginning, and after that an array.
 * Note that actual structs used will have a different length of bytes array.
 */
#define PB_BYTES_ARRAY_T(n) struct { pb_size_t size; pb_byte_t bytes[n]; }
#define PB_BYTES_ARRAY_T_ALLOCSIZE(n) ((size_t)n + offsetof(pb_bytes_array_t, bytes))

struct pb_bytes_array_s {
    pb_size_t size;
    pb_byte_t bytes[1];
};
typedef struct pb_bytes_array_s pb_bytes_array_t;

/* This structure is used for giving the callback function.
 * It is stored in the message structure and filled in by the method that
 * calls pb_decode.
 *
 * The decoding callback will be given a limited-length stream
 * If the wire type was string, the length is the length of the string.
 * If the wire type was a varint/fixed32/fixed64, the length is the length
 * of the actual value.
 * The function may be called multiple times (especially for repeated types,
 * but also otherwise if the message happens to contain the field multiple
 * times.)
 *
 * The encoding callback will receive the actual output stream.
 * It should write all the data in one call, including the field tag and
 * wire type. It can write multiple fields.
 *
 * The callback can be null if you want to skip a field.
 */
typedef struct pb_callback_s pb_callback_t;
struct pb_callback_s {
    /* Callback functions receive a pointer to the arg field.
     * You can access the value of the field as *arg, and modify it if needed.
     */
    union {
        bool (*decode)(pb_istream_t *stream, const pb_field_t *field, void **arg);
        bool (*encode)(pb_ostream_t *stream, const pb_field_t *field, void * const *arg);
    } funcs;
    
    /* Free arg for use by callback */
    void *arg;
};

extern bool pb_default_field_callback(pb_istream_t *istream, pb_ostream_t *ostream, const pb_field_t *field);

/* Wire types. Library user needs these only in encoder callbacks. */
typedef enum {
    PB_WT_VARINT = 0,
    PB_WT_64BIT  = 1,
    PB_WT_STRING = 2,
    PB_WT_32BIT  = 5
} pb_wire_type_t;

/* Structure for defining the handling of unknown/extension fields.
 * Usually the pb_extension_type_t structure is automatically generated,
 * while the pb_extension_t structure is created by the user. However,
 * if you want to catch all unknown fields, you can also create a custom
 * pb_extension_type_t with your own callback.
 */
typedef struct pb_extension_type_s pb_extension_type_t;
typedef struct pb_extension_s pb_extension_t;
struct pb_extension_type_s {
    /* Called for each unknown field in the message.
     * If you handle the field, read off all of its data and return true.
     * If you do not handle the field, do not read anything and return true.
     * If you run into an error, return false.
     * Set to NULL for default handler.
     */
    bool (*decode)(pb_istream_t *stream, pb_extension_t *extension,
                   uint32_t tag, pb_wire_type_t wire_type);
    
    /* Called once after all regular fields have been encoded.
     * If you have something to write, do so and return true.
     * If you do not have anything to write, just return true.
     * If you run into an error, return false.
     * Set to NULL for default handler.
     */
    bool (*encode)(pb_ostream_t *stream, const pb_extension_t *extension);
    
    /* Free field for use by the callback. */
    const void *arg;
};

struct pb_extension_s {
    /* Type describing the extension field. Usually you'll initialize
     * this to a pointer to the automatically generated structure. */
    const pb_extension_type_t *type;
    
    /* Destination for the decoded data. This must match the datatype
     * of the extension field. */
    void *dest;
    
    /* Pointer to the next extension handler, or NULL.
     * If this extension does not match a field, the next handler is
     * automatically called. */
    pb_extension_t *next;

    /* The decoder sets this to true if the extension was found.
     * Ignored for encoding. */
    bool found;
};

#define pb_extension_init_zero {NULL,NULL,NULL,false}

/* Memory allocation functions to use. You can define pb_realloc and
 * pb_free to custom functions if you want. */
#ifdef PB_ENABLE_MALLOC
#   ifndef pb_realloc
#       define pb_realloc(ptr, size) realloc(ptr, size)
#   endif
#   ifndef pb_free
#       define pb_free(ptr) free(ptr)
#   endif
#endif

/* This is used to inform about need to regenerate .pb.h/.pb.c files. */
#define PB_PROTO_HEADER_VERSION 40

/* These macros are used to declare pb_field_t's in the constant array. */
/* Size of a structure member, in bytes. */
#define pb_membersize(st, m) (sizeof ((st*)0)->m)
/* Number of entries in an array. */
#define pb_arraysize(st, m) (pb_membersize(st, m) / pb_membersize(st, m[0]))
/* Delta from start of one member to the start of another member. */
#define pb_delta(st, m1, m2) ((int)offsetof(st, m1) - (int)offsetof(st, m2))

/* Force expansion of macro value */
#define PB_EXPAND(x) x

/* Binding of a message field set into a specific structure */
#define PB_BIND(msgname, structname, width) \
    const uint32_t structname ## _field_info[] PB_PROGMEM = \
    { \
        msgname ## _FIELDLIST(PB_GEN_FIELD_INFO_ ## width, structname) \
        0 \
    }; \
    const pb_msgdesc_t* const structname ## _submsg_info[] = \
    { \
        msgname ## _FIELDLIST(PB_GEN_SUBMSG_INFO, structname) \
        NULL \
    }; \
    const pb_msgdesc_t structname ## _msg = \
    { \
       0 msgname ## _FIELDLIST(PB_GEN_FIELD_COUNT, structname), \
       structname ## _field_info, \
       structname ## _submsg_info, \
       msgname ## _DEFAULT, \
       msgname ## _CALLBACK, \
    }; \
    msgname ## _FIELDLIST(PB_GEN_FIELD_INFO_ASSERT_ ## width, structname)

#define PB_GEN_FIELD_COUNT(structname, atype, htype, ltype, fieldname, tag) +1

#define PB_GEN_FIELD_INFO_1(structname, atype, htype, ltype, fieldname, tag) \
    PB_GEN_FIELD_INFO(1, structname, atype, htype, ltype, fieldname, tag)

#define PB_GEN_FIELD_INFO_2(structname, atype, htype, ltype, fieldname, tag) \
    PB_GEN_FIELD_INFO(2, structname, atype, htype, ltype, fieldname, tag)

#define PB_GEN_FIELD_INFO_4(structname, atype, htype, ltype, fieldname, tag) \
    PB_GEN_FIELD_INFO(4, structname, atype, htype, ltype, fieldname, tag)

#define PB_GEN_FIELD_INFO_8(structname, atype, htype, ltype, fieldname, tag) \
    PB_GEN_FIELD_INFO(8, structname, atype, htype, ltype, fieldname, tag)

#define PB_GEN_FIELD_INFO_AUTO(structname, atype, htype, ltype, fieldname, tag) \
    PB_GEN_FIELD_INFO_AUTO2(PB_FIELDINFO_WIDTH_AUTO(atype, htype, ltype), structname, atype, htype, ltype, fieldname, tag)

#define PB_GEN_FIELD_INFO_AUTO2(width, structname, atype, htype, ltype, fieldname, tag) \
    PB_GEN_FIELD_INFO(width, structname, atype, htype, ltype, fieldname, tag)

#define PB_GEN_FIELD_INFO(width, structname, atype, htype, ltype, fieldname, tag) \
    PB_FIELDINFO_ ## width(tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \
                   PB_DATA_OFFSET_ ## atype(htype, structname, fieldname), \
                   PB_DATA_SIZE_ ## atype(htype, structname, fieldname), \
                   PB_SIZE_OFFSET_ ## atype(htype, structname, fieldname), \
                   PB_ARRAY_SIZE_ ## atype(htype, structname, fieldname))

#define PB_GEN_FIELD_INFO_ASSERT_1(structname, atype, htype, ltype, fieldname, tag) \
    PB_GEN_FIELD_INFO_ASSERT(1, structname, atype, htype, ltype, fieldname, tag)

#define PB_GEN_FIELD_INFO_ASSERT_2(structname, atype, htype, ltype, fieldname, tag) \
    PB_GEN_FIELD_INFO_ASSERT(2, structname, atype, htype, ltype, fieldname, tag)

#define PB_GEN_FIELD_INFO_ASSERT_4(structname, atype, htype, ltype, fieldname, tag) \
    PB_GEN_FIELD_INFO_ASSERT(4, structname, atype, htype, ltype, fieldname, tag)

#define PB_GEN_FIELD_INFO_ASSERT_8(structname, atype, htype, ltype, fieldname, tag) \
    PB_GEN_FIELD_INFO_ASSERT(8, structname, atype, htype, ltype, fieldname, tag)

#define PB_GEN_FIELD_INFO_ASSERT_AUTO(structname, atype, htype, ltype, fieldname, tag) \
    PB_GEN_FIELD_INFO_ASSERT_AUTO2(PB_FIELDINFO_WIDTH_AUTO(atype, htype, ltype), structname, atype, htype, ltype, fieldname, tag)

#define PB_GEN_FIELD_INFO_ASSERT_AUTO2(width, structname, atype, htype, ltype, fieldname, tag) \
    PB_GEN_FIELD_INFO_ASSERT(width, structname, atype, htype, ltype, fieldname, tag)

#define PB_GEN_FIELD_INFO_ASSERT(width, structname, atype, htype, ltype, fieldname, tag) \
    PB_FIELDINFO_ASSERT_ ## width(tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \
                   PB_DATA_OFFSET_ ## atype(htype, structname, fieldname), \
                   PB_DATA_SIZE_ ## atype(htype, structname, fieldname), \
                   PB_SIZE_OFFSET_ ## atype(htype, structname, fieldname), \
                   PB_ARRAY_SIZE_ ## atype(htype, structname, fieldname))

#define PB_DATA_OFFSET_STATIC(htype, structname, fieldname) PB_DATA_OFFSET_ ## htype(structname, fieldname)
#define PB_DATA_OFFSET_POINTER(htype, structname, fieldname) PB_DATA_OFFSET_ ## htype(structname, fieldname)
#define PB_DATA_OFFSET_CALLBACK(htype, structname, fieldname) PB_DATA_OFFSET_ ## htype(structname, fieldname)
#define PB_DATA_OFFSET_REQUIRED(structname, fieldname) offsetof(structname, fieldname)
#define PB_DATA_OFFSET_SINGULAR(structname, fieldname) offsetof(structname, fieldname)
#define PB_DATA_OFFSET_ONEOF(structname, fieldname) offsetof(structname, PB_ONEOF_NAME(FULL, fieldname))
#define PB_DATA_OFFSET_OPTIONAL(structname, fieldname) offsetof(structname, fieldname)
#define PB_DATA_OFFSET_REPEATED(structname, fieldname) offsetof(structname, fieldname)
#define PB_DATA_OFFSET_FIXARRAY(structname, fieldname) offsetof(structname, fieldname)

#define PB_SIZE_OFFSET_STATIC(htype, structname, fieldname) PB_SIZE_OFFSET_ ## htype(structname, fieldname)
#define PB_SIZE_OFFSET_POINTER(htype, structname, fieldname) PB_SIZE_OFFSET_PTR_ ## htype(structname, fieldname)
#define PB_SIZE_OFFSET_CALLBACK(htype, structname, fieldname) PB_SIZE_OFFSET_CB_ ## htype(structname, fieldname)
#define PB_SIZE_OFFSET_REQUIRED(structname, fieldname) 0
#define PB_SIZE_OFFSET_SINGULAR(structname, fieldname) 0
#define PB_SIZE_OFFSET_ONEOF(structname, fieldname) PB_SIZE_OFFSET_ONEOF2(structname, PB_ONEOF_NAME(FULL, fieldname), PB_ONEOF_NAME(UNION, fieldname))
#define PB_SIZE_OFFSET_ONEOF2(structname, fullname, unionname) PB_SIZE_OFFSET_ONEOF3(structname, fullname, unionname)
#define PB_SIZE_OFFSET_ONEOF3(structname, fullname, unionname) pb_delta(structname, fullname, which_ ## unionname)
#define PB_SIZE_OFFSET_OPTIONAL(structname, fieldname) pb_delta(structname, fieldname, has_ ## fieldname)
#define PB_SIZE_OFFSET_REPEATED(structname, fieldname) pb_delta(structname, fieldname, fieldname ## _count)
#define PB_SIZE_OFFSET_FIXARRAY(structname, fieldname) 0
#define PB_SIZE_OFFSET_PTR_REQUIRED(structname, fieldname) 0
#define PB_SIZE_OFFSET_PTR_SINGULAR(structname, fieldname) 0
#define PB_SIZE_OFFSET_PTR_ONEOF(structname, fieldname) PB_SIZE_OFFSET_ONEOF(structname, fieldname)
#define PB_SIZE_OFFSET_PTR_OPTIONAL(structname, fieldname) 0
#define PB_SIZE_OFFSET_PTR_REPEATED(structname, fieldname) PB_SIZE_OFFSET_REPEATED(structname, fieldname)
#define PB_SIZE_OFFSET_PTR_FIXARRAY(structname, fieldname) 0
#define PB_SIZE_OFFSET_CB_REQUIRED(structname, fieldname) 0
#define PB_SIZE_OFFSET_CB_SINGULAR(structname, fieldname) 0
#define PB_SIZE_OFFSET_CB_ONEOF(structname, fieldname) PB_SIZE_OFFSET_ONEOF(structname, fieldname)
#define PB_SIZE_OFFSET_CB_OPTIONAL(structname, fieldname) 0
#define PB_SIZE_OFFSET_CB_REPEATED(structname, fieldname) 0
#define PB_SIZE_OFFSET_CB_FIXARRAY(structname, fieldname) 0

#define PB_ARRAY_SIZE_STATIC(htype, structname, fieldname) PB_ARRAY_SIZE_ ## htype(structname, fieldname)
#define PB_ARRAY_SIZE_POINTER(htype, structname, fieldname) PB_ARRAY_SIZE_PTR_ ## htype(structname, fieldname)
#define PB_ARRAY_SIZE_CALLBACK(htype, structname, fieldname) 1
#define PB_ARRAY_SIZE_REQUIRED(structname, fieldname) 1
#define PB_ARRAY_SIZE_SINGULAR(structname, fieldname) 1
#define PB_ARRAY_SIZE_OPTIONAL(structname, fieldname) 1
#define PB_ARRAY_SIZE_ONEOF(structname, fieldname) 1
#define PB_ARRAY_SIZE_REPEATED(structname, fieldname) pb_arraysize(structname, fieldname)
#define PB_ARRAY_SIZE_FIXARRAY(structname, fieldname) pb_arraysize(structname, fieldname)
#define PB_ARRAY_SIZE_PTR_REQUIRED(structname, fieldname) 1
#define PB_ARRAY_SIZE_PTR_SINGULAR(structname, fieldname) 1
#define PB_ARRAY_SIZE_PTR_OPTIONAL(structname, fieldname) 1
#define PB_ARRAY_SIZE_PTR_ONEOF(structname, fieldname) 1
#define PB_ARRAY_SIZE_PTR_REPEATED(structname, fieldname) 1
#define PB_ARRAY_SIZE_PTR_FIXARRAY(structname, fieldname) pb_arraysize(structname, fieldname[0])

#define PB_DATA_SIZE_STATIC(htype, structname, fieldname) PB_DATA_SIZE_ ## htype(structname, fieldname)
#define PB_DATA_SIZE_POINTER(htype, structname, fieldname) PB_DATA_SIZE_PTR_ ## htype(structname, fieldname)
#define PB_DATA_SIZE_CALLBACK(htype, structname, fieldname) PB_DATA_SIZE_CB_ ## htype(structname, fieldname)
#define PB_DATA_SIZE_REQUIRED(structname, fieldname) pb_membersize(structname, fieldname)
#define PB_DATA_SIZE_SINGULAR(structname, fieldname) pb_membersize(structname, fieldname)
#define PB_DATA_SIZE_OPTIONAL(structname, fieldname) pb_membersize(structname, fieldname)
#define PB_DATA_SIZE_ONEOF(structname, fieldname) pb_membersize(structname, PB_ONEOF_NAME(FULL, fieldname))
#define PB_DATA_SIZE_REPEATED(structname, fieldname) pb_membersize(structname, fieldname[0])
#define PB_DATA_SIZE_FIXARRAY(structname, fieldname) pb_membersize(structname, fieldname[0])
#define PB_DATA_SIZE_PTR_REQUIRED(structname, fieldname) pb_membersize(structname, fieldname[0])
#define PB_DATA_SIZE_PTR_SINGULAR(structname, fieldname) pb_membersize(structname, fieldname[0])
#define PB_DATA_SIZE_PTR_OPTIONAL(structname, fieldname) pb_membersize(structname, fieldname[0])
#define PB_DATA_SIZE_PTR_ONEOF(structname, fieldname) pb_membersize(structname, PB_ONEOF_NAME(FULL, fieldname)[0])
#define PB_DATA_SIZE_PTR_REPEATED(structname, fieldname) pb_membersize(structname, fieldname[0])
#define PB_DATA_SIZE_PTR_FIXARRAY(structname, fieldname) pb_membersize(structname, fieldname[0][0])
#define PB_DATA_SIZE_CB_REQUIRED(structname, fieldname) pb_membersize(structname, fieldname)
#define PB_DATA_SIZE_CB_SINGULAR(structname, fieldname) pb_membersize(structname, fieldname)
#define PB_DATA_SIZE_CB_OPTIONAL(structname, fieldname) pb_membersize(structname, fieldname)
#define PB_DATA_SIZE_CB_ONEOF(structname, fieldname) pb_membersize(structname, PB_ONEOF_NAME(FULL, fieldname))
#define PB_DATA_SIZE_CB_REPEATED(structname, fieldname) pb_membersize(structname, fieldname)
#define PB_DATA_SIZE_CB_FIXARRAY(structname, fieldname) pb_membersize(structname, fieldname)

#define PB_ONEOF_NAME(type, tuple) PB_EXPAND(PB_ONEOF_NAME_ ## type tuple)
#define PB_ONEOF_NAME_UNION(unionname,membername,fullname) unionname
#define PB_ONEOF_NAME_MEMBER(unionname,membername,fullname) membername
#define PB_ONEOF_NAME_FULL(unionname,membername,fullname) fullname

#define PB_GEN_SUBMSG_INFO(structname, atype, htype, ltype, fieldname, tag) \
    PB_SUBMSG_INFO_ ## htype(ltype, structname, fieldname)

#define PB_SUBMSG_INFO_REQUIRED(ltype, structname, fieldname) PB_SUBMSG_INFO_ ## ltype(structname ## _ ## fieldname ## _MSGTYPE)
#define PB_SUBMSG_INFO_SINGULAR(ltype, structname, fieldname) PB_SUBMSG_INFO_ ## ltype(structname ## _ ## fieldname ## _MSGTYPE)
#define PB_SUBMSG_INFO_OPTIONAL(ltype, structname, fieldname) PB_SUBMSG_INFO_ ## ltype(structname ## _ ## fieldname ## _MSGTYPE)
#define PB_SUBMSG_INFO_ONEOF(ltype, structname, fieldname) PB_SUBMSG_INFO_ONEOF2(ltype, structname, PB_ONEOF_NAME(UNION, fieldname), PB_ONEOF_NAME(MEMBER, fieldname))
#define PB_SUBMSG_INFO_ONEOF2(ltype, structname, unionname, membername) PB_SUBMSG_INFO_ONEOF3(ltype, structname, unionname, membername)
#define PB_SUBMSG_INFO_ONEOF3(ltype, structname, unionname, membername) PB_SUBMSG_INFO_ ## ltype(structname ## _ ## unionname ## _ ## membername ## _MSGTYPE)
#define PB_SUBMSG_INFO_REPEATED(ltype, structname, fieldname) PB_SUBMSG_INFO_ ## ltype(structname ## _ ## fieldname ## _MSGTYPE)
#define PB_SUBMSG_INFO_FIXARRAY(ltype, structname, fieldname) PB_SUBMSG_INFO_ ## ltype(structname ## _ ## fieldname ## _MSGTYPE)
#define PB_SUBMSG_INFO_BOOL(t)
#define PB_SUBMSG_INFO_BYTES(t)
#define PB_SUBMSG_INFO_DOUBLE(t)
#define PB_SUBMSG_INFO_ENUM(t)
#define PB_SUBMSG_INFO_UENUM(t)
#define PB_SUBMSG_INFO_FIXED32(t)
#define PB_SUBMSG_INFO_FIXED64(t)
#define PB_SUBMSG_INFO_FLOAT(t)
#define PB_SUBMSG_INFO_INT32(t)
#define PB_SUBMSG_INFO_INT64(t)
#define PB_SUBMSG_INFO_MESSAGE(t)  PB_SUBMSG_DESCRIPTOR(t)
#define PB_SUBMSG_INFO_MSG_W_CB(t) PB_SUBMSG_DESCRIPTOR(t)
#define PB_SUBMSG_INFO_SFIXED32(t)
#define PB_SUBMSG_INFO_SFIXED64(t)
#define PB_SUBMSG_INFO_SINT32(t)
#define PB_SUBMSG_INFO_SINT64(t)
#define PB_SUBMSG_INFO_STRING(t)
#define PB_SUBMSG_INFO_UINT32(t)
#define PB_SUBMSG_INFO_UINT64(t)
#define PB_SUBMSG_INFO_EXTENSION(t)
#define PB_SUBMSG_INFO_FIXED_LENGTH_BYTES(t)
#define PB_SUBMSG_DESCRIPTOR(t)    &(t ## _msg),

/* The field descriptors use a variable width format, with width of either
 * 1, 2, 4 or 8 of 32-bit words. The two lowest bytes of the first byte always
 * encode the descriptor size, 6 lowest bits of field tag number, and 8 bits
 * of the field type.
 *
 * Descriptor size is encoded as 0 = 1 word, 1 = 2 words, 2 = 4 words, 3 = 8 words.
 *
 * Formats, listed starting with the least significant bit of the first word.
 * 1 word:  [2-bit len] [6-bit tag] [8-bit type] [8-bit data_offset] [4-bit size_offset] [4-bit data_size]
 *
 * 2 words: [2-bit len] [6-bit tag] [8-bit type] [12-bit array_size] [4-bit size_offset]
 *          [16-bit data_offset] [12-bit data_size] [4-bit tag>>6]
 *
 * 4 words: [2-bit len] [6-bit tag] [8-bit type] [16-bit array_size]
 *          [8-bit size_offset] [24-bit tag>>6]
 *          [32-bit data_offset]
 *          [32-bit data_size]
 *
 * 8 words: [2-bit len] [6-bit tag] [8-bit type] [16-bit reserved]
 *          [8-bit size_offset] [24-bit tag>>6]
 *          [32-bit data_offset]
 *          [32-bit data_size]
 *          [32-bit array_size]
 *          [32-bit reserved]
 *          [32-bit reserved]
 *          [32-bit reserved]
 */

#define PB_FIELDINFO_1(tag, type, data_offset, data_size, size_offset, array_size) \
    (0 | (((tag) << 2) & 0xFF) | ((type) << 8) | (((uint32_t)(data_offset) & 0xFF) << 16) | \
     (((uint32_t)(size_offset) & 0x0F) << 24) | (((uint32_t)(data_size) & 0x0F) << 28)),

#define PB_FIELDINFO_2(tag, type, data_offset, data_size, size_offset, array_size) \
    (1 | (((tag) << 2) & 0xFF) | ((type) << 8) | (((uint32_t)(array_size) & 0xFFF) << 16) | (((uint32_t)(size_offset) & 0x0F) << 28)), \
    (((uint32_t)(data_offset) & 0xFFFF) | (((uint32_t)(data_size) & 0xFFF) << 16) | (((uint32_t)(tag) & 0x3c0) << 22)),

#define PB_FIELDINFO_4(tag, type, data_offset, data_size, size_offset, array_size) \
    (2 | (((tag) << 2) & 0xFF) | ((type) << 8) | (((uint32_t)(array_size) & 0xFFFF) << 16)), \
    ((uint32_t)(int_least8_t)(size_offset) | (((uint32_t)(tag) << 2) & 0xFFFFFF00)), \
    (data_offset), (data_size),

#define PB_FIELDINFO_8(tag, type, data_offset, data_size, size_offset, array_size) \
    (3 | (((tag) << 2) & 0xFF) | ((type) << 8)), \
    ((uint32_t)(int_least8_t)(size_offset) | (((uint32_t)(tag) << 2) & 0xFFFFFF00)), \
    (data_offset), (data_size), (array_size), 0, 0, 0,

/* These assertions verify that the field information fits in the allocated space.
 * The generator tries to automatically determine the correct width that can fit all
 * data associated with a message. These asserts will fail only if there has been a
 * problem in the automatic logic - this may be worth reporting as a bug. As a workaround,
 * you can increase the descriptor width by defining PB_FIELDINFO_WIDTH or by setting
 * descriptorsize option in .options file.
 */
#define PB_FITS(value,bits) ((uint32_t)(value) < ((uint32_t)1<<bits))
#define PB_FIELDINFO_ASSERT_1(tag, type, data_offset, data_size, size_offset, array_size) \
    PB_STATIC_ASSERT(PB_FITS(tag,6) && PB_FITS(data_offset,8) && PB_FITS(size_offset,4) && PB_FITS(data_size,4) && PB_FITS(array_size,1), FIELDINFO_DOES_NOT_FIT_width1_field ## tag)

#define PB_FIELDINFO_ASSERT_2(tag, type, data_offset, data_size, size_offset, array_size) \
    PB_STATIC_ASSERT(PB_FITS(tag,10) && PB_FITS(data_offset,16) && PB_FITS(size_offset,4) && PB_FITS(data_size,12) && PB_FITS(array_size,12), FIELDINFO_DOES_NOT_FIT_width2_field ## tag)

#ifndef PB_FIELD_32BIT
/* Maximum field sizes are still 16-bit if pb_size_t is 16-bit */
#define PB_FIELDINFO_ASSERT_4(tag, type, data_offset, data_size, size_offset, array_size) \
    PB_STATIC_ASSERT(PB_FITS(tag,16) && PB_FITS(data_offset,16) && PB_FITS((int_least8_t)size_offset,8) && PB_FITS(data_size,16) && PB_FITS(array_size,16), FIELDINFO_DOES_NOT_FIT_width4_field ## tag)

#define PB_FIELDINFO_ASSERT_8(tag, type, data_offset, data_size, size_offset, array_size) \
    PB_STATIC_ASSERT(PB_FITS(tag,16) && PB_FITS(data_offset,16) && PB_FITS((int_least8_t)size_offset,8) && PB_FITS(data_size,16) && PB_FITS(array_size,16), FIELDINFO_DOES_NOT_FIT_width8_field ## tag)
#else
/* Up to 32-bit fields supported.
 * Note that the checks are against 31 bits to avoid compiler warnings about shift wider than type in the test.
 * I expect that there is no reasonable use for >2GB messages with nanopb anyway.
 */
#define PB_FIELDINFO_ASSERT_4(tag, type, data_offset, data_size, size_offset, array_size) \
    PB_STATIC_ASSERT(PB_FITS(tag,30) && PB_FITS(data_offset,31) && PB_FITS(size_offset,8) && PB_FITS(data_size,31) && PB_FITS(array_size,16), FIELDINFO_DOES_NOT_FIT_width4_field ## tag)

#define PB_FIELDINFO_ASSERT_8(tag, type, data_offset, data_size, size_offset, array_size) \
    PB_STATIC_ASSERT(PB_FITS(tag,30) && PB_FITS(data_offset,31) && PB_FITS(size_offset,8) && PB_FITS(data_size,31) && PB_FITS(array_size,31), FIELDINFO_DOES_NOT_FIT_width8_field ## tag)
#endif


/* Automatic picking of FIELDINFO width:
 * Uses width 1 when possible, otherwise resorts to width 2.
 * This is used when PB_BIND() is called with "AUTO" as the argument.
 * The generator will give explicit size argument when it knows that a message
 * structure grows beyond 1-word format limits.
 */
#define PB_FIELDINFO_WIDTH_AUTO(atype, htype, ltype) PB_FIELDINFO_WIDTH_ ## atype(htype, ltype)
#define PB_FIELDINFO_WIDTH_STATIC(htype, ltype) PB_FIELDINFO_WIDTH_ ## htype(ltype)
#define PB_FIELDINFO_WIDTH_POINTER(htype, ltype) PB_FIELDINFO_WIDTH_ ## htype(ltype)
#define PB_FIELDINFO_WIDTH_CALLBACK(htype, ltype) 2
#define PB_FIELDINFO_WIDTH_REQUIRED(ltype) PB_FIELDINFO_WIDTH_ ## ltype
#define PB_FIELDINFO_WIDTH_SINGULAR(ltype) PB_FIELDINFO_WIDTH_ ## ltype
#define PB_FIELDINFO_WIDTH_OPTIONAL(ltype) PB_FIELDINFO_WIDTH_ ## ltype
#define PB_FIELDINFO_WIDTH_ONEOF(ltype) PB_FIELDINFO_WIDTH_ ## ltype
#define PB_FIELDINFO_WIDTH_REPEATED(ltype) 2
#define PB_FIELDINFO_WIDTH_FIXARRAY(ltype) 2
#define PB_FIELDINFO_WIDTH_BOOL      1
#define PB_FIELDINFO_WIDTH_BYTES     2
#define PB_FIELDINFO_WIDTH_DOUBLE    1
#define PB_FIELDINFO_WIDTH_ENUM      1
#define PB_FIELDINFO_WIDTH_UENUM     1
#define PB_FIELDINFO_WIDTH_FIXED32   1
#define PB_FIELDINFO_WIDTH_FIXED64   1
#define PB_FIELDINFO_WIDTH_FLOAT     1
#define PB_FIELDINFO_WIDTH_INT32     1
#define PB_FIELDINFO_WIDTH_INT64     1
#define PB_FIELDINFO_WIDTH_MESSAGE   2
#define PB_FIELDINFO_WIDTH_MSG_W_CB  2
#define PB_FIELDINFO_WIDTH_SFIXED32  1
#define PB_FIELDINFO_WIDTH_SFIXED64  1
#define PB_FIELDINFO_WIDTH_SINT32    1
#define PB_FIELDINFO_WIDTH_SINT64    1
#define PB_FIELDINFO_WIDTH_STRING    2
#define PB_FIELDINFO_WIDTH_UINT32    1
#define PB_FIELDINFO_WIDTH_UINT64    1
#define PB_FIELDINFO_WIDTH_EXTENSION 1
#define PB_FIELDINFO_WIDTH_FIXED_LENGTH_BYTES 2

/* The mapping from protobuf types to LTYPEs is done using these macros. */
#define PB_LTYPE_MAP_BOOL               PB_LTYPE_BOOL
#define PB_LTYPE_MAP_BYTES              PB_LTYPE_BYTES
#define PB_LTYPE_MAP_DOUBLE             PB_LTYPE_FIXED64
#define PB_LTYPE_MAP_ENUM               PB_LTYPE_VARINT
#define PB_LTYPE_MAP_UENUM              PB_LTYPE_UVARINT
#define PB_LTYPE_MAP_FIXED32            PB_LTYPE_FIXED32
#define PB_LTYPE_MAP_FIXED64            PB_LTYPE_FIXED64
#define PB_LTYPE_MAP_FLOAT              PB_LTYPE_FIXED32
#define PB_LTYPE_MAP_INT32              PB_LTYPE_VARINT
#define PB_LTYPE_MAP_INT64              PB_LTYPE_VARINT
#define PB_LTYPE_MAP_MESSAGE            PB_LTYPE_SUBMESSAGE
#define PB_LTYPE_MAP_MSG_W_CB           PB_LTYPE_SUBMSG_W_CB
#define PB_LTYPE_MAP_SFIXED32           PB_LTYPE_FIXED32
#define PB_LTYPE_MAP_SFIXED64           PB_LTYPE_FIXED64
#define PB_LTYPE_MAP_SINT32             PB_LTYPE_SVARINT
#define PB_LTYPE_MAP_SINT64             PB_LTYPE_SVARINT
#define PB_LTYPE_MAP_STRING             PB_LTYPE_STRING
#define PB_LTYPE_MAP_UINT32             PB_LTYPE_UVARINT
#define PB_LTYPE_MAP_UINT64             PB_LTYPE_UVARINT
#define PB_LTYPE_MAP_EXTENSION          PB_LTYPE_EXTENSION
#define PB_LTYPE_MAP_FIXED_LENGTH_BYTES PB_LTYPE_FIXED_LENGTH_BYTES

/* These macros are used for giving out error messages.
 * They are mostly a debugging aid; the main error information
 * is the true/false return value from functions.
 * Some code space can be saved by disabling the error
 * messages if not used.
 *
 * PB_SET_ERROR() sets the error message if none has been set yet.
 *                msg must be a constant string literal.
 * PB_GET_ERROR() always returns a pointer to a string.
 * PB_RETURN_ERROR() sets the error and returns false from current
 *                   function.
 */
#ifdef PB_NO_ERRMSG
#define PB_SET_ERROR(stream, msg) PB_UNUSED(stream)
#define PB_GET_ERROR(stream) "(errmsg disabled)"
#else
#define PB_SET_ERROR(stream, msg) (stream->errmsg = (stream)->errmsg ? (stream)->errmsg : (msg))
#define PB_GET_ERROR(stream) ((stream)->errmsg ? (stream)->errmsg : "(none)")
#endif

#define PB_RETURN_ERROR(stream, msg) return PB_SET_ERROR(stream, msg), false

#ifdef __cplusplus
} /* extern "C" */
#endif

#ifdef __cplusplus
#if __cplusplus >= 201103L
#define PB_CONSTEXPR constexpr
#else  // __cplusplus >= 201103L
#define PB_CONSTEXPR
#endif  // __cplusplus >= 201103L

#if __cplusplus >= 201703L
#define PB_INLINE_CONSTEXPR inline constexpr
#else  // __cplusplus >= 201703L
#define PB_INLINE_CONSTEXPR PB_CONSTEXPR
#endif  // __cplusplus >= 201703L

namespace nanopb {
// Each type will be partially specialized by the generator.
template <typename GenMessageT> struct MessageDescriptor;
}  // namespace nanopb
#endif  /* __cplusplus */

#endif



================================================
FILE: c/core/include/pb_common.h
================================================
/* pb_common.h: Common support functions for pb_encode.c and pb_decode.c.
 * These functions are rarely needed by applications directly.
 */

#ifndef PB_COMMON_H_INCLUDED
#define PB_COMMON_H_INCLUDED

#include "pb.h"

#ifdef __cplusplus
extern "C" {
#endif

/* Initialize the field iterator structure to beginning.
 * Returns false if the message type is empty. */
bool pb_field_iter_begin(pb_field_iter_t *iter, const pb_msgdesc_t *desc, void *message);

/* Get a field iterator for extension field. */
bool pb_field_iter_begin_extension(pb_field_iter_t *iter, pb_extension_t *extension);

/* Same as pb_field_iter_begin(), but for const message pointer.
 * Note that the pointers in pb_field_iter_t will be non-const but shouldn't
 * be written to when using these functions. */
bool pb_field_iter_begin_const(pb_field_iter_t *iter, const pb_msgdesc_t *desc, const void *message);
bool pb_field_iter_begin_extension_const(pb_field_iter_t *iter, const pb_extension_t *extension);

/* Advance the iterator to the next field.
 * Returns false when the iterator wraps back to the first field. */
bool pb_field_iter_next(pb_field_iter_t *iter);

/* Advance the iterator until it points at a field with the given tag.
 * Returns false if no such field exists. */
bool pb_field_iter_find(pb_field_iter_t *iter, uint32_t tag);

#ifdef PB_VALIDATE_UTF8
/* Validate UTF-8 text string */
bool pb_validate_utf8(const char *s);
#endif

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif



================================================
FILE: c/core/include/pb_decode.h
================================================
/* pb_decode.h: Functions to decode protocol buffers. Depends on pb_decode.c.
 * The main function is pb_decode. You also need an input stream, and the
 * field descriptions created by nanopb_generator.py.
 */

#ifndef PB_DECODE_H_INCLUDED
#define PB_DECODE_H_INCLUDED

#include "pb.h"

#ifdef __cplusplus
extern "C" {
#endif

/* Structure for defining custom input streams. You will need to provide
 * a callback function to read the bytes from your storage, which can be
 * for example a file or a network socket.
 * 
 * The callback must conform to these rules:
 *
 * 1) Return false on IO errors. This will cause decoding to abort.
 * 2) You can use state to store your own data (e.g. buffer pointer),
 *    and rely on pb_read to verify that no-body reads past bytes_left.
 * 3) Your callback may be used with substreams, in which case bytes_left
 *    is different than from the main stream. Don't use bytes_left to compute
 *    any pointers.
 */
struct pb_istream_s
{
#ifdef PB_BUFFER_ONLY
    /* Callback pointer is not used in buffer-only configuration.
     * Having an int pointer here allows binary compatibility but
     * gives an error if someone tries to assign callback function.
     */
    int *callback;
#else
    bool (*callback)(pb_istream_t *stream, pb_byte_t *buf, size_t count);
#endif

    void *state; /* Free field for use by callback implementation */
    size_t bytes_left;
    
#ifndef PB_NO_ERRMSG
    const char *errmsg;
#endif
};

#ifndef PB_NO_ERRMSG
#define PB_ISTREAM_EMPTY {0,0,0,0}
#else
#define PB_ISTREAM_EMPTY {0,0,0}
#endif

/***************************
 * Main decoding functions *
 ***************************/
 
/* Decode a single protocol buffers message from input stream into a C structure.
 * Returns true on success, false on any failure.
 * The actual struct pointed to by dest must match the description in fields.
 * Callback fields of the destination structure must be initialized by caller.
 * All other fields will be initialized by this function.
 *
 * Example usage:
 *    MyMessage msg = {};
 *    uint8_t buffer[64];
 *    pb_istream_t stream;
 *    
 *    // ... read some data into buffer ...
 *
 *    stream = pb_istream_from_buffer(buffer, count);
 *    pb_decode(&stream, MyMessage_fields, &msg);
 */
bool pb_decode(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct);

/* Extended version of pb_decode, with several options to control
 * the decoding process:
 *
 * PB_DECODE_NOINIT:         Do not initialize the fields to default values.
 *                           This is slightly faster if you do not need the default
 *                           values and instead initialize the structure to 0 using
 *                           e.g. memset(). This can also be used for merging two
 *                           messages, i.e. combine already existing data with new
 *                           values.
 *
 * PB_DECODE_DELIMITED:      Input message starts with the message size as varint.
 *                           Corresponds to parseDelimitedFrom() in Google's
 *                           protobuf API.
 *
 * PB_DECODE_NULLTERMINATED: Stop reading when field tag is read as 0. This allows
 *                           reading null terminated messages.
 *                           NOTE: Until nanopb-0.4.0, pb_decode() also allows
 *                           null-termination. This behaviour is not supported in
 *                           most other protobuf implementations, so PB_DECODE_DELIMITED
 *                           is a better option for compatibility.
 *
 * Multiple flags can be combined with bitwise or (| operator)
 */
#define PB_DECODE_NOINIT          0x01U
#define PB_DECODE_DELIMITED       0x02U
#define PB_DECODE_NULLTERMINATED  0x04U
bool pb_decode_ex(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct, unsigned int flags);

/* Defines for backwards compatibility with code written before nanopb-0.4.0 */
#define pb_decode_noinit(s,f,d) pb_decode_ex(s,f,d, PB_DECODE_NOINIT)
#define pb_decode_delimited(s,f,d) pb_decode_ex(s,f,d, PB_DECODE_DELIMITED)
#define pb_decode_delimited_noinit(s,f,d) pb_decode_ex(s,f,d, PB_DECODE_DELIMITED | PB_DECODE_NOINIT)
#define pb_decode_nullterminated(s,f,d) pb_decode_ex(s,f,d, PB_DECODE_NULLTERMINATED)

#ifdef PB_ENABLE_MALLOC
/* Release any allocated pointer fields. If you use dynamic allocation, you should
 * call this for any successfully decoded message when you are done with it. If
 * pb_decode() returns with an error, the message is already released.
 */
void pb_release(const pb_msgdesc_t *fields, void *dest_struct);
#endif


/**************************************
 * Functions for manipulating streams *
 **************************************/

/* Create an input stream for reading from a memory buffer.
 *
 * Alternatively, you can use a custom stream that reads directly from e.g.
 * a file or a network socket.
 */
pb_istream_t pb_istream_from_buffer(const pb_byte_t *buf, size_t bufsize);

/* Function to read from a pb_istream_t. You can use this if you need to
 * read some custom header data, or to read data in field callbacks.
 */
bool pb_read(pb_istream_t *stream, pb_byte_t *buf, size_t count);


/************************************************
 * Helper functions for writing field callbacks *
 ************************************************/

/* Decode the tag for the next field in the stream. Gives the wire type and
 * field tag. At end of the message, returns false and sets eof to true. */
bool pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, uint32_t *tag, bool *eof);

/* Skip the field payload data, given the wire type. */
bool pb_skip_field(pb_istream_t *stream, pb_wire_type_t wire_type);

/* Decode an integer in the varint format. This works for enum, int32,
 * int64, uint32 and uint64 field types. */
#ifndef PB_WITHOUT_64BIT
bool pb_decode_varint(pb_istream_t *stream, uint64_t *dest);
#else
#define pb_decode_varint pb_decode_varint32
#endif

/* Decode an integer in the varint format. This works for enum, int32,
 * and uint32 field types. */
bool pb_decode_varint32(pb_istream_t *stream, uint32_t *dest);

/* Decode a bool value in varint format. */
bool pb_decode_bool(pb_istream_t *stream, bool *dest);

/* Decode an integer in the zig-zagged svarint format. This works for sint32
 * and sint64. */
#ifndef PB_WITHOUT_64BIT
bool pb_decode_svarint(pb_istream_t *stream, int64_t *dest);
#else
bool pb_decode_svarint(pb_istream_t *stream, int32_t *dest);
#endif

/* Decode a fixed32, sfixed32 or float value. You need to pass a pointer to
 * a 4-byte wide C variable. */
bool pb_decode_fixed32(pb_istream_t *stream, void *dest);

#ifndef PB_WITHOUT_64BIT
/* Decode a fixed64, sfixed64 or double value. You need to pass a pointer to
 * a 8-byte wide C variable. */
bool pb_decode_fixed64(pb_istream_t *stream, void *dest);
#endif

#ifdef PB_CONVERT_DOUBLE_FLOAT
/* Decode a double value into float variable. */
bool pb_decode_double_as_float(pb_istream_t *stream, float *dest);
#endif

/* Make a limited-length substream for reading a PB_WT_STRING field. */
bool pb_make_string_substream(pb_istream_t *stream, pb_istream_t *substream);
bool pb_close_string_substream(pb_istream_t *stream, pb_istream_t *substream);

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif


================================================
FILE: c/core/include/pb_encode.h
================================================
/* pb_encode.h: Functions to encode protocol buffers. Depends on pb_encode.c.
 * The main function is pb_encode. You also need an output stream, and the
 * field descriptions created by nanopb_generator.py.
 */

#ifndef PB_ENCODE_H_INCLUDED
#define PB_ENCODE_H_INCLUDED

#include "pb.h"

#ifdef __cplusplus
extern "C" {
#endif

/* Structure for defining custom output streams. You will need to provide
 * a callback function to write the bytes to your storage, which can be
 * for example a file or a network socket.
 *
 * The callback must conform to these rules:
 *
 * 1) Return false on IO errors. This will cause encoding to abort.
 * 2) You can use state to store your own data (e.g. buffer pointer).
 * 3) pb_write will update bytes_written after your callback runs.
 * 4) Substreams will modify max_size and bytes_written. Don't use them
 *    to calculate any pointers.
 */
struct pb_ostream_s
{
#ifdef PB_BUFFER_ONLY
    /* Callback pointer is not used in buffer-only configuration.
     * Having an int pointer here allows binary compatibility but
     * gives an error if someone tries to assign callback function.
     * Also, NULL pointer marks a 'sizing stream' that does not
     * write anything.
     */
    int *callback;
#else
    bool (*callback)(pb_ostream_t *stream, const pb_byte_t *buf, size_t count);
#endif
    void *state;          /* Free field for use by callback implementation. */
    size_t max_size;      /* Limit number of output bytes written (or use SIZE_MAX). */
    size_t bytes_written; /* Number of bytes written so far. */
    
#ifndef PB_NO_ERRMSG
    const char *errmsg;
#endif
};

/***************************
 * Main encoding functions *
 ***************************/

/* Encode a single protocol buffers message from C structure into a stream.
 * Returns true on success, false on any failure.
 * The actual struct pointed to by src_struct must match the description in fields.
 * All required fields in the struct are assumed to have been filled in.
 *
 * Example usage:
 *    MyMessage msg = {};
 *    uint8_t buffer[64];
 *    pb_ostream_t stream;
 *
 *    msg.field1 = 42;
 *    stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
 *    pb_encode(&stream, MyMessage_fields, &msg);
 */
bool pb_encode(pb_ostream_t *stream, const pb_msgdesc_t *fields, const void *src_struct);

/* Extended version of pb_encode, with several options to control the
 * encoding process:
 *
 * PB_ENCODE_DELIMITED:      Prepend the length of message as a varint.
 *                           Corresponds to writeDelimitedTo() in Google's
 *                           protobuf API.
 *
 * PB_ENCODE_NULLTERMINATED: Append a null byte to the message for termination.
 *                           NOTE: This behaviour is not supported in most other
 *                           protobuf implementations, so PB_ENCODE_DELIMITED
 *                           is a better option for compatibility.
 */
#define PB_ENCODE_DELIMITED       0x02U
#define PB_ENCODE_NULLTERMINATED  0x04U
bool pb_encode_ex(pb_ostream_t *stream, const pb_msgdesc_t *fields, const void *src_struct, unsigned int flags);

/* Defines for backwards compatibility with code written before nanopb-0.4.0 */
#define pb_encode_delimited(s,f,d) pb_encode_ex(s,f,d, PB_ENCODE_DELIMITED)
#define pb_encode_nullterminated(s,f,d) pb_encode_ex(s,f,d, PB_ENCODE_NULLTERMINATED)

/* Encode the message to get the size of the encoded data, but do not store
 * the data. */
bool pb_get_encoded_size(size_t *size, const pb_msgdesc_t *fields, const void *src_struct);

/**************************************
 * Functions for manipulating streams *
 **************************************/

/* Create an output stream for writing into a memory buffer.
 * The number of bytes written can be found in stream.bytes_written after
 * encoding the message.
 *
 * Alternatively, you can use a custom stream that writes directly to e.g.
 * a file or a network socket.
 */
pb_ostream_t pb_ostream_from_buffer(pb_byte_t *buf, size_t bufsize);

/* Pseudo-stream for measuring the size of a message without actually storing
 * the encoded data.
 * 
 * Example usage:
 *    MyMessage msg = {};
 *    pb_ostream_t stream = PB_OSTREAM_SIZING;
 *    pb_encode(&stream, MyMessage_fields, &msg);
 *    printf("Message size is %d\n", stream.bytes_written);
 */
#ifndef PB_NO_ERRMSG
#define PB_OSTREAM_SIZING {0,0,0,0,0}
#else
#define PB_OSTREAM_SIZING {0,0,0,0}
#endif

/* Function to write into a pb_ostream_t stream. You can use this if you need
 * to append or prepend some custom headers to the message.
 */
bool pb_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count);


/************************************************
 * Helper functions for writing field callbacks *
 ************************************************/

/* Encode field header based on type and field number defined in the field
 * structure. Call this from the callback before writing out field contents. */
bool pb_encode_tag_for_field(pb_ostream_t *stream, const pb_field_iter_t *field);

/* Encode field header by manually specifing wire type. You need to use this
 * if you want to write out packed arrays from a callback field. */
bool pb_encode_tag(pb_ostream_t *stream, pb_wire_type_t wiretype, uint32_t field_number);

/* Encode an integer in the varint format.
 * This works for bool, enum, int32, int64, uint32 and uint64 field types. */
#ifndef PB_WITHOUT_64BIT
bool pb_encode_varint(pb_ostream_t *stream, uint64_t value);
#else
bool pb_encode_varint(pb_ostream_t *stream, uint32_t value);
#endif

/* Encode an integer in the zig-zagged svarint format.
 * This works for sint32 and sint64. */
#ifndef PB_WITHOUT_64BIT
bool pb_encode_svarint(pb_ostream_t *stream, int64_t value);
#else
bool pb_encode_svarint(pb_ostream_t *stream, int32_t value);
#endif

/* Encode a string or bytes type field. For strings, pass strlen(s) as size. */
bool pb_encode_string(pb_ostream_t *stream, const pb_byte_t *buffer, size_t size);

/* Encode a fixed32, sfixed32 or float value.
 * You need to pass a pointer to a 4-byte wide C variable. */
bool pb_encode_fixed32(pb_ostream_t *stream, const void *value);

#ifndef PB_WITHOUT_64BIT
/* Encode a fixed64, sfixed64 or double value.
 * You need to pass a pointer to a 8-byte wide C variable. */
bool pb_encode_fixed64(pb_ostream_t *stream, const void *value);
#endif

#ifdef PB_CONVERT_DOUBLE_FLOAT
/* Encode a float value so that it appears like a double in the encoded
 * message. */
bool pb_encode_float_as_double(pb_ostream_t *stream, float value);
#endif

/* Encode a submessage field.
 * You need to pass the pb_field_t array and pointer to struct, just like
 * with pb_encode(). This internally encodes the submessage twice, first to
 * calculate message size and then to actually write it out.
 */
bool pb_encode_submessage(pb_ostream_t *stream, const pb_msgdesc_t *fields, const void *src_struct);

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif


================================================
FILE: c/core/include/tahu.h
================================================
/********************************************************************************
 * Copyright (c) 2014-2019 Cirrus Link Solutions and others
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *   Cirrus Link Solutions - initial implementation
 ********************************************************************************/

#include <tahu.pb.h>

#include <time.h>
#include <sys/time.h>

#ifdef __MACH__
#include <mach/clock.h>
#include <mach/mach.h>
#endif

#ifndef _SPARKPLUGLIB_H_
#define _SPARKPLUGLIB_H_

#ifdef __cplusplus
extern "C" {
#endif

// Enable/disable debug messages
#define SPARKPLUG_DEBUG 1

#ifdef SPARKPLUG_DEBUG
#define DEBUG_PRINT(...) printf(__VA_ARGS__)
#else
#define DEBUG_PRINT(...) do {} while (0)
#endif

// Constants
#define DATA_SET_DATA_TYPE_UNKNOWN 0
#define DATA_SET_DATA_TYPE_INT8 1
#define DATA_SET_DATA_TYPE_INT16 2
#define DATA_SET_DATA_TYPE_INT32 3
#define DATA_SET_DATA_TYPE_INT64 4
#define DATA_SET_DATA_TYPE_UINT8 5
#define DATA_SET_DATA_TYPE_UINT16 6
#define DATA_SET_DATA_TYPE_UINT32 7
#define DATA_SET_DATA_TYPE_UINT64 8
#define DATA_SET_DATA_TYPE_FLOAT 9
#define DATA_SET_DATA_TYPE_DOUBLE 10
#define DATA_SET_DATA_TYPE_BOOLEAN 11
#define DATA_SET_DATA_TYPE_STRING 12
#define DATA_SET_DATA_TYPE_DATETIME 13
#define DATA_SET_DATA_TYPE_TEXT 14

#define METRIC_DATA_TYPE_UNKNOWN 0
#define METRIC_DATA_TYPE_INT8 1
#define METRIC_DATA_TYPE_INT16 2
#define METRIC_DATA_TYPE_INT32 3
#define METRIC_DATA_TYPE_INT64 4
#define METRIC_DATA_TYPE_UINT8 5
#define METRIC_DATA_TYPE_UINT16 6
#define METRIC_DATA_TYPE_UINT32 7
#define METRIC_DATA_TYPE_UINT64 8
#define METRIC_DATA_TYPE_FLOAT 9
#define METRIC_DATA_TYPE_DOUBLE 10
#define METRIC_DATA_TYPE_BOOLEAN 11
#define METRIC_DATA_TYPE_STRING 12
#define METRIC_DATA_TYPE_DATETIME 13
#define METRIC_DATA_TYPE_TEXT 14
#define METRIC_DATA_TYPE_UUID 15
#define METRIC_DATA_TYPE_DATASET 16
#define METRIC_DATA_TYPE_BYTES 17
#define METRIC_DATA_TYPE_FILE 18
#define METRIC_DATA_TYPE_TEMPLATE 19

#define PARAMETER_DATA_TYPE_UNKNOWN 0
#define PARAMETER_DATA_TYPE_INT8 1
#define PARAMETER_DATA_TYPE_INT16 2
#define PARAMETER_DATA_TYPE_INT32 3
#define PARAMETER_DATA_TYPE_INT64 4
#define PARAMETER_DATA_TYPE_UINT8 5
#define PARAMETER_DATA_TYPE_UINT16 6
#define PARAMETER_DATA_TYPE_UINT32 7
#define PARAMETER_DATA_TYPE_UINT64 8
#define PARAMETER_DATA_TYPE_FLOAT 9
#define PARAMETER_DATA_TYPE_DOUBLE 10
#define PARAMETER_DATA_TYPE_BOOLEAN 11
#define PARAMETER_DATA_TYPE_STRING 12
#define PARAMETER_DATA_TYPE_DATETIME 13
#define PARAMETER_DATA_TYPE_TEXT 14

#define PROPERTY_DATA_TYPE_UNKNOWN 0
#define PROPERTY_DATA_TYPE_INT8 1
#define PROPERTY_DATA_TYPE_INT16 2
#define PROPERTY_DATA_TYPE_INT32 3
#define PROPERTY_DATA_TYPE_INT64 4
#define PROPERTY_DATA_TYPE_UINT8 5
#define PROPERTY_DATA_TYPE_UINT16 6
#define PROPERTY_DATA_TYPE_UINT32 7
#define PROPERTY_DATA_TYPE_UINT64 8
#define PROPERTY_DATA_TYPE_FLOAT 9
#define PROPERTY_DATA_TYPE_DOUBLE 10
#define PROPERTY_DATA_TYPE_BOOLEAN 11
#define PROPERTY_DATA_TYPE_STRING 12
#define PROPERTY_DATA_TYPE_DATETIME 13
#define PROPERTY_DATA_TYPE_TEXT 14

/**
 * Attach Metadata to an existing Metric.
 *
 * <p>Caution: The metadata structure is duplicated via shallow copy, and
 * it is expected that any pointers within it are safe to pass to free().
 * This will happen if pb_release() is called on this structure or any
 * structure referencing it, for example via a call to free_payload().
 *
 * @param metric   Pointer to destination metric that metadata will be added to
 * @param metadata Pointer to a source metadata structure that will be copied onto metric
 *
 * @return Returns >= 0 on success, or negative on failure
 */
int add_metadata_to_metric(org_eclipse_tahu_protobuf_Payload_Metric *metric,
                           org_eclipse_tahu_protobuf_Payload_MetaData *metadata);

/**
 * Attach a Metric to an existing Payload.
 *
 * <p>Caution: The metric structure is duplicated via shallow
 * copy, and it is expected that any pointers within it are safe
 * to pass to free(). This will happen if pb_release() is called
 * on this structure or any structure referencing it, for
 * example via a call to free_payload().
 *
 * @param payload Pointer to the destination payload that metric will be added to
 * @param metric  Pointer to source metric structure that will be copied onto payload
 *
 * @return Returns >= 0 on success, or negative on failure
 */
int add_metric_to_payload(org_eclipse_tahu_protobuf_Payload *payload,
                          org_eclipse_tahu_protobuf_Payload_Metric *metric);

/**
 * Helper function to properly cast and push a value into the propertyvalue data structure.
 *
 * <p>Mostly useful when directly building property structures.
 *
 * (No pointers passed into this function are retained by the target structure)
 *
 * @param propertyvalue
 *                 Pointer to propertyvalue structure to receive the value
 * @param datatype Datatype of the value being received (e.g. PROPERTY_DATA_TYPE_INT8)
 * @param value    Pointer to the value to use (cannot be NULL)
 * @param size     Size of the memory pointed to by value
 *
 * @return Returns >= 0 on success, or negative on failure
 */
int set_propertyvalue(org_eclipse_tahu_protobuf_Payload_PropertyValue *propertyvalue,
                      uint32_t datatype,
                      const void *value,
                      size_t size);

/**
 * Add a simple Property to an existing PropertySet
 *
 * (No pointers passed into this function are retained by the target structure)
 *
 * @param propertyset
 *               Pointer to destination PropertySet that property will be added to
 * @param key    Pointer to null-terminated string giving name of new property
 * @param type   Datatype of new property value (e.g. PROPERTY_DATA_TYPE_INT8)
 * @param value  Pointer to value to use for new property, or NULL if reported property value should be NULL.
 * @param size_of_value
 *               Size of data pointed to by value
 *
 * @return Returns >= 0 on success, or negative on failure
 */
int add_property_to_set(org_eclipse_tahu_protobuf_Payload_PropertySet *propertyset,
                        const char *key,
                        uint32_t type,
                        const void *value,
                        size_t size_of_value);

/**
 * Add a PropertySet to an existing Metric
 *
 * <p>Caution: The propertyset structure is duplicated via shallow
 * copy, and it is expected that any pointers within it are safe
 * to pass to free(). This will happen if pb_release() is called
 * on this structure or any structure referencing it, for
 * example via a call to free_payload().
 *
 * @param metric     Pointer to the destination metric that propertyset will be added to
 * @param properties Pointer to source propertyset structure that will be copied onto metric
 *
 * @return Returns >= 0 on success, or negative on failure
 */
int add_propertyset_to_metric(org_eclipse_tahu_protobuf_Payload_Metric *metric,
                              org_eclipse_tahu_protobuf_Payload_PropertySet *properties);

/**
 * Helper function to properly cast and push a value into the
 * metric data structure.
 *
 * <p>Mostly useful when directly building metric structures.
 *
 * <p>Caution: When using datatype METRIC_DATA_TYPE_DATASET or
 * METRIC_DATA_TYPE_TEMPLATE, the structure passed in via value
 * is duplicated using a shallow copy, and it is expected that
 * any pointers within it are safe to pass to free(). This will
 * happen if pb_release() is called on the metric or any
 * structure referencing it, for example via a call to
 * free_payload().
 *
 * When using other datatype values, no pointers are retained by the metric.
 *
 * @param metric
 *                 Pointer to metric structure to receive the
 *                 value
 * @param datatype Datatype of the value being received (e.g. PROPERTY_DATA_TYPE_INT8)
 * @param value    Pointer to the value to use (cannot be NULL)
 * @param size     Size of the memory pointed to by value
 *
 * @return Returns >= 0 on success, or negative on failure
 */
int set_metric_value(org_eclipse_tahu_protobuf_Payload_Metric *metric, uint32_t datatype, const void *value, size_t size);

/**
 * Add a simple Metric to an existing Payload
 *
 * <p>Caution: When using datatype METRIC_DATA_TYPE_DATASET or
 * METRIC_DATA_TYPE_TEMPLATE, the structure passed in via value
 * is duplicated using a shallow copy, and it is expected that
 * any pointers within it are safe to pass to free(). This will
 * happen if pb_release() is called on the metric or any
 * structure referencing it, for example via a call to
 * free_payload().
 *
 * When using other datatype values, no pointers are retained by the metric.
 *
 * CAUTION: The underlying library will allocate memory as
 * needed when building the structure.  On success, it will be
 * necessary to call free_payload() on the structure to release
 * those allocations.
 *
 * @param payload   Pointer to the destination payload that metric will be added to
 * @param name      Pointer to null-terminated string giving name of metric; may be NULL if not using name field on this metric
 * @param has_alias Boolean indicating if the alias number should be included on the metric
 * @param alias     Alias number to use if has_alias is true
 * @param datatype  Datatype of the value (e.g. METRIC_DATA_TYPE_BOOLEAN)
 * @param is_historical
 *                  Boolean indicating if is_historical falg should be set on this metric
 * @param is_transient
 *                  Boolean if is_transient flag should be set on this metric
 * @param value     Pointer to value to use for metric; may be NULL if desired to set is_null flag and not include a value
 * @param size_of_value
 *                  Size of data pointed to by value
 *
 * @return Returns >= 0 on success, or negative on failure
 */
int add_simple_metric(org_eclipse_tahu_protobuf_Payload *payload,
                      const char *name,
                      bool has_alias,
                      uint64_t alias,
                      uint64_t datatype,
                      bool is_historical,
                      bool is_transient,
                      const void *value,
                      size_t size_of_value);

/**
 * Encode a Payload into an array of bytes
 *
 * @param out_buffer Pointer to destination buffer to receive
 *                   the encoded payload, or NULL if you just
 *                   want to calculate the size of the encoded
 *                   payload
 * @param buffer_length
 *                   Size of the destination buffer in bytes
 * @param payload    Pointer to the source payload structure
 *
 * @return Returns the size of the encoded payload in bytes on
 *         success, or -1 on failure
 */
ssize_t encode_payload(uint8_t *out_buffer,
                       size_t buffer_length,
                       const org_eclipse_tahu_protobuf_Payload *payload);

/**
 * Build a payload structure from an encoded buffer
 *
 * <p>CAUTION: The underlying library will allocate memory as
 * needed when building the structure.  On success, it will be
 * necessary to call free_payload() on the structure to release
 * those allocations when done using it.
 *
 * @param payload   Pointer to the destination structure to receive the payload;
 *                  WARNING: any memory allocations referenced
 *                  by the payload structure before it is passed
 *                  into this function will be lost.  They
 *                  should be explicitly freed first if
 *                  necessary.
 * @param in_buffer Pointer to the buffer holding the encoded payload
 * @param buffer_length
 *                  Size of the incoming buffer
 *
 * @return Returns negative on failure, or number of bytes
 *         unused from buffer_length on success
 */
ssize_t decode_payload(org_eclipse_tahu_protobuf_Payload *payload,
                       const uint8_t *in_buffer,
                       size_t buffer_length);

/**
 * Free memory from an existing Payload
 *
 * <p>This walks through the payload structure and any sub-structures it references, and frees all pointers as dynamic allocations.
 *
 * <p>This does NOT release the payload structure itself.  It is up to the calling application to do that if necessary.
 *
 * @param payload Pointer to the Payload structure to release.
 *
 * @return Returns >= 0 on success, or negative on failure
 */
int free_payload(org_eclipse_tahu_protobuf_Payload *payload);

/**
 * Get the current timestamp in milliseconds (format used inside SparkPlug payloads)
 *
 * @return The current timestamp in milliseconds since Jan 1, 1970 UTC.
 */
uint64_t get_current_timestamp(void);

/**
 * Reset the sequence number to 0.
 *
 * This should be used just before starting a new NBIRTH message.
 */
void reset_sparkplug_sequence(void);

/**
 * Get the next empty Payload.
 *
 * <p>This does the initial payload setup including the timestamp and sequence number.
 *
 * @param payload Pointer to the destination payload structure to setup;
 *                WARNING: any memory allocations referenced
 *                by the payload structure before it is passed
 *                into this function will be lost.  They
 *                should be explicitly freed first if
 *                necessary.
 *
 * @return Returns >= 0 on success, or negative on failure
 */
int get_next_payload(org_eclipse_tahu_protobuf_Payload *payload);

/**
 * Initialize a Dataset with the values passed in
 *
 * <p>Caution: The row value structures are duplicated via
 * shallow copy, and it is expected that any pointers within
 * them are safe to pass to free(). This will happen if
 * pb_release() is called on this structure or any structure
 * referencing it, for example via a call to free_payload().
 *
 * @param dataset   Pointer to dataset to initialize
 *                  WARNING: any memory allocations referenced
 *                  by the dataset structure before it is passed
 *                  into this function will be lost.  They
 *                  should be explicitly freed first if
 *                  necessary.
 * @param num_of_rows
 *                  Number of rows in the dataset
 * @param num_of_columns
 *                  Number of columns in the dataset
 * @param datatypes Array of datatypes, one per column (e.g. DATA_SET_DATA_TYPE_INT8)
 * @param column_keys
 *                  Array of pointers to null-terminated strings
 *                  giving names for each column (these strings
 *                  are copied into new allocations)
 * @param row_data  Array of row value structures
 *
 * @return Returns >= 0 on success, or negative on failure
 */
int init_dataset(org_eclipse_tahu_protobuf_Payload_DataSet *dataset,
                 uint64_t num_of_rows,
                 uint64_t num_of_columns,
                 const uint32_t datatypes[],
                 const char *column_keys[],
                 const org_eclipse_tahu_protobuf_Payload_DataSet_Row row_data[]);

/**
 * Initialize a Metric with the values of the arguments passed in
 *
 * <p>Caution: When using datatype METRIC_DATA_TYPE_DATASET or
 * METRIC_DATA_TYPE_TEMPLATE, the structure passed in via value
 * is duplicated using a shallow copy, and it is expected that
 * any pointers within it are safe to pass to free(). This will
 * happen if pb_release() is called on the metric or any
 * structure referencing it, for example via a call to
 * free_payload().
 *
 * <p>When using other datatype values, no pointers are retained by the metric.
 *
 * <p>CAUTION: The underlying library will allocate memory as
 * needed when building the structure.  On success, it will be
 * necessary to call free_payload() on the structure to release
 * those allocations.
 *
 * @param metric    Pointer to the metric data structure to initialize;
 *                  WARNING: any memory allocations referenced
 *                  by the metric structure before it is passed
 *                  into this function will be lost.  They
 *                  should be explicitly freed first if
 *                  necessary.
 * @param name      Pointer to null-terminated string giving name of metric; may be NULL if not using name field on this metric
 * @param has_alias Boolean indicating if the alias number should be included on the metric
 * @param alias     Alias number to use if has_alias is true
 * @param datatype  Datatype of the value (e.g. METRIC_DATA_TYPE_BOOLEAN)
 * @param is_historical
 *                  Boolean indicating if is_historical falg should be set on this metric
 * @param is_transient
 *                  Boolean if is_transient flag should be set on this metric
 * @param value     Pointer to value to use for metric; may be NULL if desired to set is_null flag and not include a value
 * @param size_of_value
 *                  Size of data pointed to by value
 *
 * @return Returns >= 0 on success, or negative on failure
 */
int init_metric(org_eclipse_tahu_protobuf_Payload_Metric *metric,
                const char *name,
                bool has_alias,
                uint64_t alias,
                uint64_t datatype,
                bool is_historical,
                bool is_transient,
                const void *value,
                size_t size_of_value);

/**
 * Display a full Sparkplug Payload
 *
 * @param payload Pointer to the payload structure to display
 */
void print_payload(org_eclipse_tahu_protobuf_Payload *payload);

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif



================================================
FILE: c/core/include/tahu.pb.h
================================================
/* Automatically generated nanopb header */
/* Generated by nanopb-0.4.1 */

#ifndef PB_ORG_ECLIPSE_TAHU_PROTOBUF_TAHU_PB_H_INCLUDED
#define PB_ORG_ECLIPSE_TAHU_PROTOBUF_TAHU_PB_H_INCLUDED
#include <pb.h>

#if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator.
#endif

#ifdef __cplusplus
extern "C" {
#endif

/* Struct definitions */
typedef struct _org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_DataSetValueExtension {
    pb_extension_t *extensions;
} org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_DataSetValueExtension;

typedef struct _org_eclipse_tahu_protobuf_Payload_DataSet_Row {
    pb_size_t elements_count;
    struct _org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue *elements;
    pb_extension_t *extensions;
} org_eclipse_tahu_protobuf_Payload_DataSet_Row;

typedef struct _org_eclipse_tahu_protobuf_Payload_Metric_MetricValueExtension {
    pb_extension_t *extensions;
} org_eclipse_tahu_protobuf_Payload_Metric_MetricValueExtension;

typedef struct _org_eclipse_tahu_protobuf_Payload_PropertySet {
    pb_size_t keys_count;
    char **keys;
    pb_size_t values_count;
    struct _org_eclipse_tahu_protobuf_Payload_PropertyValue *values;
    pb_extension_t *extensions;
} org_eclipse_tahu_protobuf_Payload_PropertySet;

typedef struct _org_eclipse_tahu_protobuf_Payload_PropertySetList {
    pb_size_t propertyset_count;
    struct _org_eclipse_tahu_protobuf_Payload_PropertySet *propertyset;
    pb_extension_t *extensions;
} org_eclipse_tahu_protobuf_Payload_PropertySetList;

typedef struct _org_eclipse_tahu_protobuf_Payload_PropertyValue_PropertyValueExtension {
    pb_extension_t *extensions;
} org_eclipse_tahu_protobuf_Payload_PropertyValue_PropertyValueExtension;

typedef struct _org_eclipse_tahu_protobuf_Payload_Template_Parameter_ParameterValueExtension {
    pb_extension_t *extensions;
} org_eclipse_tahu_protobuf_Payload_Template_Parameter_ParameterValueExtension;

typedef struct _org_eclipse_tahu_protobuf_Payload {
    bool has_timestamp;
    uint64_t timestamp;
    pb_size_t metrics_count;
    struct _org_eclipse_tahu_protobuf_Payload_Metric *metrics;
    bool has_seq;
    uint64_t seq;
    char *uuid;
    pb_bytes_array_t *body;
    pb_extension_t *extensions;
} org_eclipse_tahu_protobuf_Payload;

typedef struct _org_eclipse_tahu_protobuf_Payload_DataSet {
    bool has_num_of_columns;
    uint64_t num_of_columns;
    pb_size_t columns_count;
    char **columns;
    pb_size_t types_count;
    uint32_t *types;
    pb_size_t rows_count;
    struct _org_eclipse_tahu_protobuf_Payload_DataSet_Row *rows;
    pb_extension_t *extensions;
} org_eclipse_tahu_protobuf_Payload_DataSet;

typedef struct _org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue {
    pb_size_t which_value;
    union {
        uint32_t int_value;
        uint64_t long_value;
        float float_value;
        double double_value;
        bool boolean_value;
        char *string_value;
        org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_DataSetValueExtension extension_value;
    } value;
} org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue;

typedef struct _org_eclipse_tahu_protobuf_Payload_MetaData {
    bool has_is_multi_part;
    bool is_multi_part;
    char *content_type;
    bool has_size;
    uint64_t size;
    bool has_seq;
    uint64_t seq;
    char *file_name;
    char *file_type;
    char *md5;
    char *description;
    pb_extension_t *extensions;
} org_eclipse_tahu_protobuf_Payload_MetaData;

typedef struct _org_eclipse_tahu_protobuf_Payload_PropertyValue {
    bool has_type;
    uint32_t type;
    bool has_is_null;
    bool is_null;
    pb_size_t which_value;
    union {
        uint32_t int_value;
        uint64_t long_value;
        float float_value;
        double double_value;
        bool boolean_value;
        char *string_value;
        org_eclipse_tahu_protobuf_Payload_PropertySet propertyset_value;
        org_eclipse_tahu_protobuf_Payload_PropertySetList propertysets_value;
        org_eclipse_tahu_protobuf_Payload_PropertyValue_PropertyValueExtension extension_value;
    } value;
} org_eclipse_tahu_protobuf_Payload_PropertyValue;

typedef struct _org_eclipse_tahu_protobuf_Payload_Template {
    char *version;
    pb_size_t metrics_count;
    struct _org_eclipse_tahu_protobuf_Payload_Metric *metrics;
    pb_size_t parameters_count;
    struct _org_eclipse_tahu_protobuf_Payload_Template_Parameter *parameters;
    char *template_ref;
    bool has_is_definition;
    bool is_definition;
    pb_extension_t *extensions;
} org_eclipse_tahu_protobuf_Payload_Template;

typedef struct _org_eclipse_tahu_protobuf_Payload_Template_Parameter {
    char *name;
    bool has_type;
    uint32_t type;
    pb_size_t which_value;
    union {
        uint32_t int_value;
        uint64_t long_value;
        float float_value;
        double double_value;
        bool boolean_value;
        char *string_value;
        org_eclipse_tahu_protobuf_Payload_Template_Parameter_ParameterValueExtension extension_value;
    } value;
} org_eclipse_tahu_protobuf_Payload_Template_Parameter;

typedef struct _org_eclipse_tahu_protobuf_Payload_Metric {
    char *name;
    bool has_alias;
    uint64_t alias;
    bool has_timestamp;
    uint64_t timestamp;
    bool has_datatype;
    uint32_t datatype;
    bool has_is_historical;
    bool is_historical;
    bool has_is_transient;
    bool is_transient;
    bool has_is_null;
    bool is_null;
    bool has_metadata;
    org_eclipse_tahu_protobuf_Payload_MetaData metadata;
    bool has_properties;
    org_eclipse_tahu_protobuf_Payload_PropertySet properties;
    pb_size_t which_value;
    union {
        uint32_t int_value;
        uint64_t long_value;
        float float_value;
        double double_value;
        bool boolean_value;
        char *string_value;
        pb_bytes_array_t *bytes_value;
        org_eclipse_tahu_protobuf_Payload_DataSet dataset_value;
        org_eclipse_tahu_protobuf_Payload_Template template_value;
        org_eclipse_tahu_protobuf_Payload_Metric_MetricValueExtension extension_value;
    } value;
} org_eclipse_tahu_protobuf_Payload_Metric;


/* Initializer values for message structs */
#define org_eclipse_tahu_protobuf_Payload_init_default {false, 0, 0, NULL, false, 0, NULL, NULL, NULL}
#define org_eclipse_tahu_protobuf_Payload_Template_init_default {NULL, 0, NULL, 0, NULL, NULL, false, 0, NULL}
#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_init_default {NULL, false, 0, 0, {0}}
#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_ParameterValueExtension_init_default {NULL}
#define org_eclipse_tahu_protobuf_Payload_DataSet_init_default {false, 0, 0, NULL, 0, NULL, 0, NULL, NULL}
#define org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_init_default {0, {0}}
#define org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_DataSetValueExtension_init_default {NULL}
#define org_eclipse_tahu_protobuf_Payload_DataSet_Row_init_default {0, NULL, NULL}
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_init_default {false, 0, false, 0, 0, {0}}
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_PropertyValueExtension_init_default {NULL}
#define org_eclipse_tahu_protobuf_Payload_PropertySet_init_default {0, NULL, 0, NULL, NULL}
#define org_eclipse_tahu_protobuf_Payload_PropertySetList_init_default {0, NULL, NULL}
#define org_eclipse_tahu_protobuf_Payload_MetaData_init_default {false, 0, NULL, false, 0, false, 0, NULL, NULL, NULL, NULL, NULL}
#define org_eclipse_tahu_protobuf_Payload_Metric_init_default {NULL, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, org_eclipse_tahu_protobuf_Payload_MetaData_init_default, false, org_eclipse_tahu_protobuf_Payload_PropertySet_init_default, 0, {0}}
#define org_eclipse_tahu_protobuf_Payload_Metric_MetricValueExtension_init_default {NULL}
#define org_eclipse_tahu_protobuf_Payload_init_zero {false, 0, 0, NULL, false, 0, NULL, NULL, NULL}
#define org_eclipse_tahu_protobuf_Payload_Template_init_zero {NULL, 0, NULL, 0, NULL, NULL, false, 0, NULL}
#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_init_zero {NULL, false, 0, 0, {0}}
#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_ParameterValueExtension_init_zero {NULL}
#define org_eclipse_tahu_protobuf_Payload_DataSet_init_zero {false, 0, 0, NULL, 0, NULL, 0, NULL, NULL}
#define org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_init_zero {0, {0}}
#define org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_DataSetValueExtension_init_zero {NULL}
#define org_eclipse_tahu_protobuf_Payload_DataSet_Row_init_zero {0, NULL, NULL}
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_init_zero {false, 0, false, 0, 0, {0}}
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_PropertyValueExtension_init_zero {NULL}
#define org_eclipse_tahu_protobuf_Payload_PropertySet_init_zero {0, NULL, 0, NULL, NULL}
#define org_eclipse_tahu_protobuf_Payload_PropertySetList_init_zero {0, NULL, NULL}
#define org_eclipse_tahu_protobuf_Payload_MetaData_init_zero {false, 0, NULL, false, 0, false, 0, NULL, NULL, NULL, NULL, NULL}
#define org_eclipse_tahu_protobuf_Payload_Metric_init_zero {NULL, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, org_eclipse_tahu_protobuf_Payload_MetaData_init_zero, false, org_eclipse_tahu_protobuf_Payload_PropertySet_init_zero, 0, {0}}
#define org_eclipse_tahu_protobuf_Payload_Metric_MetricValueExtension_init_zero {NULL}

/* Field tags (for use in manual encoding/decoding) */
#define org_eclipse_tahu_protobuf_Payload_DataSet_Row_elements_tag 1
#define org_eclipse_tahu_protobuf_Payload_PropertySet_keys_tag 1
#define org_eclipse_tahu_protobuf_Payload_PropertySet_values_tag 2
#define org_eclipse_tahu_protobuf_Payload_PropertySetList_propertyset_tag 1
#define org_eclipse_tahu_protobuf_Payload_timestamp_tag 1
#define org_eclipse_tahu_protobuf_Payload_metrics_tag 2
#define org_eclipse_tahu_protobuf_Payload_seq_tag 3
#define org_eclipse_tahu_protobuf_Payload_uuid_tag 4
#define org_eclipse_tahu_protobuf_Payload_body_tag 5
#define org_eclipse_tahu_protobuf_Payload_DataSet_num_of_columns_tag 1
#define org_eclipse_tahu_protobuf_Payload_DataSet_columns_tag 2
#define org_eclipse_tahu_protobuf_Payload_DataSet_types_tag 3
#define org_eclipse_tahu_protobuf_Payload_DataSet_rows_tag 4
#define org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_int_value_tag 1
#define org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_long_value_tag 2
#define org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_float_value_tag 3
#define org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_double_value_tag 4
#define org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_boolean_value_tag 5
#define org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_string_value_tag 6
#define org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_extension_value_tag 7
#define org_eclipse_tahu_protobuf_Payload_MetaData_is_multi_part_tag 1
#define org_eclipse_tahu_protobuf_Payload_MetaData_content_type_tag 2
#define org_eclipse_tahu_protobuf_Payload_MetaData_size_tag 3
#define org_eclipse_tahu_protobuf_Payload_MetaData_seq_tag 4
#define org_eclipse_tahu_protobuf_Payload_MetaData_file_name_tag 5
#define org_eclipse_tahu_protobuf_Payload_MetaData_file_type_tag 6
#define org_eclipse_tahu_protobuf_Payload_MetaData_md5_tag 7
#define org_eclipse_tahu_protobuf_Payload_MetaData_description_tag 8
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_int_value_tag 3
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_long_value_tag 4
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_float_value_tag 5
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_double_value_tag 6
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_boolean_value_tag 7
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_string_value_tag 8
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_propertyset_value_tag 9
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_propertysets_value_tag 10
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_extension_value_tag 11
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_type_tag 1
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_is_null_tag 2
#define org_eclipse_tahu_protobuf_Payload_Template_version_tag 1
#define org_eclipse_tahu_protobuf_Payload_Template_metrics_tag 2
#define org_eclipse_tahu_protobuf_Payload_Template_parameters_tag 3
#define org_eclipse_tahu_protobuf_Payload_Template_template_ref_tag 4
#define org_eclipse_tahu_protobuf_Payload_Template_is_definition_tag 5
#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_int_value_tag 3
#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_long_value_tag 4
#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_float_value_tag 5
#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_double_value_tag 6
#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_boolean_value_tag 7
#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_string_value_tag 8
#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_extension_value_tag 9
#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_name_tag 1
#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_type_tag 2
#define org_eclipse_tahu_protobuf_Payload_Metric_int_value_tag 10
#define org_eclipse_tahu_protobuf_Payload_Metric_long_value_tag 11
#define org_eclipse_tahu_protobuf_Payload_Metric_float_value_tag 12
#define org_eclipse_tahu_protobuf_Payload_Metric_double_value_tag 13
#define org_eclipse_tahu_protobuf_Payload_Metric_boolean_value_tag 14
#define org_eclipse_tahu_protobuf_Payload_Metric_string_value_tag 15
#define org_eclipse_tahu_protobuf_Payload_Metric_bytes_value_tag 16
#define org_eclipse_tahu_protobuf_Payload_Metric_dataset_value_tag 17
#define org_eclipse_tahu_protobuf_Payload_Metric_template_value_tag 18
#define org_eclipse_tahu_protobuf_Payload_Metric_extension_value_tag 19
#define org_eclipse_tahu_protobuf_Payload_Metric_name_tag 1
#define org_eclipse_tahu_protobuf_Payload_Metric_alias_tag 2
#define org_eclipse_tahu_protobuf_Payload_Metric_timestamp_tag 3
#define org_eclipse_tahu_protobuf_Payload_Metric_datatype_tag 4
#define org_eclipse_tahu_protobuf_Payload_Metric_is_historical_tag 5
#define org_eclipse_tahu_protobuf_Payload_Metric_is_transient_tag 6
#define org_eclipse_tahu_protobuf_Payload_Metric_is_null_tag 7
#define org_eclipse_tahu_protobuf_Payload_Metric_metadata_tag 8
#define org_eclipse_tahu_protobuf_Payload_Metric_properties_tag 9

/* Struct field encoding specification for nanopb */
#define org_eclipse_tahu_protobuf_Payload_FIELDLIST(X, a) \
X(a, STATIC,   OPTIONAL, UINT64,   timestamp,         1) \
X(a, POINTER,  REPEATED, MESSAGE,  metrics,           2) \
X(a, STATIC,   OPTIONAL, UINT64,   seq,               3) \
X(a, POINTER,  OPTIONAL, STRING,   uuid,              4) \
X(a, POINTER,  OPTIONAL, BYTES,    body,              5) \
X(a, CALLBACK, OPTIONAL, EXTENSION, extensions,        6)
#define org_eclipse_tahu_protobuf_Payload_CALLBACK pb_default_field_callback
#define org_eclipse_tahu_protobuf_Payload_DEFAULT NULL
#define org_eclipse_tahu_protobuf_Payload_metrics_MSGTYPE org_eclipse_tahu_protobuf_Payload_Metric

#define org_eclipse_tahu_protobuf_Payload_Template_FIELDLIST(X, a) \
X(a, POINTER,  OPTIONAL, STRING,   version,           1) \
X(a, POINTER,  REPEATED, MESSAGE,  metrics,           2) \
X(a, POINTER,  REPEATED, MESSAGE,  parameters,        3) \
X(a, POINTER,  OPTIONAL, STRING,   template_ref,      4) \
X(a, STATIC,   OPTIONAL, BOOL,     is_definition,     5) \
X(a, CALLBACK, OPTIONAL, EXTENSION, extensions,        6)
#define org_eclipse_tahu_protobuf_Payload_Template_CALLBACK pb_default_field_callback
#define org_eclipse_tahu_protobuf_Payload_Template_DEFAULT NULL
#define org_eclipse_tahu_protobuf_Payload_Template_metrics_MSGTYPE org_eclipse_tahu_protobuf_Payload_Metric
#define org_eclipse_tahu_protobuf_Payload_Template_parameters_MSGTYPE org_eclipse_tahu_protobuf_Payload_Template_Parameter

#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_FIELDLIST(X, a) \
X(a, POINTER,  OPTIONAL, STRING,   name,              1) \
X(a, STATIC,   OPTIONAL, UINT32,   type,              2) \
X(a, STATIC,   ONEOF,    UINT32,   (value,int_value,value.int_value),   3) \
X(a, STATIC,   ONEOF,    UINT64,   (value,long_value,value.long_value),   4) \
X(a, STATIC,   ONEOF,    FLOAT,    (value,float_value,value.float_value),   5) \
X(a, STATIC,   ONEOF,    DOUBLE,   (value,double_value,value.double_value),   6) \
X(a, STATIC,   ONEOF,    BOOL,     (value,boolean_value,value.boolean_value),   7) \
X(a, POINTER,  ONEOF,    STRING,   (value,string_value,value.string_value),   8) \
X(a, STATIC,   ONEOF,    MESSAGE,  (value,extension_value,value.extension_value),   9)
#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_CALLBACK NULL
#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_DEFAULT NULL
#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_value_extension_value_MSGTYPE org_eclipse_tahu_protobuf_Payload_Template_Parameter_ParameterValueExtension

#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_ParameterValueExtension_FIELDLIST(X, a) \
X(a, CALLBACK, OPTIONAL, EXTENSION, extensions,        1)
#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_ParameterValueExtension_CALLBACK pb_default_field_callback
#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_ParameterValueExtension_DEFAULT NULL

#define org_eclipse_tahu_protobuf_Payload_DataSet_FIELDLIST(X, a) \
X(a, STATIC,   OPTIONAL, UINT64,   num_of_columns,    1) \
X(a, POINTER,  REPEATED, STRING,   columns,           2) \
X(a, POINTER,  REPEATED, UINT32,   types,             3) \
X(a, POINTER,  REPEATED, MESSAGE,  rows,              4) \
X(a, CALLBACK, OPTIONAL, EXTENSION, extensions,        5)
#define org_eclipse_tahu_protobuf_Payload_DataSet_CALLBACK pb_default_field_callback
#define org_eclipse_tahu_protobuf_Payload_DataSet_DEFAULT NULL
#define org_eclipse_tahu_protobuf_Payload_DataSet_rows_MSGTYPE org_eclipse_tahu_protobuf_Payload_DataSet_Row

#define org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_FIELDLIST(X, a) \
X(a, STATIC,   ONEOF,    UINT32,   (value,int_value,value.int_value),   1) \
X(a, STATIC,   ONEOF,    UINT64,   (value,long_value,value.long_value),   2) \
X(a, STATIC,   ONEOF,    FLOAT,    (value,float_value,value.float_value),   3) \
X(a, STATIC,   ONEOF,    DOUBLE,   (value,double_value,value.double_value),   4) \
X(a, STATIC,   ONEOF,    BOOL,     (value,boolean_value,value.boolean_value),   5) \
X(a, POINTER,  ONEOF,    STRING,   (value,string_value,value.string_value),   6) \
X(a, STATIC,   ONEOF,    MESSAGE,  (value,extension_value,value.extension_value),   7)
#define org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_CALLBACK NULL
#define org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_DEFAULT NULL
#define org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_value_extension_value_MSGTYPE org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_DataSetValueExtension

#define org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_DataSetValueExtension_FIELDLIST(X, a) \
X(a, CALLBACK, OPTIONAL, EXTENSION, extensions,        1)
#define org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_DataSetValueExtension_CALLBACK pb_default_field_callback
#define org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_DataSetValueExtension_DEFAULT NULL

#define org_eclipse_tahu_protobuf_Payload_DataSet_Row_FIELDLIST(X, a) \
X(a, POINTER,  REPEATED, MESSAGE,  elements,          1) \
X(a, CALLBACK, OPTIONAL, EXTENSION, extensions,        2)
#define org_eclipse_tahu_protobuf_Payload_DataSet_Row_CALLBACK pb_default_field_callback
#define org_eclipse_tahu_protobuf_Payload_DataSet_Row_DEFAULT NULL
#define org_eclipse_tahu_protobuf_Payload_DataSet_Row_elements_MSGTYPE org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue

#define org_eclipse_tahu_protobuf_Payload_PropertyValue_FIELDLIST(X, a) \
X(a, STATIC,   OPTIONAL, UINT32,   type,              1) \
X(a, STATIC,   OPTIONAL, BOOL,     is_null,           2) \
X(a, STATIC,   ONEOF,    UINT32,   (value,int_value,value.int_value),   3) \
X(a, STATIC,   ONEOF,    UINT64,   (value,long_value,value.long_value),   4) \
X(a, STATIC,   ONEOF,    FLOAT,    (value,float_value,value.float_value),   5) \
X(a, STATIC,   ONEOF,    DOUBLE,   (value,double_value,value.double_value),   6) \
X(a, STATIC,   ONEOF,    BOOL,     (value,boolean_value,value.boolean_value),   7) \
X(a, POINTER,  ONEOF,    STRING,   (value,string_value,value.string_value),   8) \
X(a, STATIC,   ONEOF,    MESSAGE,  (value,propertyset_value,value.propertyset_value),   9) \
X(a, STATIC,   ONEOF,    MESSAGE,  (value,propertysets_value,value.propertysets_value),  10) \
X(a, STATIC,   ONEOF,    MESSAGE,  (value,extension_value,value.extension_value),  11)
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_CALLBACK NULL
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_DEFAULT NULL
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_value_propertyset_value_MSGTYPE org_eclipse_tahu_protobuf_Payload_PropertySet
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_value_propertysets_value_MSGTYPE org_eclipse_tahu_protobuf_Payload_PropertySetList
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_value_extension_value_MSGTYPE org_eclipse_tahu_protobuf_Payload_PropertyValue_PropertyValueExtension

#define org_eclipse_tahu_protobuf_Payload_PropertyValue_PropertyValueExtension_FIELDLIST(X, a) \
X(a, CALLBACK, OPTIONAL, EXTENSION, extensions,        1)
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_PropertyValueExtension_CALLBACK pb_default_field_callback
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_PropertyValueExtension_DEFAULT NULL

#define org_eclipse_tahu_protobuf_Payload_PropertySet_FIELDLIST(X, a) \
X(a, POINTER,  REPEATED, STRING,   keys,              1) \
X(a, POINTER,  REPEATED, MESSAGE,  values,            2) \
X(a, CALLBACK, OPTIONAL, EXTENSION, extensions,        3)
#define org_eclipse_tahu_protobuf_Payload_PropertySet_CALLBACK pb_default_field_callback
#define org_eclipse_tahu_protobuf_Payload_PropertySet_DEFAULT NULL
#define org_eclipse_tahu_protobuf_Payload_PropertySet_values_MSGTYPE org_eclipse_tahu_protobuf_Payload_PropertyValue

#define org_eclipse_tahu_protobuf_Payload_PropertySetList_FIELDLIST(X, a) \
X(a, POINTER,  REPEATED, MESSAGE,  propertyset,       1) \
X(a, CALLBACK, OPTIONAL, EXTENSION, extensions,        2)
#define org_eclipse_tahu_protobuf_Payload_PropertySetList_CALLBACK pb_default_field_callback
#define org_eclipse_tahu_protobuf_Payload_PropertySetList_DEFAULT NULL
#define org_eclipse_tahu_protobuf_Payload_PropertySetList_propertyset_MSGTYPE org_eclipse_tahu_protobuf_Payload_PropertySet

#define org_eclipse_tahu_protobuf_Payload_MetaData_FIELDLIST(X, a) \
X(a, STATIC,   OPTIONAL, BOOL,     is_multi_part,     1) \
X(a, POINTER,  OPTIONAL, STRING,   content_type,      2) \
X(a, STATIC,   OPTIONAL, UINT64,   size,              3) \
X(a, STATIC,   OPTIONAL, UINT64,   seq,               4) \
X(a, POINTER,  OPTIONAL, STRING,   file_name,         5) \
X(a, POINTER,  OPTIONAL, STRING,   file_type,         6) \
X(a, POINTER,  OPTIONAL, STRING,   md5,               7) \
X(a, POINTER,  OPTIONAL, STRING,   description,       8) \
X(a, CALLBACK, OPTIONAL, EXTENSION, extensions,        9)
#define org_eclipse_tahu_protobuf_Payload_MetaData_CALLBACK pb_default_field_callback
#define org_eclipse_tahu_protobuf_Payload_MetaData_DEFAULT NULL

#define org_eclipse_tahu_protobuf_Payload_Metric_FIELDLIST(X, a) \
X(a, POINTER,  OPTIONAL, STRING,   name,              1) \
X(a, STATIC,   OPTIONAL, UINT64,   alias,             2) \
X(a, STATIC,   OPTIONAL, UINT64,   timestamp,         3) \
X(a, STATIC,   OPTIONAL, UINT32,   datatype,          4) \
X(a, STATIC,   OPTIONAL, BOOL,     is_historical,     5) \
X(a, STATIC,   OPTIONAL, BOOL,     is_transient,      6) \
X(a, STATIC,   OPTIONAL, BOOL,     is_null,           7) \
X(a, STATIC,   OPTIONAL, MESSAGE,  metadata,          8) \
X(a, STATIC,   OPTIONAL, MESSAGE,  properties,        9) \
X(a, STATIC,   ONEOF,    UINT32,   (value,int_value,value.int_value),  10) \
X(a, STATIC,   ONEOF,    UINT64,   (value,long_value,value.long_value),  11) \
X(a, STATIC,   ONEOF,    FLOAT,    (value,float_value,value.float_value),  12) \
X(a, STATIC,   ONEOF,    DOUBLE,   (value,double_value,value.double_value),  13) \
X(a, STATIC,   ONEOF,    BOOL,     (value,boolean_value,value.boolean_value),  14) \
X(a, POINTER,  ONEOF,    STRING,   (value,string_value,value.string_value),  15) \
X(a, POINTER,  ONEOF,    BYTES,    (value,bytes_value,value.bytes_value),  16) \
X(a, STATIC,   ONEOF,    MESSAGE,  (value,dataset_value,value.dataset_value),  17) \
X(a, STATIC,   ONEOF,    MESSAGE,  (value,template_value,value.template_value),  18) \
X(a, STATIC,   ONEOF,    MESSAGE,  (value,extension_value,value.extension_value),  19)
#define org_eclipse_tahu_protobuf_Payload_Metric_CALLBACK NULL
#define org_eclipse_tahu_protobuf_Payload_Metric_DEFAULT NULL
#define org_eclipse_tahu_protobuf_Payload_Metric_metadata_MSGTYPE org_eclipse_tahu_protobuf_Payload_MetaData
#define org_eclipse_tahu_protobuf_Payload_Metric_properties_MSGTYPE org_eclipse_tahu_protobuf_Payload_PropertySet
#define org_eclipse_tahu_protobuf_Payload_Metric_value_dataset_value_MSGTYPE org_eclipse_tahu_protobuf_Payload_DataSet
#define org_eclipse_tahu_protobuf_Payload_Metric_value_template_value_MSGTYPE org_eclipse_tahu_protobuf_Payload_Template
#define org_eclipse_tahu_protobuf_Payload_Metric_value_extension_value_MSGTYPE org_eclipse_tahu_protobuf_Payload_Metric_MetricValueExtension

#define org_eclipse_tahu_protobuf_Payload_Metric_MetricValueExtension_FIELDLIST(X, a) \
X(a, CALLBACK, OPTIONAL, EXTENSION, extensions,        1)
#define org_eclipse_tahu_protobuf_Payload_Metric_MetricValueExtension_CALLBACK pb_default_field_callback
#define org_eclipse_tahu_protobuf_Payload_Metric_MetricValueExtension_DEFAULT NULL

extern const pb_msgdesc_t org_eclipse_tahu_protobuf_Payload_msg;
extern const pb_msgdesc_t org_eclipse_tahu_protobuf_Payload_Template_msg;
extern const pb_msgdesc_t org_eclipse_tahu_protobuf_Payload_Template_Parameter_msg;
extern const pb_msgdesc_t org_eclipse_tahu_protobuf_Payload_Template_Parameter_ParameterValueExtension_msg;
extern const pb_msgdesc_t org_eclipse_tahu_protobuf_Payload_DataSet_msg;
extern const pb_msgdesc_t org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_msg;
extern const pb_msgdesc_t org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_DataSetValueExtension_msg;
extern const pb_msgdesc_t org_eclipse_tahu_protobuf_Payload_DataSet_Row_msg;
extern const pb_msgdesc_t org_eclipse_tahu_protobuf_Payload_PropertyValue_msg;
extern const pb_msgdesc_t org_eclipse_tahu_protobuf_Payload_PropertyValue_PropertyValueExtension_msg;
extern const pb_msgdesc_t org_eclipse_tahu_protobuf_Payload_PropertySet_msg;
extern const pb_msgdesc_t org_eclipse_tahu_protobuf_Payload_PropertySetList_msg;
extern const pb_msgdesc_t org_eclipse_tahu_protobuf_Payload_MetaData_msg;
extern const pb_msgdesc_t org_eclipse_tahu_protobuf_Payload_Metric_msg;
extern const pb_msgdesc_t org_eclipse_tahu_protobuf_Payload_Metric_MetricValueExtension_msg;

/* Defines for backwards compatibility with code written before nanopb-0.4.0 */
#define org_eclipse_tahu_protobuf_Payload_fields &org_eclipse_tahu_protobuf_Payload_msg
#define org_eclipse_tahu_protobuf_Payload_Template_fields &org_eclipse_tahu_protobuf_Payload_Template_msg
#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_fields &org_eclipse_tahu_protobuf_Payload_Template_Parameter_msg
#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_ParameterValueExtension_fields &org_eclipse_tahu_protobuf_Payload_Template_Parameter_ParameterValueExtension_msg
#define org_eclipse_tahu_protobuf_Payload_DataSet_fields &org_eclipse_tahu_protobuf_Payload_DataSet_msg
#define org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_fields &org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_msg
#define org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_DataSetValueExtension_fields &org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_DataSetValueExtension_msg
#define org_eclipse_tahu_protobuf_Payload_DataSet_Row_fields &org_eclipse_tahu_protobuf_Payload_DataSet_Row_msg
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_fields &org_eclipse_tahu_protobuf_Payload_PropertyValue_msg
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_PropertyValueExtension_fields &org_eclipse_tahu_protobuf_Payload_PropertyValue_PropertyValueExtension_msg
#define org_eclipse_tahu_protobuf_Payload_PropertySet_fields &org_eclipse_tahu_protobuf_Payload_PropertySet_msg
#define org_eclipse_tahu_protobuf_Payload_PropertySetList_fields &org_eclipse_tahu_protobuf_Payload_PropertySetList_msg
#define org_eclipse_tahu_protobuf_Payload_MetaData_fields &org_eclipse_tahu_protobuf_Payload_MetaData_msg
#define org_eclipse_tahu_protobuf_Payload_Metric_fields &org_eclipse_tahu_protobuf_Payload_Metric_msg
#define org_eclipse_tahu_protobuf_Payload_Metric_MetricValueExtension_fields &org_eclipse_tahu_protobuf_Payload_Metric_MetricValueExtension_msg

/* Maximum encoded size of messages (where known) */
/* org_eclipse_tahu_protobuf_Payload_size depends on runtime parameters */
/* org_eclipse_tahu_protobuf_Payload_Template_size depends on runtime parameters */
/* org_eclipse_tahu_protobuf_Payload_Template_Parameter_size depends on runtime parameters */
#define org_eclipse_tahu_protobuf_Payload_Template_Parameter_ParameterValueExtension_size 0
/* org_eclipse_tahu_protobuf_Payload_DataSet_size depends on runtime parameters */
/* org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_size depends on runtime parameters */
#define org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_DataSetValueExtension_size 0
/* org_eclipse_tahu_protobuf_Payload_DataSet_Row_size depends on runtime parameters */
/* org_eclipse_tahu_protobuf_Payload_PropertyValue_size depends on runtime parameters */
#define org_eclipse_tahu_protobuf_Payload_PropertyValue_PropertyValueExtension_size 0
/* org_eclipse_tahu_protobuf_Payload_PropertySet_size depends on runtime parameters */
/* org_eclipse_tahu_protobuf_Payload_PropertySetList_size depends on runtime parameters */
/* org_eclipse_tahu_protobuf_Payload_MetaData_size depends on runtime parameters */
/* org_eclipse_tahu_protobuf_Payload_Metric_size depends on runtime parameters */
#define org_eclipse_tahu_protobuf_Payload_Metric_MetricValueExtension_size 0

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif


================================================
FILE: c/core/readme.txt
================================================
#/********************************************************************************
# * Copyright (c) 2014-2019 Cirrus Link Solutions and others
# *
# * This program and the accompanying materials are made available under the
# * terms of the Eclipse Public License 2.0 which is available at
# * http://www.eclipse.org/legal/epl-2.0.
# *
# * SPDX-License-Identifier: EPL-2.0
# *
# * Contributors:
# *   Cirrus Link Solutions - initial implementation
# ********************************************************************************/

# To generate the base protobuf tahu NanoPB C library (using Protoc v2.6.1 and Nanopb v0.3.5)
protoc --proto_path=../../ -otahu.pb ../../sparkplug_b/sparkplug_b.proto 
~/nanopb/nanopb-0.3.5-linux-x86/generator/nanopb_generator.py -f tahu.options tahu.pb
mv tahu.pb src/
mv tahu.pb.c src/
mv tahu.pb.h include/


================================================
FILE: c/core/src/pb_common.c
================================================
/* pb_common.c: Common support functions for pb_encode.c and pb_decode.c.
 *
 * 2014 Petteri Aimonen <jpa@kapsi.fi>
 */

#include "pb_common.h"

static bool load_descriptor_values(pb_field_iter_t *iter)
{
    uint32_t word0;
    uint32_t data_offset;
    uint_least8_t format;
    int_least8_t size_offset;

    if (iter->index >= iter->descriptor->field_count)
        return false;

    word0 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index]);
    format = word0 & 3;
    iter->tag = (pb_size_t)((word0 >> 2) & 0x3F);
    iter->type = (pb_type_t)((word0 >> 8) & 0xFF);

    if (format == 0)
    {
        /* 1-word format */
        iter->array_size = 1;
        size_offset = (int_least8_t)((word0 >> 24) & 0x0F);
        data_offset = (word0 >> 16) & 0xFF;
        iter->data_size = (pb_size_t)((word0 >> 28) & 0x0F);
    }
    else if (format == 1)
    {
        /* 2-word format */
        uint32_t word1 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 1]);

        iter->array_size = (pb_size_t)((word0 >> 16) & 0x0FFF);
        iter->tag = (pb_size_t)(iter->tag | ((word1 >> 28) << 6));
        size_offset = (int_least8_t)((word0 >> 28) & 0x0F);
        data_offset = word1 & 0xFFFF;
        iter->data_size = (pb_size_t)((word1 >> 16) & 0x0FFF);
    }
    else if (format == 2)
    {
        /* 4-word format */
        uint32_t word1 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 1]);
        uint32_t word2 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 2]);
        uint32_t word3 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 3]);

        iter->array_size = (pb_size_t)(word0 >> 16);
        iter->tag = (pb_size_t)(iter->tag | ((word1 >> 8) << 6));
        size_offset = (int_least8_t)(word1 & 0xFF);
        data_offset = word2;
        iter->data_size = (pb_size_t)word3;
    }
    else
    {
        /* 8-word format */
        uint32_t word1 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 1]);
        uint32_t word2 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 2]);
        uint32_t word3 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 3]);
        uint32_t word4 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 4]);

        iter->array_size = (pb_size_t)word4;
        iter->tag = (pb_size_t)(iter->tag | ((word1 >> 8) << 6));
        size_offset = (int_least8_t)(word1 & 0xFF);
        data_offset = word2;
        iter->data_size = (pb_size_t)word3;
    }

    iter->pField = (char*)iter->message + data_offset;

    if (size_offset)
    {
        iter->pSize = (char*)iter->pField - size_offset;
    }
    else if (PB_HTYPE(iter->type) == PB_HTYPE_REPEATED &&
             (PB_ATYPE(iter->type) == PB_ATYPE_STATIC ||
              PB_ATYPE(iter->type) == PB_ATYPE_POINTER))
    {
        /* Fixed count array */
        iter->pSize = &iter->array_size;
    }
    else
    {
        iter->pSize = NULL;
    }

    if (PB_ATYPE(iter->type) == PB_ATYPE_POINTER && iter->pField != NULL)
    {
        iter->pData = *(void**)iter->pField;
    }
    else
    {
        iter->pData = iter->pField;
    }

    if (PB_LTYPE_IS_SUBMSG(iter->type))
    {
        iter->submsg_desc = iter->descriptor->submsg_info[iter->submessage_index];
    }
    else
    {
        iter->submsg_desc = NULL;
    }

    return true;
}

static void advance_iterator(pb_field_iter_t *iter)
{
    iter->index++;

    if (iter->index >= iter->descriptor->field_count)
    {
        /* Restart */
        iter->index = 0;
        iter->field_info_index = 0;
        iter->submessage_index = 0;
        iter->required_field_index = 0;
    }
    else
    {
        /* Increment indexes based on previous field type.
         * All field info formats have the following fields:
         * - lowest 2 bits tell the amount of words in the descriptor (2^n words)
         * - bits 2..7 give the lowest bits of tag number.
         * - bits 8..15 give the field type.
         */
        uint32_t prev_descriptor = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index]);
        pb_type_t prev_type = (prev_descriptor >> 8) & 0xFF;
        pb_size_t descriptor_len = (pb_size_t)(1 << (prev_descriptor & 3));

        iter->field_info_index = (pb_size_t)(iter->field_info_index + descriptor_len);

        if (PB_HTYPE(prev_type) == PB_HTYPE_REQUIRED)
        {
            iter->required_field_index++;
        }

        if (PB_LTYPE_IS_SUBMSG(prev_type))
        {
            iter->submessage_index++;
        }
    }
}

bool pb_field_iter_begin(pb_field_iter_t *iter, const pb_msgdesc_t *desc, void *message)
{
    memset(iter, 0, sizeof(*iter));

    iter->descriptor = desc;
    iter->message = message;

    return load_descriptor_values(iter);
}

bool pb_field_iter_begin_extension(pb_field_iter_t *iter, pb_extension_t *extension)
{
    const pb_msgdesc_t *msg = (const pb_msgdesc_t*)extension->type->arg;
    bool status;

    uint32_t word0 = PB_PROGMEM_READU32(msg->field_info[0]);
    if (PB_ATYPE(word0 >> 8) == PB_ATYPE_POINTER)
    {
        /* For pointer extensions, the pointer is stored directly
         * in the extension structure. This avoids having an extra
         * indirection. */
        status = pb_field_iter_begin(iter, msg, &extension->dest);
    }
    else
    {
        status = pb_field_iter_begin(iter, msg, extension->dest);
    }

    iter->pSize = &extension->found;
    return status;
}

bool pb_field_iter_next(pb_field_iter_t *iter)
{
    advance_iterator(iter);
    (void)load_descriptor_values(iter);
    return iter->index != 0;
}

bool pb_field_iter_find(pb_field_iter_t *iter, uint32_t tag)
{
    if (iter->tag == tag)
    {
        return true; /* Nothing to do, correct field already. */
    }
    else
    {
        pb_size_t start = iter->index;
        uint32_t fieldinfo;

        do
        {
            /* Advance iterator but don't load values yet */
            advance_iterator(iter);

            /* Do fast check for tag number match */
            fieldinfo = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index]);

            if (((fieldinfo >> 2) & 0x3F) == (tag & 0x3F))
            {
                /* Good candidate, check further */
                (void)load_descriptor_values(iter);

                if (iter->tag == tag &&
                    PB_LTYPE(iter->type) != PB_LTYPE_EXTENSION)
                {
                    /* Found it */
                    return true;
                }
            }
        } while (iter->index != start);

        /* Searched all the way back to start, and found nothing. */
        (void)load_descriptor_values(iter);
        return false;
    }
}

static void *pb_const_cast(const void *p)
{
    /* Note: this casts away const, in order to use the common field iterator
     * logic for both encoding and decoding. The cast is done using union
     * to avoid spurious compiler warnings. */
    union {
        void *p1;
        const void *p2;
    } t;
    t.p2 = p;
    return t.p1;
}

bool pb_field_iter_begin_const(pb_field_iter_t *iter, const pb_msgdesc_t *desc, const void *message)
{
    return pb_field_iter_begin(iter, desc, pb_const_cast(message));
}

bool pb_field_iter_begin_extension_const(pb_field_iter_t *iter, const pb_extension_t *extension)
{
    return pb_field_iter_begin_extension(iter, (pb_extension_t*)pb_const_cast(extension));
}

bool pb_default_field_callback(pb_istream_t *istream, pb_ostream_t *ostream, const pb_field_t *field)
{
    if (field->data_size == sizeof(pb_callback_t))
    {
        pb_callback_t *pCallback = (pb_callback_t*)field->pData;

        if (pCallback != NULL)
        {
            if (istream != NULL && pCallback->funcs.decode != NULL)
            {
                return pCallback->funcs.decode(istream, field, &pCallback->arg);
            }

            if (ostream != NULL && pCallback->funcs.encode != NULL)
            {
                return pCallback->funcs.encode(ostream, field, &pCallback->arg);
            }
        }
    }

    return true; /* Success, but didn't do anything */

}

#ifdef PB_VALIDATE_UTF8

/* This function checks whether a string is valid UTF-8 text.
 *
 * Algorithm is adapted from https://www.cl.cam.ac.uk/~mgk25/ucs/utf8_check.c
 * Original copyright: Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/> 2005-03-30
 * Licensed under "Short code license", which allows use under MIT license or
 * any compatible with it.
 */

bool pb_validate_utf8(const char *str)
{
    const pb_byte_t *s = (const pb_byte_t*)str;
    while (*s)
    {
        if (*s < 0x80)
        {
            /* 0xxxxxxx */
            s++;
        }
        else if ((s[0] & 0xe0) == 0xc0)
        {
            /* 110XXXXx 10xxxxxx */
            if ((s[1] & 0xc0) != 0x80 ||
                (s[0] & 0xfe) == 0xc0)                        /* overlong? */
                return false;
            else
                s += 2;
        }
        else if ((s[0] & 0xf0) == 0xe0)
        {
            /* 1110XXXX 10Xxxxxx 10xxxxxx */
            if ((s[1] & 0xc0) != 0x80 ||
                (s[2] & 0xc0) != 0x80 ||
                (s[0] == 0xe0 && (s[1] & 0xe0) == 0x80) ||    /* overlong? */
                (s[0] == 0xed && (s[1] & 0xe0) == 0xa0) ||    /* surrogate? */
                (s[0] == 0xef && s[1] == 0xbf &&
                (s[2] & 0xfe) == 0xbe))                 /* U+FFFE or U+FFFF? */
                return false;
            else
                s += 3;
        }
        else if ((s[0] & 0xf8) == 0xf0)
        {
            /* 11110XXX 10XXxxxx 10xxxxxx 10xxxxxx */
            if ((s[1] & 0xc0) != 0x80 ||
                (s[2] & 0xc0) != 0x80 ||
                (s[3] & 0xc0) != 0x80 ||
                (s[0] == 0xf0 && (s[1] & 0xf0) == 0x80) ||    /* overlong? */
                (s[0] == 0xf4 && s[1] > 0x8f) || s[0] > 0xf4) /* > U+10FFFF? */
                return false;
            else
                s += 4;
        }
        else
        {
            return false;
        }
    }

    return true;
}

#endif



================================================
FILE: c/core/src/pb_decode.c
================================================
/* pb_decode.c -- decode a protobuf using minimal resources
 *
 * 2011 Petteri Aimonen <jpa@kapsi.fi>
 */

/* Use the GCC warn_unused_result attribute to check that all return values
 * are propagated correctly. On other compilers and gcc before 3.4.0 just
 * ignore the annotation.
 */
#if !defined(__GNUC__) || ( __GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 4)
    #define checkreturn
#else
    #define checkreturn __attribute__((warn_unused_result))
#endif

#include "pb.h"
#include "pb_decode.h"
#include "pb_common.h"

/**************************************
 * Declarations internal to this file *
 **************************************/

static bool checkreturn buf_read(pb_istream_t *stream, pb_byte_t *buf, size_t count);
static bool checkreturn pb_decode_varint32_eof(pb_istream_t *stream, uint32_t *dest, bool *eof);
static bool checkreturn read_raw_value(pb_istream_t *stream, pb_wire_type_t wire_type, pb_byte_t *buf, size_t *size);
static bool checkreturn check_wire_type(pb_wire_type_t wire_type, pb_field_iter_t *field);
static bool checkreturn decode_basic_field(pb_istream_t *stream, pb_field_iter_t *field);
static bool checkreturn decode_static_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field);
static bool checkreturn decode_pointer_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field);
static bool checkreturn decode_callback_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field);
static bool checkreturn decode_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field);
static bool checkreturn default_extension_decoder(pb_istream_t *stream, pb_extension_t *extension, uint32_t tag, pb_wire_type_t wire_type);
static bool checkreturn decode_extension(pb_istream_t *stream, uint32_t tag, pb_wire_type_t wire_type, pb_field_iter_t *iter);
static bool checkreturn find_extension_field(pb_field_iter_t *iter);
static bool pb_message_set_to_defaults(pb_field_iter_t *iter);
static bool checkreturn pb_dec_bool(pb_istream_t *stream, const pb_field_iter_t *field);
static bool checkreturn pb_dec_varint(pb_istream_t *stream, const pb_field_iter_t *field);
static bool checkreturn pb_dec_fixed(pb_istream_t *stream, const pb_field_iter_t *field);
static bool checkreturn pb_dec_bytes(pb_istream_t *stream, const pb_field_iter_t *field);
static bool checkreturn pb_dec_string(pb_istream_t *stream, const pb_field_iter_t *field);
static bool checkreturn pb_dec_submessage(pb_istream_t *stream, const pb_field_iter_t *field);
static bool checkreturn pb_dec_fixed_length_bytes(pb_istream_t *stream, const pb_field_iter_t *field);
static bool checkreturn pb_skip_varint(pb_istream_t *stream);
static bool checkreturn pb_skip_string(pb_istream_t *stream);

#ifdef PB_ENABLE_MALLOC
static bool checkreturn allocate_field(pb_istream_t *stream, void *pData, size_t data_size, size_t array_size);
static void initialize_pointer_field(void *pItem, pb_field_iter_t *field);
static bool checkreturn pb_release_union_field(pb_istream_t *stream, pb_field_iter_t *field);
static void pb_release_single_field(pb_field_iter_t *field);
#endif

#ifdef PB_WITHOUT_64BIT
#define pb_int64_t int32_t
#define pb_uint64_t uint32_t
#else
#define pb_int64_t int64_t
#define pb_uint64_t uint64_t
#endif

typedef struct {
    uint32_t bitfield[(PB_MAX_REQUIRED_FIELDS + 31) / 32];
} pb_fields_seen_t;

/*******************************
 * pb_istream_t implementation *
 *******************************/

static bool checkreturn buf_read(pb_istream_t *stream, pb_byte_t *buf, size_t count)
{
    size_t i;
    const pb_byte_t *source = (const pb_byte_t*)stream->state;
    stream->state = (pb_byte_t*)stream->state + count;
    
    if (buf != NULL)
    {
        for (i = 0; i < count; i++)
            buf[i] = source[i];
    }
    
    return true;
}

bool checkreturn pb_read(pb_istream_t *stream, pb_byte_t *buf, size_t count)
{
    if (count == 0)
        return true;

#ifndef PB_BUFFER_ONLY
	if (buf == NULL && stream->callback != buf_read)
	{
		/* Skip input bytes */
		pb_byte_t tmp[16];
		while (count > 16)
		{
			if (!pb_read(stream, tmp, 16))
				return false;
			
			count -= 16;
		}
		
		return pb_read(stream, tmp, count);
	}
#endif

    if (stream->bytes_left < count)
        PB_RETURN_ERROR(stream, "end-of-stream");
    
#ifndef PB_BUFFER_ONLY
    if (!stream->callback(stream, buf, count))
        PB_RETURN_ERROR(stream, "io error");
#else
    if (!buf_read(stream, buf, count))
        return false;
#endif
    
    stream->bytes_left -= count;
    return true;
}

/* Read a single byte from input stream. buf may not be NULL.
 * This is an optimization for the varint decoding. */
static bool checkreturn pb_readbyte(pb_istream_t *stream, pb_byte_t *buf)
{
    if (stream->bytes_left == 0)
        PB_RETURN_ERROR(stream, "end-of-stream");

#ifndef PB_BUFFER_ONLY
    if (!stream->callback(stream, buf, 1))
        PB_RETURN_ERROR(stream, "io error");
#else
    *buf = *(const pb_byte_t*)stream->state;
    stream->state = (pb_byte_t*)stream->state + 1;
#endif

    stream->bytes_left--;
    
    return true;    
}

pb_istream_t pb_istream_from_buffer(const pb_byte_t *buf, size_t bufsize)
{
    pb_istream_t stream;
    /* Cast away the const from buf without a compiler error.  We are
     * careful to use it only in a const manner in the callbacks.
     */
    union {
        void *state;
        const void *c_state;
    } state;
#ifdef PB_BUFFER_ONLY
    stream.callback = NULL;
#else
    stream.callback = &buf_read;
#endif
    state.c_state = buf;
    stream.state = state.state;
    stream.bytes_left = bufsize;
#ifndef PB_NO_ERRMSG
    stream.errmsg = NULL;
#endif
    return stream;
}

/********************
 * Helper functions *
 ********************/

static bool checkreturn pb_decode_varint32_eof(pb_istream_t *stream, uint32_t *dest, bool *eof)
{
    pb_byte_t byte;
    uint32_t result;
    
    if (!pb_readbyte(stream, &byte))
    {
        if (stream->bytes_left == 0)
        {
            if (eof)
            {
                *eof = true;
            }
        }

        return false;
    }
    
    if ((byte & 0x80) == 0)
    {
        /* Quick case, 1 byte value */
        result = byte;
    }
    else
    {
        /* Multibyte case */
        uint_fast8_t bitpos = 7;
        result = byte & 0x7F;
        
        do
        {
            if (!pb_readbyte(stream, &byte))
                return false;
            
            if (bitpos >= 32)
            {
                /* Note: The varint could have trailing 0x80 bytes, or 0xFF for negative. */
                pb_byte_t sign_extension = (bitpos < 63) ? 0xFF : 0x01;
                
                if ((byte & 0x7F) != 0x00 && ((result >> 31) == 0 || byte != sign_extension))
                {
                    PB_RETURN_ERROR(stream, "varint overflow");
                }
            }
            else
            {
                result |= (uint32_t)(byte & 0x7F) << bitpos;
            }
            bitpos = (uint_fast8_t)(bitpos + 7);
        } while (byte & 0x80);
        
        if (bitpos == 35 && (byte & 0x70) != 0)
        {
            /* The last byte was at bitpos=28, so only bottom 4 bits fit. */
            PB_RETURN_ERROR(stream, "varint overflow");
        }
   }
   
   *dest = result;
   return true;
}

bool checkreturn pb_decode_varint32(pb_istream_t *stream, uint32_t *dest)
{
    return pb_decode_varint32_eof(stream, dest, NULL);
}

#ifndef PB_WITHOUT_64BIT
bool checkreturn pb_decode_varint(pb_istream_t *stream, uint64_t *dest)
{
    pb_byte_t byte;
    uint_fast8_t bitpos = 0;
    uint64_t result = 0;
    
    do
    {
        if (bitpos >= 64)
            PB_RETURN_ERROR(stream, "varint overflow");
        
        if (!pb_readbyte(stream, &byte))
            return false;

        result |= (uint64_t)(byte & 0x7F) << bitpos;
        bitpos = (uint_fast8_t)(bitpos + 7);
    } while (byte & 0x80);
    
    *dest = result;
    return true;
}
#endif

bool checkreturn pb_skip_varint(pb_istream_t *stream)
{
    pb_byte_t byte;
    do
    {
        if (!pb_read(stream, &byte, 1))
            return false;
    } while (byte & 0x80);
    return true;
}

bool checkreturn pb_skip_string(pb_istream_t *stream)
{
    uint32_t length;
    if (!pb_decode_varint32(stream, &length))
        return false;
    
    if ((size_t)length != length)
    {
        PB_RETURN_ERROR(stream, "size too large");
    }

    return pb_read(stream, NULL, (size_t)length);
}

bool checkreturn pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, uint32_t *tag, bool *eof)
{
    uint32_t temp;
    *eof = false;
    *wire_type = (pb_wire_type_t) 0;
    *tag = 0;
    
    if (!pb_decode_varint32_eof(stream, &temp, eof))
    {
        return false;
    }
    
    *tag = temp >> 3;
    *wire_type = (pb_wire_type_t)(temp & 7);
    return true;
}

bool checkreturn pb_skip_field(pb_istream_t *stream, pb_wire_type_t wire_type)
{
    switch (wire_type)
    {
        case PB_WT_VARINT: return pb_skip_varint(stream);
        case PB_WT_64BIT: return pb_read(stream, NULL, 8);
        case PB_WT_STRING: return pb_skip_string(stream);
        case PB_WT_32BIT: return pb_read(stream, NULL, 4);
        default: PB_RETURN_ERROR(stream, "invalid wire_type");
    }
}

/* Read a raw value to buffer, for the purpose of passing it to callback as
 * a substream. Size is maximum size on call, and actual size on return.
 */
static bool checkreturn read_raw_value(pb_istream_t *stream, pb_wire_type_t wire_type, pb_byte_t *buf, size_t *size)
{
    size_t max_size = *size;
    switch (wire_type)
    {
        case PB_WT_VARINT:
            *size = 0;
            do
            {
                (*size)++;
                if (*size > max_size)
                    PB_RETURN_ERROR(stream, "varint overflow");

                if (!pb_read(stream, buf, 1))
                    return false;
            } while (*buf++ & 0x80);
            return true;
            
        case PB_WT_64BIT:
            *size = 8;
            return pb_read(stream, buf, 8);
        
        case PB_WT_32BIT:
            *size = 4;
            return pb_read(stream, buf, 4);
        
        case PB_WT_STRING:
            /* Calling read_raw_value with a PB_WT_STRING is an error.
             * Explicitly handle this case and fallthrough to default to avoid
             * compiler warnings.
             */

        default: PB_RETURN_ERROR(stream, "invalid wire_type");
    }
}

/* Decode string length from stream and return a substream with limited length.
 * Remember to close the substream using pb_close_string_substream().
 */
bool checkreturn pb_make_string_substream(pb_istream_t *stream, pb_istream_t *substream)
{
    uint32_t size;
    if (!pb_decode_varint32(stream, &size))
        return false;
    
    *substream = *stream;
    if (substream->bytes_left < size)
        PB_RETURN_ERROR(stream, "parent stream too short");
    
    substream->bytes_left = (size_t)size;
    stream->bytes_left -= (size_t)size;
    return true;
}

bool checkreturn pb_close_string_substream(pb_istream_t *stream, pb_istream_t *substream)
{
    if (substream->bytes_left) {
        if (!pb_read(substream, NULL, substream->bytes_left))
            return false;
    }

    stream->state = substream->state;

#ifndef PB_NO_ERRMSG
    stream->errmsg = substream->errmsg;
#endif
    return true;
}

/*************************
 * Decode a single field *
 *************************/

static bool checkreturn check_wire_type(pb_wire_type_t wire_type, pb_field_iter_t *field)
{
    switch (PB_LTYPE(field->type))
    {
        case PB_LTYPE_BOOL:
        case PB_LTYPE_VARINT:
        case PB_LTYPE_UVARINT:
        case PB_LTYPE_SVARINT:
            return wire_type == PB_WT_VARINT;

        case PB_LTYPE_FIXED32:
            return wire_type == PB_WT_32BIT;

        case PB_LTYPE_FIXED64:
            return wire_type == PB_WT_64BIT;

        case PB_LTYPE_BYTES:
        case PB_LTYPE_STRING:
        case PB_LTYPE_SUBMESSAGE:
        case PB_LTYPE_SUBMSG_W_CB:
        case PB_LTYPE_FIXED_LENGTH_BYTES:
            return wire_type == PB_WT_STRING;

        default:
            return false;
    }
}

static bool checkreturn decode_basic_field(pb_istream_t *stream, pb_field_iter_t *field)
{
    switch (PB_LTYPE(field->type))
    {
        case PB_LTYPE_BOOL:
            return pb_dec_bool(stream, field);

        case PB_LTYPE_VARINT:
        case PB_LTYPE_UVARINT:
        case PB_LTYPE_SVARINT:
            return pb_dec_varint(stream, field);

        case PB_LTYPE_FIXED32:
        case PB_LTYPE_FIXED64:
            return pb_dec_fixed(stream, field);

        case PB_LTYPE_BYTES:
            return pb_dec_bytes(stream, field);

        case PB_LTYPE_STRING:
            return pb_dec_string(stream, field);

        case PB_LTYPE_SUBMESSAGE:
        case PB_LTYPE_SUBMSG_W_CB:
            return pb_dec_submessage(stream, field);

        case PB_LTYPE_FIXED_LENGTH_BYTES:
            return pb_dec_fixed_length_bytes(stream, field);

        default:
            PB_RETURN_ERROR(stream, "invalid field type");
    }
}

static bool checkreturn decode_static_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field)
{
    switch (PB_HTYPE(field->type))
    {
        case PB_HTYPE_REQUIRED:
            if (!check_wire_type(wire_type, field))
                PB_RETURN_ERROR(stream, "wrong wire type");

            return decode_basic_field(stream, field);
            
        case PB_HTYPE_OPTIONAL:
            if (!check_wire_type(wire_type, field))
                PB_RETURN_ERROR(stream, "wrong wire type");

            if (field->pSize != NULL)
                *(bool*)field->pSize = true;
            return decode_basic_field(stream, field);
    
        case PB_HTYPE_REPEATED:
            if (wire_type == PB_WT_STRING
                && PB_LTYPE(field->type) <= PB_LTYPE_LAST_PACKABLE)
            {
                /* Packed array */
                bool status = true;
                pb_istream_t substream;
                pb_size_t *size = (pb_size_t*)field->pSize;
                field->pData = (char*)field->pField + field->data_size * (*size);

                if (!pb_make_string_substream(stream, &substream))
                    return false;

                while (substream.bytes_left > 0 && *size < field->array_size)
                {
                    if (!decode_basic_field(&substream, field))
                    {
                        status = false;
                        break;
                    }
                    (*size)++;
                    field->pData = (char*)field->pData + field->data_size;
                }

                if (substream.bytes_left != 0)
                    PB_RETURN_ERROR(stream, "array overflow");
                if (!pb_close_string_substream(stream, &substream))
                    return false;

                return status;
            }
            else
            {
                /* Repeated field */
                pb_size_t *size = (pb_size_t*)field->pSize;
                field->pData = (char*)field->pField + field->data_size * (*size);

                if (!check_wire_type(wire_type, field))
                    PB_RETURN_ERROR(stream, "wrong wire type");

                if ((*size)++ >= field->array_size)
                    PB_RETURN_ERROR(stream, "array overflow");

                return decode_basic_field(stream, field);
            }

        case PB_HTYPE_ONEOF:
            *(pb_size_t*)field->pSize = field->tag;
            if (PB_LTYPE_IS_SUBMSG(field->type))
            {
                /* We memset to zero so that any callbacks are set to NULL.
                 * This is because the callbacks might otherwise have values
                 * from some other union field.
                 * If callbacks are needed inside oneof field, use .proto
                 * option submsg_callback to have a separate callback function
                 * that can set the fields before submessage is decoded.
                 * pb_dec_submessage() will set any default values. */
                memset(field->pData, 0, (size_t)field->data_size);
            }

            if (!check_wire_type(wire_type, field))
                PB_RETURN_ERROR(stream, "wrong wire type");

            return decode_basic_field(stream, field);

        default:
            PB_RETURN_ERROR(stream, "invalid field type");
    }
}

#ifdef PB_ENABLE_MALLOC
/* Allocate storage for the field and store the pointer at iter->pData.
 * array_size is the number of entries to reserve in an array.
 * Zero size is not allowed, use pb_free() for releasing.
 */
static bool checkreturn allocate_field(pb_istream_t *stream, void *pData, size_t data_size, size_t array_size)
{    
    void *ptr = *(void**)pData;
    
    if (data_size == 0 || array_size == 0)
        PB_RETURN_ERROR(stream, "invalid size");
    
#ifdef __AVR__
    /* Workaround for AVR libc bug 53284: http://savannah.nongnu.org/bugs/?53284
     * Realloc to size of 1 byte can cause corruption of the malloc structures.
     */
    if (data_size == 1 && array_size == 1)
    {
        data_size = 2;
    }
#endif

    /* Check for multiplication overflows.
     * This code avoids the costly division if the sizes are small enough.
     * Multiplication is safe as long as only half of bits are set
     * in either multiplicand.
     */
    {
        const size_t check_limit = (size_t)1 << (sizeof(size_t) * 4);
        if (data_size >= check_limit || array_size >= check_limit)
        {
            const size_t size_max = (size_t)-1;
            if (size_max / array_size < data_size)
            {
                PB_RETURN_ERROR(stream, "size too large");
            }
        }
    }
    
    /* Allocate new or expand previous allocation */
    /* Note: on failure the old pointer will remain in the structure,
     * the message must be freed by caller also on error return. */
    ptr = pb_realloc(ptr, array_size * data_size);
    if (ptr == NULL)
        PB_RETURN_ERROR(stream, "realloc failed");
    
    *(void**)pData = ptr;
    return true;
}

/* Clear a newly allocated item in case it contains a pointer, or is a submessage. */
static void initialize_pointer_field(void *pItem, pb_field_iter_t *field)
{
    if (PB_LTYPE(field->type) == PB_LTYPE_STRING ||
        PB_LTYPE(field->type) == PB_LTYPE_BYTES)
    {
        *(void**)pItem = NULL;
    }
    else if (PB_LTYPE_IS_SUBMSG(field->type))
    {
        /* We memset to zero so that any callbacks are set to NULL.
         * Then set any default values. */
        pb_field_iter_t submsg_iter;
        memset(pItem, 0, field->data_size);

        if (pb_field_iter_begin(&submsg_iter, field->submsg_desc, pItem))
        {
            (void)pb_message_set_to_defaults(&submsg_iter);
        }
    }
}
#endif

static bool checkreturn decode_pointer_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field)
{
#ifndef PB_ENABLE_MALLOC
    PB_UNUSED(wire_type);
    PB_UNUSED(field);
    PB_RETURN_ERROR(stream, "no malloc support");
#else
    switch (PB_HTYPE(field->type))
    {
        case PB_HTYPE_REQUIRED:
        case PB_HTYPE_OPTIONAL:
        case PB_HTYPE_ONEOF:
            if (!check_wire_type(wire_type, field))
                PB_RETURN_ERROR(stream, "wrong wire type");

            if (PB_LTYPE_IS_SUBMSG(field->type) && *(void**)field->pField != NULL)
            {
                /* Duplicate field, have to release the old allocation first. */
                /* FIXME: Does this work correctly for oneofs? */
                pb_release_single_field(field);
            }
        
            if (PB_HTYPE(field->type) == PB_HTYPE_ONEOF)
            {
                *(pb_size_t*)field->pSize = field->tag;
            }

            if (PB_LTYPE(field->type) == PB_LTYPE_STRING ||
                PB_LTYPE(field->type) == PB_LTYPE_BYTES)
            {
                /* pb_dec_string and pb_dec_bytes handle allocation themselves */
                field->pData = field->pField;
                return decode_basic_field(stream, field);
            }
            else
            {
                if (!allocate_field(stream, field->pField, field->data_size, 1))
                    return false;
                
                field->pData = *(void**)field->pField;
                initialize_pointer_field(field->pData, field);
                return decode_basic_field(stream, field);
            }
    
        case PB_HTYPE_REPEATED:
            if (wire_type == PB_WT_STRING
                && PB_LTYPE(field->type) <= PB_LTYPE_LAST_PACKABLE)
            {
                /* Packed array, multiple items come in at once. */
                bool status = true;
                pb_size_t *size = (pb_size_t*)field->pSize;
                size_t allocated_size = *size;
                pb_istream_t substream;
                
                if (!pb_make_string_substream(stream, &substream))
                    return false;
                
                while (substream.bytes_left)
                {
                    if (*size == PB_SIZE_MAX)
                    {
#ifndef PB_NO_ERRMSG
                        stream->errmsg = "too many array entries";
#endif
                        status = false;
                        break;
                    }

                    if ((size_t)*size + 1 > allocated_size)
                    {
                        /* Allocate more storage. This tries to guess the
                         * number of remaining entries. Round the division
                         * upwards. */
                        size_t remain = (substream.bytes_left - 1) / field->data_size + 1;
                        if (remain < PB_SIZE_MAX - allocated_size)
                            allocated_size += remain;
                        else
                            allocated_size += 1;
                        
                        if (!allocate_field(&substream, field->pField, field->data_size, allocated_size))
                        {
                            status = false;
                            break;
                        }
                    }

                    /* Decode the array entry */
                    field->pData = *(char**)field->pField + field->data_size * (*size);
                    initialize_pointer_field(field->pData, field);
                    if (!decode_basic_field(&substream, field))
                    {
                        status = false;
                        break;
                    }
                    
                    (*size)++;
                }
                if (!pb_close_string_substream(stream, &substream))
                    return false;
                
                return status;
            }
            else
            {
                /* Normal repeated field, i.e. only one item at a time. */
                pb_size_t *size = (pb_size_t*)field->pSize;

                if (*size == PB_SIZE_MAX)
                    PB_RETURN_ERROR(stream, "too many array entries");
                
                if (!check_wire_type(wire_type, field))
                    PB_RETURN_ERROR(stream, "wrong wire type");

                if (!allocate_field(stream, field->pField, field->data_size, (size_t)(*size + 1)))
                    return false;
            
                field->pData = *(char**)field->pField + field->data_size * (*size);
                (*size)++;
                initialize_pointer_field(field->pData, field);
                return decode_basic_field(stream, field);
            }

        default:
            PB_RETURN_ERROR(stream, "invalid field type");
    }
#endif
}

static bool checkreturn decode_callback_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field)
{
    if (!field->descriptor->field_callback)
        return pb_skip_field(stream, wire_type);

    if (wire_type == PB_WT_STRING)
    {
        pb_istream_t substream;
        size_t prev_bytes_left;
        
        if (!pb_make_string_substream(stream, &substream))
            return false;
        
        do
        {
            prev_bytes_left = substream.bytes_left;
            if (!field->descriptor->field_callback(&substream, NULL, field))
                PB_RETURN_ERROR(stream, "callback failed");
        } while (substream.bytes_left > 0 && substream.bytes_left < prev_bytes_left);
        
        if (!pb_close_string_substream(stream, &substream))
            return false;

        return true;
    }
    else
    {
        /* Copy the single scalar value to stack.
         * This is required so that we can limit the stream length,
         * which in turn allows to use same callback for packed and
         * not-packed fields. */
        pb_istream_t substream;
        pb_byte_t buffer[10];
        size_t size = sizeof(buffer);
        
        if (!read_raw_value(stream, wire_type, buffer, &size))
            return false;
        substream = pb_istream_from_buffer(buffer, size);
        
        return field->descriptor->field_callback(&substream, NULL, field);
    }
}

static bool checkreturn decode_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field)
{
#ifdef PB_ENABLE_MALLOC
    /* When decoding an oneof field, check if there is old data that must be
     * released first. */
    if (PB_HTYPE(field->type) == PB_HTYPE_ONEOF)
    {
        if (!pb_release_union_field(stream, field))
            return false;
    }
#endif

    switch (PB_ATYPE(field->type))
    {
        case PB_ATYPE_STATIC:
            return decode_static_field(stream, wire_type, field);
        
        case PB_ATYPE_POINTER:
            return decode_pointer_field(stream, wire_type, field);
        
        case PB_ATYPE_CALLBACK:
            return decode_callback_field(stream, wire_type, field);
        
        default:
            PB_RETURN_ERROR(stream, "invalid field type");
    }
}

/* Default handler for extension fields. Expects to have a pb_msgdesc_t
 * pointer in the extension->type->arg field, pointing to a message with
 * only one field in it.  */
static bool checkreturn default_extension_decoder(pb_istream_t *stream,
    pb_extension_t *extension, uint32_t tag, pb_wire_type_t wire_type)
{
    pb_field_iter_t iter;

    if (!pb_field_iter_begin_extension(&iter, extension))
        PB_RETURN_ERROR(stream, "invalid extension");

    if (iter.tag != tag)
        return true;

    extension->found = true;
    return decode_field(stream, wire_type, &iter);
}

/* Try to decode an unknown field as an extension field. Tries each extension
 * decoder in turn, until one of them handles the field or loop ends. */
static bool checkreturn decode_extension(pb_istream_t *stream,
    uint32_t tag, pb_wire_type_t wire_type, pb_field_iter_t *iter)
{
    pb_extension_t *extension = *(pb_extension_t* const *)iter->pData;
    size_t pos = stream->bytes_left;
    
    while (extension != NULL && pos == stream->bytes_left)
    {
        bool status;
        if (extension->type->decode)
            status = extension->type->decode(stream, extension, tag, wire_type);
        else
            status = default_extension_decoder(stream, extension, tag, wire_type);

        if (!status)
            return false;
        
        extension = extension->next;
    }
    
    return true;
}

/* Step through the iterator until an extension field is found or until all
 * entries have been checked. There can be only one extension field per
 * message. Returns false if no extension field is found. */
static bool checkreturn find_extension_field(pb_field_iter_t *iter)
{
    pb_size_t start = iter->index;

    do {
        if (PB_LTYPE(iter->type) == PB_LTYPE_EXTENSION)
            return true;
        (void)pb_field_iter_next(iter);
    } while (iter->index != start);
    
    return false;
}

/* Initialize message fields to default values, recursively */
static bool pb_field_set_to_default(pb_field_iter_t *field)
{
    pb_type_t type;
    type = field->type;

    if (PB_LTYPE(type) == PB_LTYPE_EXTENSION)
    {
        pb_extension_t *ext = *(pb_extension_t* const *)field->pData;
        while (ext != NULL)
        {
            pb_field_iter_t ext_iter;
            if (pb_field_iter_begin_extension(&ext_iter, ext))
            {
                ext->found = false;
                if (!pb_message_set_to_defaults(&ext_iter))
                    return false;
            }
            ext = ext->next;
        }
    }
    else if (PB_ATYPE(type) == PB_ATYPE_STATIC)
    {
        bool init_data = true;
        if (PB_HTYPE(type) == PB_HTYPE_OPTIONAL && field->pSize != NULL)
        {
            /* Set has_field to false. Still initialize the optional field
             * itself also. */
            *(bool*)field->pSize = false;
        }
        else if (PB_HTYPE(type) == PB_HTYPE_REPEATED ||
                 PB_HTYPE(type) == PB_HTYPE_ONEOF)
        {
            /* REPEATED: Set array count to 0, no need to initialize contents.
               ONEOF: Set which_field to 0. */
            *(pb_size_t*)field->pSize = 0;
            init_data = false;
        }

        if (init_data)
        {
            if (PB_LTYPE_IS_SUBMSG(field->type))
            {
                /* Initialize submessage to defaults */
                pb_field_iter_t submsg_iter;
                if (pb_field_iter_begin(&submsg_iter, field->submsg_desc, field->pData))
                {
                    if (!pb_message_set_to_defaults(&submsg_iter))
                        return false;
                }
            }
            else
            {
                /* Initialize to zeros */
                memset(field->pData, 0, (size_t)field->data_size);
            }
        }
    }
    else if (PB_ATYPE(type) == PB_ATYPE_POINTER)
    {
        /* Initialize the pointer to NULL. */
        *(void**)field->pField = NULL;

        /* Initialize array count to 0. */
        if (PB_HTYPE(type) == PB_HTYPE_REPEATED ||
            PB_HTYPE(type) == PB_HTYPE_ONEOF)
        {
            *(pb_size_t*)field->pSize = 0;
        }
    }
    else if (PB_ATYPE(type) == PB_ATYPE_CALLBACK)
    {
        /* Don't overwrite callback */
    }

    return true;
}

static bool pb_message_set_to_defaults(pb_field_iter_t *iter)
{
    pb_istream_t defstream = PB_ISTREAM_EMPTY;
    uint32_t tag = 0;
    pb_wire_type_t wire_type = PB_WT_VARINT;
    bool eof;

    if (iter->descriptor->default_value)
    {
        defstream = pb_istream_from_buffer(iter->descriptor->default_value, (size_t)-1);
        if (!pb_decode_tag(&defstream, &wire_type, &tag, &eof))
            return false;
    }

    do
    {
        if (!pb_field_set_to_default(iter))
            return false;

        if (tag != 0 && iter->tag == tag)
        {
            /* We have a default value for this field in the defstream */
            if (!decode_field(&defstream, wire_type, iter))
                return false;
            if (!pb_decode_tag(&defstream, &wire_type, &tag, &eof))
                return false;

            if (iter->pSize)
                *(bool*)iter->pSize = false;
        }
    } while (pb_field_iter_next(iter));

    return true;
}

/*********************
 * Decode all fields *
 *********************/

static bool checkreturn pb_decode_inner(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct, unsigned int flags)
{
    uint32_t extension_range_start = 0;

    /* 'fixed_count_field' and 'fixed_count_size' track position of a repeated fixed
     * count field. This can only handle _one_ repeated fixed count field that
     * is unpacked and unordered among other (non repeated fixed count) fields.
     */
    pb_size_t fixed_count_field = PB_SIZE_MAX;
    pb_size_t fixed_count_size = 0;
    pb_size_t fixed_count_total_size = 0;

    pb_fields_seen_t fields_seen = {{0, 0}};
    const uint32_t allbits = ~(uint32_t)0;
    pb_field_iter_t iter;

    if (pb_field_iter_begin(&iter, fields, dest_struct))
    {
        if ((flags & PB_DECODE_NOINIT) == 0)
        {
            if (!pb_message_set_to_defaults(&iter))
                PB_RETURN_ERROR(stream, "failed to set defaults");
        }
    }

    while (stream->bytes_left)
    {
        uint32_t tag;
        pb_wire_type_t wire_type;
        bool eof;

        if (!pb_decode_tag(stream, &wire_type, &tag, &eof))
        {
            if (eof)
                break;
            else
                return false;
        }

        if (tag == 0)
        {
          if (flags & PB_DECODE_NULLTERMINATED)
          {
            break;
          }
          else
          {
            PB_RETURN_ERROR(stream, "zero tag");
          }
        }

        if (!pb_field_iter_find(&iter, tag) || PB_LTYPE(iter.type) == PB_LTYPE_EXTENSION)
        {
            /* No match found, check if it matches an extension. */
            if (tag >= extension_range_start)
            {
                if (!find_extension_field(&iter))
                    extension_range_start = (uint32_t)-1;
                else
                    extension_range_start = iter.tag;

                if (tag >= extension_range_start)
                {
                    size_t pos = stream->bytes_left;

                    if (!decode_extension(stream, tag, wire_type, &iter))
                        return false;

                    if (pos != stream->bytes_left)
                    {
                        /* The field was handled */
                        continue;
                    }
                }
            }

            /* No match found, skip data */
            if (!pb_skip_field(stream, wire_type))
                return false;
            continue;
        }

        /* If a repeated fixed count field was found, get size from
         * 'fixed_count_field' as there is no counter contained in the struct.
         */
        if (PB_HTYPE(iter.type) == PB_HTYPE_REPEATED && iter.pSize == &iter.array_size)
        {
            if (fixed_count_field != iter.index) {
                /* If the new fixed count field does not match the previous one,
                 * check that the previous one is NULL or that it finished
                 * receiving all the expected data.
                 */
                if (fixed_count_field != PB_SIZE_MAX &&
                    fixed_count_size != fixed_count_total_size)
                {
                    PB_RETURN_ERROR(stream, "wrong size for fixed count field");
                }

                fixed_count_field = iter.index;
                fixed_count_size = 0;
                fixed_count_total_size = iter.array_size;
            }

            iter.pSize = &fixed_count_size;
        }

        if (PB_HTYPE(iter.type) == PB_HTYPE_REQUIRED
            && iter.required_field_index < PB_MAX_REQUIRED_FIELDS)
        {
            uint32_t tmp = ((uint32_t)1 << (iter.required_field_index & 31));
            fields_seen.bitfield[iter.required_field_index >> 5] |= tmp;
        }

        if (!decode_field(stream, wire_type, &iter))
            return false;
    }

    /* Check that all elements of the last decoded fixed count field were present. */
    if (fixed_count_field != PB_SIZE_MAX &&
        fixed_count_size != fixed_count_total_size)
    {
        PB_RETURN_ERROR(stream, "wrong size for fixed count field");
    }

    /* Check that all required fields were present. */
    {
        /* First figure out the number of required fields by
         * seeking to the end of the field array. Usually we
         * are already close to end after decoding.
         */
        pb_size_t req_field_count;
        pb_type_t last_type;
        pb_size_t i;
        do {
            req_field_count = iter.required_field_index;
            last_type = iter.type;
        } while (pb_field_iter_next(&iter));

        /* Fixup if last field was also required. */
        if (PB_HTYPE(last_type) == PB_HTYPE_REQUIRED && iter.tag != 0)
            req_field_count++;

        if (req_field_count > PB_MAX_REQUIRED_FIELDS)
            req_field_count = PB_MAX_REQUIRED_FIELDS;

        if (req_field_count > 0)
        {
            /* Check the whole words */
            for (i = 0; i < (req_field_count >> 5); i++)
            {
                if (fields_seen.bitfield[i] != allbits)
                    PB_RETURN_ERROR(stream, "missing required field");
            }

            /* Check the remaining bits (if any) */
            if ((req_field_count & 31) != 0)
            {
                if (fields_seen.bitfield[req_field_count >> 5] !=
                    (allbits >> (uint_least8_t)(32 - (req_field_count & 31))))
                {
                    PB_RETURN_ERROR(stream, "missing required field");
                }
            }
        }
    }

    return true;
}

bool checkreturn pb_decode_ex(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct, unsigned int flags)
{
    bool status;

    if ((flags & PB_DECODE_DELIMITED) == 0)
    {
      status = pb_decode_inner(stream, fields, dest_struct, flags);
    }
    else
    {
      pb_istream_t substream;
      if (!pb_make_string_substream(stream, &substream))
        return false;

      status = pb_decode_inner(&substream, fields, dest_struct, flags);

      if (!pb_close_string_substream(stream, &substream))
        return false;
    }
    
#ifdef PB_ENABLE_MALLOC
    if (!status)
        pb_release(fields, dest_struct);
#endif
    
    return status;
}

bool checkreturn pb_decode(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct)
{
    bool status;

    status = pb_decode_inner(stream, fields, dest_struct, 0);

#ifdef PB_ENABLE_MALLOC
    if (!status)
        pb_release(fields, dest_struct);
#endif

    return status;
}

#ifdef PB_ENABLE_MALLOC
/* Given an oneof field, if there has already been a field inside this oneof,
 * release it before overwriting with a different one. */
static bool pb_release_union_field(pb_istream_t *stream, pb_field_iter_t *field)
{
    pb_field_iter_t old_field = *field;
    pb_size_t old_tag = *(pb_size_t*)field->pSize; /* Previous which_ value */
    pb_size_t new_tag = field->tag; /* New which_ value */

    if (old_tag == 0)
        return true; /* Ok, no old data in union */

    if (old_tag == new_tag)
        return true; /* Ok, old data is of same type => merge */

    /* Release old data. The find can fail if the message struct contains
     * invalid data. */
    if (!pb_field_iter_find(&old_field, old_tag))
        PB_RETURN_ERROR(stream, "invalid union tag");

    pb_release_single_field(&old_field);

    return true;
}

static void pb_release_single_field(pb_field_iter_t *field)
{
    pb_type_t type;
    type = field->type;

    if (PB_HTYPE(type) == PB_HTYPE_ONEOF)
    {
        if (*(pb_size_t*)field->pSize != field->tag)
            return; /* This is not the current field in the union */
    }

    /* Release anything contained inside an extension or submsg.
     * This has to be done even if the submsg itself is statically
     * allocated. */
    if (PB_LTYPE(type) == PB_LTYPE_EXTENSION)
    {
        /* Release fields from all extensions in the linked list */
        pb_extension_t *ext = *(pb_extension_t**)field->pData;
        while (ext != NULL)
        {
            pb_field_iter_t ext_iter;
            if (pb_field_iter_begin_extension(&ext_iter, ext))
            {
                pb_release_single_field(&ext_iter);
            }
            ext = ext->next;
        }
    }
    else if (PB_LTYPE_IS_SUBMSG(type) && PB_ATYPE(type) != PB_ATYPE_CALLBACK)
    {
        /* Release fields in submessage or submsg array */
        pb_size_t count = 1;
        
        if (PB_ATYPE(type) == PB_ATYPE_POINTER)
        {
            field->pData = *(void**)field->pField;
        }
        else
        {
            field->pData = field->pField;
        }
        
        if (PB_HTYPE(type) == PB_HTYPE_REPEATED)
        {
            count = *(pb_size_t*)field->pSize;

            if (PB_ATYPE(type) == PB_ATYPE_STATIC && count > field->array_size)
            {
                /* Protect against corrupted _count fields */
                count = field->array_size;
            }
        }
        
        if (field->pData)
        {
            while (count--)
            {
                pb_release(field->submsg_desc, field->pData);
                field->pData = (char*)field->pData + field->data_size;
            }
        }
    }
    
    if (PB_ATYPE(type) == PB_ATYPE_POINTER)
    {
        if (PB_HTYPE(type) == PB_HTYPE_REPEATED &&
            (PB_LTYPE(type) == PB_LTYPE_STRING ||
             PB_LTYPE(type) == PB_LTYPE_BYTES))
        {
            /* Release entries in repeated string or bytes array */
            void **pItem = *(void***)field->pField;
            pb_size_t count = *(pb_size_t*)field->pSize;
            while (count--)
            {
                pb_free(*pItem);
                *pItem++ = NULL;
            }
        }
        
        if (PB_HTYPE(type) == PB_HTYPE_REPEATED)
        {
            /* We are going to release the array, so set the size to 0 */
            *(pb_size_t*)field->pSize = 0;
        }
        
        /* Release main pointer */
        pb_free(*(void**)field->pField);
        *(void**)field->pField = NULL;
    }
}

void pb_release(const pb_msgdesc_t *fields, void *dest_struct)
{
    pb_field_iter_t iter;
    
    if (!dest_struct)
        return; /* Ignore NULL pointers, similar to free() */

    if (!pb_field_iter_begin(&iter, fields, dest_struct))
        return; /* Empty message type */
    
    do
    {
        pb_release_single_field(&iter);
    } while (pb_field_iter_next(&iter));
}
#endif

/* Field decoders */

bool pb_decode_bool(pb_istream_t *stream, bool *dest)
{
    uint32_t value;
    if (!pb_decode_varint32(stream, &value))
        return false;

    *(bool*)dest = (value != 0);
    return true;
}

bool pb_decode_svarint(pb_istream_t *stream, pb_int64_t *dest)
{
    pb_uint64_t value;
    if (!pb_decode_varint(stream, &value))
        return false;
    
    if (value & 1)
        *dest = (pb_int64_t)(~(value >> 1));
    else
        *dest = (pb_int64_t)(value >> 1);
    
    return true;
}

bool pb_decode_fixed32(pb_istream_t *stream, void *dest)
{
    union {
        uint32_t fixed32;
        pb_byte_t bytes[4];
    } u;

    if (!pb_read(stream, u.bytes, 4))
        return false;

#if defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN && CHAR_BIT == 8
    /* fast path - if we know that we're on little endian, assign directly */
    *(uint32_t*)dest = u.fixed32;
#else
    *(uint32_t*)dest = ((uint32_t)u.bytes[0] << 0) |
                       ((uint32_t)u.bytes[1] << 8) |
                       ((uint32_t)u.bytes[2] << 16) |
                       ((uint32_t)u.bytes[3] << 24);
#endif
    return true;
}

#ifndef PB_WITHOUT_64BIT
bool pb_decode_fixed64(pb_istream_t *stream, void *dest)
{
    union {
        uint64_t fixed64;
        pb_byte_t bytes[8];
    } u;

    if (!pb_read(stream, u.bytes, 8))
        return false;

#if defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN && CHAR_BIT == 8
    /* fast path - if we know that we're on little endian, assign directly */
    *(uint64_t*)dest = u.fixed64;
#else
    *(uint64_t*)dest = ((uint64_t)u.bytes[0] << 0) |
                       ((uint64_t)u.bytes[1] << 8) |
                       ((uint64_t)u.bytes[2] << 16) |
                       ((uint64_t)u.bytes[3] << 24) |
                       ((uint64_t)u.bytes[4] << 32) |
                       ((uint64_t)u.bytes[5] << 40) |
                       ((uint64_t)u.bytes[6] << 48) |
                       ((uint64_t)u.bytes[7] << 56);
#endif
    return true;
}
#endif

static bool checkreturn pb_dec_bool(pb_istream_t *stream, const pb_field_iter_t *field)
{
    return pb_decode_bool(stream, (bool*)field->pData);
}

static bool checkreturn pb_dec_varint(pb_istream_t *stream, const pb_field_iter_t *field)
{
    if (PB_LTYPE(field->type) == PB_LTYPE_UVARINT)
    {
        pb_uint64_t value, clamped;
        if (!pb_decode_varint(stream, &value))
            return false;

        /* Cast to the proper field size, while checking for overflows */
        if (field->data_size == sizeof(pb_uint64_t))
            clamped = *(pb_uint64_t*)field->pData = value;
        else if (field->data_size == sizeof(uint32_t))
            clamped = *(uint32_t*)field->pData = (uint32_t)value;
        else if (field->data_size == sizeof(uint_least16_t))
            clamped = *(uint_least16_t*)field->pData = (uint_least16_t)value;
        else if (field->data_size == sizeof(uint_least8_t))
            clamped = *(uint_least8_t*)field->pData = (uint_least8_t)value;
        else
            PB_RETURN_ERROR(stream, "invalid data_size");

        if (clamped != value)
            PB_RETURN_ERROR(stream, "integer too large");

        return true;
    }
    else
    {
        pb_uint64_t value;
        pb_int64_t svalue;
        pb_int64_t clamped;

        if (PB_LTYPE(field->type) == PB_LTYPE_SVARINT)
        {
            if (!pb_decode_svarint(stream, &svalue))
                return false;
        }
        else
        {
            if (!pb_decode_varint(stream, &value))
                return false;

            /* See issue 97: Google's C++ protobuf allows negative varint values to
            * be cast as int32_t, instead of the int64_t that should be used when
            * encoding. Previous nanopb versions had a bug in encoding. In order to
            * not break decoding of such messages, we cast <=32 bit fields to
            * int32_t first to get the sign correct.
            */
            if (field->data_size == sizeof(pb_int64_t))
                svalue = (pb_int64_t)value;
            else
                svalue = (int32_t)value;
        }

        /* Cast to the proper field size, while checking for overflows */
        if (field->data_size == sizeof(pb_int64_t))
            clamped = *(pb_int64_t*)field->pData = svalue;
        else if (field->data_size == sizeof(int32_t))
            clamped = *(int32_t*)field->pData = (int32_t)svalue;
        else if (field->data_size == sizeof(int_least16_t))
            clamped = *(int_least16_t*)field->pData = (int_least16_t)svalue;
        else if (field->data_size == sizeof(int_least8_t))
            clamped = *(int_least8_t*)field->pData = (int_least8_t)svalue;
        else
            PB_RETURN_ERROR(stream, "invalid data_size");

        if (clamped != svalue)
            PB_RETURN_ERROR(stream, "integer too large");

        return true;
    }
}

static bool checkreturn pb_dec_fixed(pb_istream_t *stream, const pb_field_iter_t *field)
{
#ifdef PB_CONVERT_DOUBLE_FLOAT
    if (field->data_size == sizeof(float) && PB_LTYPE(field->type) == PB_LTYPE_FIXED64)
    {
        return pb_decode_double_as_float(stream, (float*)field->pData);
    }
#endif

    if (field->data_size == sizeof(uint32_t))
    {
        return pb_decode_fixed32(stream, field->pData);
    }
#ifndef PB_WITHOUT_64BIT
    else if (field->data_size == sizeof(uint64_t))
    {
        return pb_decode_fixed64(stream, field->pData);
    }
#endif
    else
    {
        PB_RETURN_ERROR(stream, "invalid data_size");
    }
}

static bool checkreturn pb_dec_bytes(pb_istream_t *stream, const pb_field_iter_t *field)
{
    uint32_t size;
    size_t alloc_size;
    pb_bytes_array_t *dest;
    
    if (!pb_decode_varint32(stream, &size))
        return false;
    
    if (size > PB_SIZE_MAX)
        PB_RETURN_ERROR(stream, "bytes overflow");
    
    alloc_size = PB_BYTES_ARRAY_T_ALLOCSIZE(size);
    if (size > alloc_size)
        PB_RETURN_ERROR(stream, "size too large");
    
    if (PB_ATYPE(field->type) == PB_ATYPE_POINTER)
    {
#ifndef PB_ENABLE_MALLOC
        PB_RETURN_ERROR(stream, "no malloc support");
#else
        if (stream->bytes_left < size)
            PB_RETURN_ERROR(stream, "end-of-stream");

        if (!allocate_field(stream, field->pData, alloc_size, 1))
            return false;
        dest = *(pb_bytes_array_t**)field->pData;
#endif
    }
    else
    {
        if (alloc_size > field->data_size)
            PB_RETURN_ERROR(stream, "bytes overflow");
        dest = (pb_bytes_array_t*)field->pData;
    }

    dest->size = (pb_size_t)size;
    return pb_read(stream, dest->bytes, (size_t)size);
}

static bool checkreturn pb_dec_string(pb_istream_t *stream, const pb_field_iter_t *field)
{
    uint32_t size;
    size_t alloc_size;
    pb_byte_t *dest = (pb_byte_t*)field->pData;

    if (!pb_decode_varint32(stream, &size))
        return false;

    if (size == (uint32_t)-1)
        PB_RETURN_ERROR(stream, "size too large");

    /* Space for null terminator */
    alloc_size = (size_t)(size + 1);

    if (alloc_size < size)
        PB_RETURN_ERROR(stream, "size too large");

    if (PB_ATYPE(field->type) == PB_ATYPE_POINTER)
    {
#ifndef PB_ENABLE_MALLOC
        PB_RETURN_ERROR(stream, "no malloc support");
#else
        if (stream->bytes_left < size)
            PB_RETURN_ERROR(stream, "end-of-stream");

        if (!allocate_field(stream, field->pData, alloc_size, 1))
            return false;
        dest = *(pb_byte_t**)field->pData;
#endif
    }
    else
    {
        if (alloc_size > field->data_size)
            PB_RETURN_ERROR(stream, "string overflow");
    }
    
    dest[size] = 0;

    if (!pb_read(stream, dest, (size_t)size))
        return false;

#ifdef PB_VALIDATE_UTF8
    if (!pb_validate_utf8((const char*)dest))
        PB_RETURN_ERROR(stream, "invalid utf8");
#endif

    return true;
}

static bool checkreturn pb_dec_submessage(pb_istream_t *stream, const pb_field_iter_t *field)
{
    bool status = true;
    pb_istream_t substream;

    if (!pb_make_string_substream(stream, &substream))
        return false;
    
    if (field->submsg_desc == NULL)
        PB_RETURN_ERROR(stream, "invalid field descriptor");
    
    /* New array entries need to be initialized, while required and optional
     * submessages have already been initialized in the top-level pb_decode. */
    if (PB_HTYPE(field->type) == PB_HTYPE_REPEATED ||
        PB_HTYPE(field->type) == PB_HTYPE_ONEOF)
    {
        pb_field_iter_t submsg_iter;
        if (pb_field_iter_begin(&submsg_iter, field->submsg_desc, field->pData))
        {
            if (!pb_message_set_to_defaults(&submsg_iter))
                PB_RETURN_ERROR(stream, "failed to set defaults");
        }
    }

    /* Submessages can have a separate message-level callback that is called
     * before decoding the message. Typically it is used to set callback fields
     * inside oneofs. */
    if (PB_LTYPE(field->type) == PB_LTYPE_SUBMSG_W_CB && field->pSize != NULL)
    {
        /* Message callback is stored right before pSize. */
        pb_callback_t *callback = (pb_callback_t*)field->pSize - 1;
        if (callback->funcs.decode)
        {
            status = callback->funcs.decode(&substream, field, &callback->arg);
        }
    }

    /* Now decode the submessage contents */
    if (status)
    {
        status = pb_decode_inner(&substream, field->submsg_desc, field->pData, 0);
    }
    
    if (!pb_close_string_substream(stream, &substream))
        return false;

    return status;
}

static bool checkreturn pb_dec_fixed_length_bytes(pb_istream_t *stream, const pb_field_iter_t *field)
{
    uint32_t size;

    if (!pb_decode_varint32(stream, &size))
        return false;

    if (size > PB_SIZE_MAX)
        PB_RETURN_ERROR(stream, "bytes overflow");

    if (size == 0)
    {
        /* As a special case, treat empty bytes string as all zeros for fixed_length_bytes. */
        memset(field->pData, 0, (size_t)field->data_size);
        return true;
    }

    if (size != field->data_size)
        PB_RETURN_ERROR(stream, "incorrect fixed length bytes size");

    return pb_read(stream, (pb_byte_t*)field->pData, (size_t)field->data_size);
}

#ifdef PB_CONVERT_DOUBLE_FLOAT
bool pb_decode_double_as_float(pb_istream_t *stream, float *dest)
{
    uint_least8_t sign;
    int exponent;
    uint32_t mantissa;
    uint64_t value;
    union { float f; uint32_t i; } out;

    if (!pb_decode_fixed64(stream, &value))
        return false;

    /* Decompose input value */
    sign = (uint_least8_t)((value >> 63) & 1);
    exponent = (int)((value >> 52) & 0x7FF) - 1023;
    mantissa = (value >> 28) & 0xFFFFFF; /* Highest 24 bits */

    /* Figure if value is in range representable by floats. */
    if (exponent == 1024)
    {
        /* Special value */
        exponent = 128;
    }
    else if (exponent > 127)
    {
        /* Too large, convert to infinity */
        exponent = 128;
        mantissa = 0;
    }
    else if (exponent < -150)
    {
        /* Too small, convert to zero */
        exponent = -127;
        mantissa = 0;
    }
    else if (exponent < -126)
    {
        /* Denormalized */
        mantissa |= 0x1000000;
        mantissa >>= (-126 - exponent);
        exponent = -127;
    }

    /* Round off mantissa */
    mantissa = (mantissa + 1) >> 1;

    /* Check if mantissa went over 2.0 */
    if (mantissa & 0x800000)
    {
        exponent += 1;
        mantissa &= 0x7FFFFF;
        mantissa >>= 1;
    }

    /* Combine fields */
    out.i = mantissa;
    out.i |= (uint32_t)(exponent + 127) << 23;
    out.i |= (uint32_t)sign << 31;

    *dest = out.f;
    return true;
}
#endif


================================================
FILE: c/core/src/pb_encode.c
================================================
/* pb_encode.c -- encode a protobuf using minimal resources
 *
 * 2011 Petteri Aimonen <jpa@kapsi.fi>
 */

#include "pb.h"
#include "pb_encode.h"
#include "pb_common.h"

/* Use the GCC warn_unused_result attribute to check that all return values
 * are propagated correctly. On other compilers and gcc before 3.4.0 just
 * ignore the annotation.
 */
#if !defined(__GNUC__) || ( __GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 4)
    #define checkreturn
#else
    #define checkreturn __attribute__((warn_unused_result))
#endif

/**************************************
 * Declarations internal to this file *
 **************************************/
static bool checkreturn buf_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count);
static bool checkreturn encode_array(pb_ostream_t *stream, pb_field_iter_t *field);
static bool checkreturn pb_check_proto3_default_value(const pb_field_iter_t *field);
static bool checkreturn encode_basic_field(pb_ostream_t *stream, const pb_field_iter_t *field);
static bool checkreturn encode_callback_field(pb_ostream_t *stream, const pb_field_iter_t *field);
static bool checkreturn encode_field(pb_ostream_t *stream, pb_field_iter_t *field);
static bool checkreturn encode_extension_field(pb_ostream_t *stream, const pb_field_iter_t *field);
static bool checkreturn default_extension_encoder(pb_ostream_t *stream, const pb_extension_t *extension);
static bool checkreturn pb_encode_varint_32(pb_ostream_t *stream, uint32_t low, uint32_t high);
static bool checkreturn pb_enc_bool(pb_ostream_t *stream, const pb_field_iter_t *field);
static bool checkreturn pb_enc_varint(pb_ostream_t *stream, const pb_field_iter_t *field);
static bool checkreturn pb_enc_fixed(pb_ostream_t *stream, const pb_field_iter_t *field);
static bool checkreturn pb_enc_bytes(pb_ostream_t *stream, const pb_field_iter_t *field);
static bool checkreturn pb_enc_string(pb_ostream_t *stream, const pb_field_iter_t *field);
static bool checkreturn pb_enc_submessage(pb_ostream_t *stream, const pb_field_iter_t *field);
static bool checkreturn pb_enc_fixed_length_bytes(pb_ostream_t *stream, const pb_field_iter_t *field);

#ifdef PB_WITHOUT_64BIT
#define pb_int64_t int32_t
#define pb_uint64_t uint32_t
#else
#define pb_int64_t int64_t
#define pb_uint64_t uint64_t
#endif

/*******************************
 * pb_ostream_t implementation *
 *******************************/

static bool checkreturn buf_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count)
{
    size_t i;
    pb_byte_t *dest = (pb_byte_t*)stream->state;
    stream->state = dest + count;
    
    for (i = 0; i < count; i++)
        dest[i] = buf[i];
    
    return true;
}

pb_ostream_t pb_ostream_from_buffer(pb_byte_t *buf, size_t bufsize)
{
    pb_ostream_t stream;
#ifdef PB_BUFFER_ONLY
    stream.callback = (void*)1; /* Just a marker value */
#else
    stream.callback = &buf_write;
#endif
    stream.state = buf;
    stream.max_size = bufsize;
    stream.bytes_written = 0;
#ifndef PB_NO_ERRMSG
    stream.errmsg = NULL;
#endif
    return stream;
}

bool checkreturn pb_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count)
{
    if (count > 0 && stream->callback != NULL)
    {
        if (stream->bytes_written + count > stream->max_size)
            PB_RETURN_ERROR(stream, "stream full");

#ifdef PB_BUFFER_ONLY
        if (!buf_write(stream, buf, count))
            PB_RETURN_ERROR(stream, "io error");
#else        
        if (!stream->callback(stream, buf, count))
            PB_RETURN_ERROR(stream, "io error");
#endif
    }
    
    stream->bytes_written += count;
    return true;
}

/*************************
 * Encode a single field *
 *************************/

/* Read a bool value without causing undefined behavior even if the value
 * is invalid. See issue #434 and
 * https://stackoverflow.com/questions/27661768/weird-results-for-conditional
 */
static bool safe_read_bool(const void *pSize)
{
    const char *p = (const char *)pSize;
    size_t i;
    for (i = 0; i < sizeof(bool); i++)
    {
        if (p[i] != 0)
            return true;
    }
    return false;
}

/* Encode a static array. Handles the size calculations and possible packing. */
static bool checkreturn encode_array(pb_ostream_t *stream, pb_field_iter_t *field)
{
    pb_size_t i;
    pb_size_t count;
#ifndef PB_ENCODE_ARRAYS_UNPACKED
    size_t size;
#endif

    count = *(pb_size_t*)field->pSize;

    if (count == 0)
        return true;

    if (PB_ATYPE(field->type) != PB_ATYPE_POINTER && count > field->array_size)
        PB_RETURN_ERROR(stream, "array max size exceeded");
    
#ifndef PB_ENCODE_ARRAYS_UNPACKED
    /* We always pack arrays if the datatype allows it. */
    if (PB_LTYPE(field->type) <= PB_LTYPE_LAST_PACKABLE)
    {
        if (!pb_encode_tag(stream, PB_WT_STRING, field->tag))
            return false;
        
        /* Determine the total size of packed array. */
        if (PB_LTYPE(field->type) == PB_LTYPE_FIXED32)
        {
            size = 4 * (size_t)count;
        }
        else if (PB_LTYPE(field->type) == PB_LTYPE_FIXED64)
        {
            size = 8 * (size_t)count;
        }
        else
        { 
            pb_ostream_t sizestream = PB_OSTREAM_SIZING;
            void *pData_orig = field->pData;
            for (i = 0; i < count; i++)
            {
                if (!pb_enc_varint(&sizestream, field))
                    PB_RETURN_ERROR(stream, PB_GET_ERROR(&sizestream));
                field->pData = (char*)field->pData + field->data_size;
            }
            field->pData = pData_orig;
            size = sizestream.bytes_written;
        }
        
        if (!pb_encode_varint(stream, (pb_uint64_t)size))
            return false;
        
        if (stream->callback == NULL)
            return pb_write(stream, NULL, size); /* Just sizing.. */
        
        /* Write the data */
        for (i = 0; i < count; i++)
        {
            if (PB_LTYPE(field->type) == PB_LTYPE_FIXED32 || PB_LTYPE(field->type) == PB_LTYPE_FIXED64)
            {
                if (!pb_enc_fixed(stream, field))
                    return false;
            }
            else
            {
                if (!pb_enc_varint(stream, field))
                    return false;
            }

            field->pData = (char*)field->pData + field->data_size;
        }
    }
    else /* Unpacked fields */
#endif
    {
        for (i = 0; i < count; i++)
        {
            /* Normally the data is stored directly in the array entries, but
             * for pointer-type string and bytes fields, the array entries are
             * actually pointers themselves also. So we have to dereference once
             * more to get to the actual data. */
            if (PB_ATYPE(field->type) == PB_ATYPE_POINTER &&
                (PB_LTYPE(field->type) == PB_LTYPE_STRING ||
                 PB_LTYPE(field->type) == PB_LTYPE_BYTES))
            {
                bool status;
                void *pData_orig = field->pData;
                field->pData = *(void* const*)field->pData;

                if (!field->pData)
                {
                    /* Null pointer in array is treated as empty string / bytes */
                    status = pb_encode_tag_for_field(stream, field) &&
                             pb_encode_varint(stream, 0);
                }
                else
                {
                    status = encode_basic_field(stream, field);
                }

                field->pData = pData_orig;

                if (!status)
                    return false;
            }
            else
            {
                if (!encode_basic_field(stream, field))
                    return false;
            }
            field->pData = (char*)field->pData + field->data_size;
        }
    }
    
    return true;
}

/* In proto3, all fields are optional and are only encoded if their value is "non-zero".
 * This function implements the check for the zero value. */
static bool checkreturn pb_check_proto3_default_value(const pb_field_iter_t *field)
{
    pb_type_t type = field->type;

    if (PB_ATYPE(type) == PB_ATYPE_STATIC)
    {
        if (PB_HTYPE(type) == PB_HTYPE_REQUIRED)
        {
            /* Required proto2 fields inside proto3 submessage, pretty rare case */
            return false;
        }
        else if (PB_HTYPE(type) == PB_HTYPE_REPEATED)
        {
            /* Repeated fields inside proto3 submessage: present if count != 0 */
            return *(const pb_size_t*)field->pSize == 0;
        }
        else if (PB_HTYPE(type) == PB_HTYPE_ONEOF)
        {
            /* Oneof fields */
            return *(const pb_size_t*)field->pSize == 0;
        }
        else if (PB_HTYPE(type) == PB_HTYPE_OPTIONAL && field->pSize != NULL)
        {
            /* Proto2 optional fields inside proto3 message, or proto3
             * submessage fields. */
            return safe_read_bool(field->pSize) == false;
        }

        /* Rest is proto3 singular fields */
        if (PB_LTYPE(type) == PB_LTYPE_BYTES)
        {
            const pb_bytes_array_t *bytes = (const pb_bytes_array_t*)field->pData;
            return bytes->size == 0;
        }
        else if (PB_LTYPE(type) == PB_LTYPE_STRING)
        {
            return *(const char*)field->pData == '\0';
        }
        else if (PB_LTYPE(type) == PB_LTYPE_FIXED_LENGTH_BYTES)
        {
            /* Fixed length bytes is only empty if its length is fixed
             * as 0. Which would be pretty strange, but we can check
             * it anyway. */
            return field->data_size == 0;
        }
        else if (PB_LTYPE_IS_SUBMSG(type))
        {
            /* Check all fields in the submessage to find if any of them
             * are non-zero. The comparison cannot be done byte-per-byte
             * because the C struct may contain padding bytes that must
             * be skipped. Note that usually proto3 submessages have
             * a separate has_field that is checked earlier in this if.
             */
            pb_field_iter_t iter;
            if (pb_field_iter_begin(&iter, field->submsg_desc, field->pData))
            {
                do
                {
                    if (!pb_check_proto3_default_value(&iter))
                    {
                        return false;
                    }
                } while (pb_field_iter_next(&iter));
            }
            return true;
        }
    }
    
    {
        /* Catch-all branch that does byte-per-byte comparison for zero value.
         *
         
Download .txt
gitextract_k27y6kok/

├── .gitignore
├── LICENCE
├── README.md
├── RELEASE_NOTES.md
├── about.html
├── c/
│   ├── core/
│   │   ├── Makefile
│   │   ├── include/
│   │   │   ├── pb.h
│   │   │   ├── pb_common.h
│   │   │   ├── pb_decode.h
│   │   │   ├── pb_encode.h
│   │   │   ├── tahu.h
│   │   │   └── tahu.pb.h
│   │   ├── readme.txt
│   │   ├── src/
│   │   │   ├── pb_common.c
│   │   │   ├── pb_decode.c
│   │   │   ├── pb_encode.c
│   │   │   ├── tahu.c
│   │   │   ├── tahu.pb
│   │   │   └── tahu.pb.c
│   │   ├── tahu.options
│   │   ├── test/
│   │   │   ├── .gitignore
│   │   │   └── test.c
│   │   └── test.sh
│   └── examples/
│       ├── template_as_custom_props/
│       │   ├── Makefile
│       │   └── example.c
│       └── udt_example/
│           ├── Makefile
│           └── example.c
├── c_sharp/
│   └── core/
│       ├── readme.txt
│       └── src/
│           └── SparkplugBCSharp.cs
├── edl-v10.html
├── epl-v20.html
├── java/
│   ├── .gitignore
│   ├── README.md
│   ├── compat_impl/
│   │   ├── edge/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── org/
│   │   │           │       └── eclipse/
│   │   │           │           └── tahu/
│   │   │           │               └── edge/
│   │   │           │                   ├── CommandCallback.java
│   │   │           │                   ├── CommandListener.java
│   │   │           │                   ├── PeriodicPublisher.java
│   │   │           │                   ├── SparkplugEdgeNode.java
│   │   │           │                   └── sim/
│   │   │           │                       ├── DataSimulator.java
│   │   │           │                       └── RandomDataSimulator.java
│   │   │           └── resources/
│   │   │               └── logback.xml
│   │   └── host/
│   │       ├── pom.xml
│   │       └── src/
│   │           └── main/
│   │               ├── java/
│   │               │   └── org/
│   │               │       └── eclipse/
│   │               │           └── tahu/
│   │               │               └── host/
│   │               │                   ├── CommandListener.java
│   │               │                   └── SparkplugHostApplication.java
│   │               └── resources/
│   │                   ├── logback.out.xml
│   │                   └── logback.xml
│   ├── examples/
│   │   ├── device_timestamp/
│   │   │   ├── THIRD-PARTY.txt
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── org/
│   │   │                   └── eclipse/
│   │   │                       └── tahu/
│   │   │                           └── SparkplugExample.java
│   │   ├── edge_node_control/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── org/
│   │   │                   └── eclipse/
│   │   │                       └── tahu/
│   │   │                           └── SparkplugExample.java
│   │   ├── host_file/
│   │   │   ├── THIRD-PARTY.txt
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── org/
│   │   │                   └── eclipse/
│   │   │                       └── tahu/
│   │   │                           └── example/
│   │   │                               └── host/
│   │   │                                   └── file/
│   │   │                                       ├── FileAssembler.java
│   │   │                                       ├── Publisher.java
│   │   │                                       ├── SparkplugExample.java
│   │   │                                       ├── model/
│   │   │                                       │   ├── EdgeNode.java
│   │   │                                       │   └── FilePublishStatus.java
│   │   │                                       └── util/
│   │   │                                           └── FileValidationUtils.java
│   │   ├── listener/
│   │   │   ├── THIRD-PARTY.txt
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── org/
│   │   │           │       └── eclipse/
│   │   │           │           └── tahu/
│   │   │           │               └── SparkplugListener.java
│   │   │           └── resources/
│   │   │               └── log4j.properties
│   │   ├── pom.xml
│   │   ├── raspberry_pi/
│   │   │   ├── THIRD-PARTY.txt
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── org/
│   │   │                   └── eclipse/
│   │   │                       └── tahu/
│   │   │                           ├── SparkplugRaspberryPiExample.java
│   │   │                           ├── pi/
│   │   │                           │   ├── dio/
│   │   │                           │   │   ├── DigitalOutputPin.java
│   │   │                           │   │   ├── DioException.java
│   │   │                           │   │   ├── DioLibrary.java
│   │   │                           │   │   ├── DioPin.java
│   │   │                           │   │   ├── PinDirection.java
│   │   │                           │   │   └── Pins.java
│   │   │                           │   └── system/
│   │   │                           │       ├── BoardModels.java
│   │   │                           │       ├── SystemInfo.java
│   │   │                           │       └── SystemInfoException.java
│   │   │                           └── pibrella/
│   │   │                               ├── Pibrella.java
│   │   │                               ├── PibrellaButton.java
│   │   │                               ├── PibrellaBuzzer.java
│   │   │                               ├── PibrellaInputPin.java
│   │   │                               ├── PibrellaInputPins.java
│   │   │                               ├── PibrellaLED.java
│   │   │                               ├── PibrellaLEDs.java
│   │   │                               ├── PibrellaOutputPin.java
│   │   │                               ├── PibrellaOutputPins.java
│   │   │                               └── PibrellaPins.java
│   │   ├── records/
│   │   │   ├── THIRD-PARTY.txt
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── org/
│   │   │                   └── eclipse/
│   │   │                       └── tahu/
│   │   │                           └── SparkplugRecordsExample.java
│   │   ├── simple/
│   │   │   ├── THIRD-PARTY.txt
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── org/
│   │   │                   └── eclipse/
│   │   │                       └── tahu/
│   │   │                           └── SparkplugExample.java
│   │   └── udt/
│   │       ├── pom.xml
│   │       └── src/
│   │           └── main/
│   │               └── java/
│   │                   └── org/
│   │                       └── eclipse/
│   │                           └── tahu/
│   │                               └── SparkplugExample.java
│   ├── lib/
│   │   ├── core/
│   │   │   ├── pom.xml
│   │   │   ├── readme.txt
│   │   │   └── src/
│   │   │       ├── main/
│   │   │       │   ├── java/
│   │   │       │   │   └── org/
│   │   │       │   │       └── eclipse/
│   │   │       │   │           └── tahu/
│   │   │       │   │               ├── SparkplugException.java
│   │   │       │   │               ├── SparkplugInvalidTypeException.java
│   │   │       │   │               ├── SparkplugParsingException.java
│   │   │       │   │               ├── exception/
│   │   │       │   │               │   ├── TahuErrorCode.java
│   │   │       │   │               │   └── TahuException.java
│   │   │       │   │               ├── json/
│   │   │       │   │               │   ├── DataSetDeserializer.java
│   │   │       │   │               │   ├── DeserializerModifier.java
│   │   │       │   │               │   ├── DeserializerModule.java
│   │   │       │   │               │   ├── FileSerializer.java
│   │   │       │   │               │   ├── JsonValidator.java
│   │   │       │   │               │   ├── MetricDeserializer.java
│   │   │       │   │               │   ├── PropertySetDeserializer.java
│   │   │       │   │               │   └── TemplateDeserializer.java
│   │   │       │   │               ├── message/
│   │   │       │   │               │   ├── BdSeqManager.java
│   │   │       │   │               │   ├── DefaultBdSeqManager.java
│   │   │       │   │               │   ├── PayloadDecoder.java
│   │   │       │   │               │   ├── PayloadEncoder.java
│   │   │       │   │               │   ├── SparkplugBPayloadDecoder.java
│   │   │       │   │               │   ├── SparkplugBPayloadEncoder.java
│   │   │       │   │               │   └── model/
│   │   │       │   │               │       ├── DataSet.java
│   │   │       │   │               │       ├── DataSetDataType.java
│   │   │       │   │               │       ├── DeviceDescriptor.java
│   │   │       │   │               │       ├── EdgeNodeDescriptor.java
│   │   │       │   │               │       ├── File.java
│   │   │       │   │               │       ├── Message.java
│   │   │       │   │               │       ├── MessageType.java
│   │   │       │   │               │       ├── MetaData.java
│   │   │       │   │               │       ├── Metric.java
│   │   │       │   │               │       ├── MetricDataType.java
│   │   │       │   │               │       ├── Parameter.java
│   │   │       │   │               │       ├── ParameterDataType.java
│   │   │       │   │               │       ├── Property.java
│   │   │       │   │               │       ├── PropertyDataType.java
│   │   │       │   │               │       ├── PropertySet.java
│   │   │       │   │               │       ├── PropertyValue.java
│   │   │       │   │               │       ├── Quality.java
│   │   │       │   │               │       ├── Row.java
│   │   │       │   │               │       ├── SparkplugBPayload.java
│   │   │       │   │               │       ├── SparkplugBPayloadMap.java
│   │   │       │   │               │       ├── SparkplugDescriptor.java
│   │   │       │   │               │       ├── SparkplugMeta.java
│   │   │       │   │               │       ├── StatePayload.java
│   │   │       │   │               │       ├── Template.java
│   │   │       │   │               │       ├── TemplateMap.java
│   │   │       │   │               │       ├── Topic.java
│   │   │       │   │               │       └── Value.java
│   │   │       │   │               ├── model/
│   │   │       │   │               │   ├── MetricDataTypeMap.java
│   │   │       │   │               │   ├── MetricMap.java
│   │   │       │   │               │   └── MqttServerDefinition.java
│   │   │       │   │               ├── mqtt/
│   │   │       │   │               │   ├── ClientCallback.java
│   │   │       │   │               │   ├── MqttClientId.java
│   │   │       │   │               │   ├── MqttOperatorDefs.java
│   │   │       │   │               │   ├── MqttServerName.java
│   │   │       │   │               │   ├── MqttServerUrl.java
│   │   │       │   │               │   ├── RandomStartupDelay.java
│   │   │       │   │               │   └── TahuClient.java
│   │   │       │   │               ├── protobuf/
│   │   │       │   │               │   └── SparkplugBProto.java
│   │   │       │   │               └── util/
│   │   │       │   │                   ├── CompressionAlgorithm.java
│   │   │       │   │                   ├── GZipUtil.java
│   │   │       │   │                   ├── MessageUtil.java
│   │   │       │   │                   ├── PayloadUtil.java
│   │   │       │   │                   ├── SparkplugUtil.java
│   │   │       │   │                   ├── TopicUtil.java
│   │   │       │   │                   └── ValidationUtils.java
│   │   │       │   └── resources/
│   │   │       │       ├── logback.xml
│   │   │       │       └── payload.json
│   │   │       └── test/
│   │   │           └── java/
│   │   │               └── org/
│   │   │                   └── eclipse/
│   │   │                       └── tahu/
│   │   │                           ├── message/
│   │   │                           │   └── test/
│   │   │                           │       └── EnDeCodeTest.java
│   │   │                           ├── mqtt/
│   │   │                           │   └── test/
│   │   │                           │       └── MqttServerUrlTest.java
│   │   │                           ├── test/
│   │   │                           │   ├── SequenceTest.java
│   │   │                           │   └── SparkplugTest.java
│   │   │                           └── util/
│   │   │                               ├── MessageUtilTest.java
│   │   │                               └── PayloadUtilTest.java
│   │   ├── edge/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── org/
│   │   │                   └── eclipse/
│   │   │                       └── tahu/
│   │   │                           └── edge/
│   │   │                               ├── EdgeClient.java
│   │   │                               ├── EdgeNodeMetricMaps.java
│   │   │                               └── api/
│   │   │                                   └── MetricHandler.java
│   │   └── host/
│   │       ├── pom.xml
│   │       └── src/
│   │           └── main/
│   │               └── java/
│   │                   └── org/
│   │                       └── eclipse/
│   │                           └── tahu/
│   │                               └── host/
│   │                                   ├── CommandPublisher.java
│   │                                   ├── HostApplication.java
│   │                                   ├── TahuHostCallback.java
│   │                                   ├── TahuPayloadHandler.java
│   │                                   ├── api/
│   │                                   │   └── HostApplicationEventHandler.java
│   │                                   ├── manager/
│   │                                   │   ├── EdgeNodeManager.java
│   │                                   │   ├── MetricManager.java
│   │                                   │   ├── SparkplugDevice.java
│   │                                   │   └── SparkplugEdgeNode.java
│   │                                   ├── model/
│   │                                   │   ├── HostApplicationMetricMap.java
│   │                                   │   ├── HostMetric.java
│   │                                   │   └── MessageContext.java
│   │                                   └── seq/
│   │                                       ├── SequenceReorderContext.java
│   │                                       ├── SequenceReorderManager.java
│   │                                       └── SequenceReorderMap.java
│   └── pom.xml
├── javascript/
│   ├── core/
│   │   ├── node-red-contrib-sparkplug/
│   │   │   ├── README.md
│   │   │   ├── package.json
│   │   │   └── sparkplug/
│   │   │       ├── sparkplug.html
│   │   │       └── sparkplug.js
│   │   ├── node-red-contrib-sparkplug-payload/
│   │   │   ├── README.md
│   │   │   ├── package.json
│   │   │   ├── sparkplug-payload.html
│   │   │   └── sparkplug-payload.js
│   │   ├── sparkplug-client/
│   │   │   ├── .gitignore
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── index.ts
│   │   │   ├── package.json
│   │   │   └── tsconfig.json
│   │   └── sparkplug-payload/
│   │       ├── .gitignore
│   │       ├── README.md
│   │       ├── index.ts
│   │       ├── lib/
│   │       │   └── sparkplugbpayload.ts
│   │       ├── package.json
│   │       └── tsconfig.json
│   └── examples/
│       └── simple/
│           ├── example.js
│           └── package.json
├── nodered/
│   └── examples/
│       ├── emulated-device.js
│       └── package.json
├── notice.html
├── python/
│   ├── core/
│   │   ├── __init__.py
│   │   ├── array_packer.py
│   │   ├── host_session_establishment.py
│   │   ├── readme.md
│   │   ├── sparkplug_b.py
│   │   └── sparkplug_b_pb2.py
│   └── examples/
│       ├── THIRD-PARTY.txt
│       ├── example.py
│       ├── example_datatype.py
│       ├── example_raspberry_pi.py
│       └── example_simple.py
└── sparkplug_b/
    ├── sparkplug_b.json
    ├── sparkplug_b.proto
    └── sparkplug_b_c_sharp.proto
Download .txt
Showing preview only (338K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3709 symbols across 152 files)

FILE: c/core/include/pb.h
  type uint_least8_t (line 184) | typedef uint_least8_t pb_type_t;
  type pb_size_t (line 257) | typedef uint32_t pb_size_t;
  type pb_ssize_t (line 258) | typedef int32_t pb_ssize_t;
  type uint_least16_t (line 260) | typedef uint_least16_t pb_size_t;
  type int_least16_t (line 261) | typedef int_least16_t pb_ssize_t;
  type uint_least8_t (line 269) | typedef uint_least8_t pb_byte_t;
  type pb_istream_t (line 272) | typedef struct pb_istream_s pb_istream_t;
  type pb_ostream_t (line 273) | typedef struct pb_ostream_s pb_ostream_t;
  type pb_field_iter_t (line 274) | typedef struct pb_field_iter_s pb_field_iter_t;
  type pb_msgdesc_s (line 280) | struct pb_msgdesc_s
  type pb_msgdesc_s (line 281) | struct pb_msgdesc_s {
  function PB_PACKED_STRUCT_END (line 289) | PB_PACKED_STRUCT_END
  type pb_field_iter_t (line 314) | typedef pb_field_iter_t pb_field_t;
  type pb_bytes_array_s (line 334) | struct pb_bytes_array_s {
  type pb_bytes_array_t (line 338) | typedef struct pb_bytes_array_s pb_bytes_array_t;
  type pb_callback_t (line 358) | typedef struct pb_callback_s pb_callback_t;
  type pb_callback_s (line 359) | struct pb_callback_s {
  type pb_wire_type_t (line 375) | typedef enum {
  type pb_extension_type_t (line 388) | typedef struct pb_extension_type_s pb_extension_type_t;
  type pb_extension_t (line 389) | typedef struct pb_extension_s pb_extension_t;
  type pb_extension_type_s (line 390) | struct pb_extension_type_s {
  type pb_extension_s (line 412) | struct pb_extension_s {
  function namespace (line 823) | namespace nanopb {

FILE: c/core/include/pb_decode.h
  type pb_istream_s (line 28) | struct pb_istream_s

FILE: c/core/include/pb_encode.h
  type pb_ostream_s (line 27) | struct pb_ostream_s

FILE: c/core/include/tahu.pb.h
  type org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_DataSetValueExtension (line 17) | typedef struct _org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue_D...
  type org_eclipse_tahu_protobuf_Payload_DataSet_Row (line 21) | typedef struct _org_eclipse_tahu_protobuf_Payload_DataSet_Row {
  type org_eclipse_tahu_protobuf_Payload_Metric_MetricValueExtension (line 27) | typedef struct _org_eclipse_tahu_protobuf_Payload_Metric_MetricValueExte...
  type org_eclipse_tahu_protobuf_Payload_PropertySet (line 31) | typedef struct _org_eclipse_tahu_protobuf_Payload_PropertySet {
  type org_eclipse_tahu_protobuf_Payload_PropertySetList (line 39) | typedef struct _org_eclipse_tahu_protobuf_Payload_PropertySetList {
  type org_eclipse_tahu_protobuf_Payload_PropertyValue_PropertyValueExtension (line 45) | typedef struct _org_eclipse_tahu_protobuf_Payload_PropertyValue_Property...
  type org_eclipse_tahu_protobuf_Payload_Template_Parameter_ParameterValueExtension (line 49) | typedef struct _org_eclipse_tahu_protobuf_Payload_Template_Parameter_Par...
  type org_eclipse_tahu_protobuf_Payload (line 53) | typedef struct _org_eclipse_tahu_protobuf_Payload {
  type org_eclipse_tahu_protobuf_Payload_DataSet (line 65) | typedef struct _org_eclipse_tahu_protobuf_Payload_DataSet {
  type org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue (line 77) | typedef struct _org_eclipse_tahu_protobuf_Payload_DataSet_DataSetValue {
  type org_eclipse_tahu_protobuf_Payload_MetaData (line 90) | typedef struct _org_eclipse_tahu_protobuf_Payload_MetaData {
  type org_eclipse_tahu_protobuf_Payload_PropertyValue (line 105) | typedef struct _org_eclipse_tahu_protobuf_Payload_PropertyValue {
  type org_eclipse_tahu_protobuf_Payload_Template (line 124) | typedef struct _org_eclipse_tahu_protobuf_Payload_Template {
  type org_eclipse_tahu_protobuf_Payload_Template_Parameter (line 136) | typedef struct _org_eclipse_tahu_protobuf_Payload_Template_Parameter {
  type org_eclipse_tahu_protobuf_Payload_Metric (line 152) | typedef struct _org_eclipse_tahu_protobuf_Payload_Metric {

FILE: c/core/src/pb_common.c
  function load_descriptor_values (line 8) | static bool load_descriptor_values(pb_field_iter_t *iter)
  function advance_iterator (line 109) | static void advance_iterator(pb_field_iter_t *iter)
  function pb_field_iter_begin (line 147) | bool pb_field_iter_begin(pb_field_iter_t *iter, const pb_msgdesc_t *desc...
  function pb_field_iter_begin_extension (line 157) | bool pb_field_iter_begin_extension(pb_field_iter_t *iter, pb_extension_t...
  function pb_field_iter_next (line 179) | bool pb_field_iter_next(pb_field_iter_t *iter)
  function pb_field_iter_find (line 186) | bool pb_field_iter_find(pb_field_iter_t *iter, uint32_t tag)
  function pb_field_iter_begin_const (line 238) | bool pb_field_iter_begin_const(pb_field_iter_t *iter, const pb_msgdesc_t...
  function pb_field_iter_begin_extension_const (line 243) | bool pb_field_iter_begin_extension_const(pb_field_iter_t *iter, const pb...
  function pb_default_field_callback (line 248) | bool pb_default_field_callback(pb_istream_t *istream, pb_ostream_t *ostr...
  function pb_validate_utf8 (line 282) | bool pb_validate_utf8(const char *str)

FILE: c/core/src/pb_decode.c
  type pb_fields_seen_t (line 62) | typedef struct {
  function buf_read (line 70) | static bool checkreturn buf_read(pb_istream_t *stream, pb_byte_t *buf, s...
  function pb_read (line 85) | bool checkreturn pb_read(pb_istream_t *stream, pb_byte_t *buf, size_t co...
  function pb_readbyte (line 124) | static bool checkreturn pb_readbyte(pb_istream_t *stream, pb_byte_t *buf)
  function pb_istream_t (line 142) | pb_istream_t pb_istream_from_buffer(const pb_byte_t *buf, size_t bufsize)
  function pb_decode_varint32_eof (line 170) | static bool checkreturn pb_decode_varint32_eof(pb_istream_t *stream, uin...
  function pb_decode_varint32 (line 232) | bool checkreturn pb_decode_varint32(pb_istream_t *stream, uint32_t *dest)
  function pb_decode_varint (line 238) | bool checkreturn pb_decode_varint(pb_istream_t *stream, uint64_t *dest)
  function pb_skip_varint (line 261) | bool checkreturn pb_skip_varint(pb_istream_t *stream)
  function pb_skip_string (line 272) | bool checkreturn pb_skip_string(pb_istream_t *stream)
  function pb_decode_tag (line 286) | bool checkreturn pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wir...
  function pb_skip_field (line 303) | bool checkreturn pb_skip_field(pb_istream_t *stream, pb_wire_type_t wire...
  function read_raw_value (line 318) | static bool checkreturn read_raw_value(pb_istream_t *stream, pb_wire_typ...
  function pb_make_string_substream (line 357) | bool checkreturn pb_make_string_substream(pb_istream_t *stream, pb_istre...
  function pb_close_string_substream (line 372) | bool checkreturn pb_close_string_substream(pb_istream_t *stream, pb_istr...
  function check_wire_type (line 391) | static bool checkreturn check_wire_type(pb_wire_type_t wire_type, pb_fie...
  function decode_basic_field (line 419) | static bool checkreturn decode_basic_field(pb_istream_t *stream, pb_fiel...
  function decode_static_field (line 453) | static bool checkreturn decode_static_field(pb_istream_t *stream, pb_wir...
  function allocate_field (line 546) | static bool checkreturn allocate_field(pb_istream_t *stream, void *pData...
  function initialize_pointer_field (line 592) | static void initialize_pointer_field(void *pItem, pb_field_iter_t *field)
  function decode_pointer_field (line 614) | static bool checkreturn decode_pointer_field(pb_istream_t *stream, pb_wi...
  function decode_callback_field (line 742) | static bool checkreturn decode_callback_field(pb_istream_t *stream, pb_w...
  function decode_field (line 785) | static bool checkreturn decode_field(pb_istream_t *stream, pb_wire_type_...
  function default_extension_decoder (line 816) | static bool checkreturn default_extension_decoder(pb_istream_t *stream,
  function decode_extension (line 833) | static bool checkreturn decode_extension(pb_istream_t *stream,
  function find_extension_field (line 859) | static bool checkreturn find_extension_field(pb_field_iter_t *iter)
  function pb_field_set_to_default (line 873) | static bool pb_field_set_to_default(pb_field_iter_t *field)
  function pb_message_set_to_defaults (line 950) | static bool pb_message_set_to_defaults(pb_field_iter_t *iter)
  function pb_decode_inner (line 989) | static bool checkreturn pb_decode_inner(pb_istream_t *stream, const pb_m...
  function pb_decode_ex (line 1158) | bool checkreturn pb_decode_ex(pb_istream_t *stream, const pb_msgdesc_t *...
  function pb_decode (line 1186) | bool checkreturn pb_decode(pb_istream_t *stream, const pb_msgdesc_t *fie...
  function pb_release_union_field (line 1203) | static bool pb_release_union_field(pb_istream_t *stream, pb_field_iter_t...
  function pb_release_single_field (line 1225) | static void pb_release_single_field(pb_field_iter_t *field)
  function pb_release (line 1316) | void pb_release(const pb_msgdesc_t *fields, void *dest_struct)
  function pb_decode_bool (line 1335) | bool pb_decode_bool(pb_istream_t *stream, bool *dest)
  function pb_decode_svarint (line 1345) | bool pb_decode_svarint(pb_istream_t *stream, pb_int64_t *dest)
  function pb_decode_fixed32 (line 1359) | bool pb_decode_fixed32(pb_istream_t *stream, void *dest)
  function pb_decode_fixed64 (line 1382) | bool pb_decode_fixed64(pb_istream_t *stream, void *dest)
  function pb_dec_bool (line 1409) | static bool checkreturn pb_dec_bool(pb_istream_t *stream, const pb_field...
  function pb_dec_varint (line 1414) | static bool checkreturn pb_dec_varint(pb_istream_t *stream, const pb_fie...
  function pb_dec_fixed (line 1486) | static bool checkreturn pb_dec_fixed(pb_istream_t *stream, const pb_fiel...
  function pb_dec_bytes (line 1511) | static bool checkreturn pb_dec_bytes(pb_istream_t *stream, const pb_fiel...
  function pb_dec_string (line 1551) | static bool checkreturn pb_dec_string(pb_istream_t *stream, const pb_fie...
  function pb_dec_submessage (line 1601) | static bool checkreturn pb_dec_submessage(pb_istream_t *stream, const pb...
  function pb_dec_fixed_length_bytes (line 1650) | static bool checkreturn pb_dec_fixed_length_bytes(pb_istream_t *stream, ...
  function pb_decode_double_as_float (line 1674) | bool pb_decode_double_as_float(pb_istream_t *stream, float *dest)

FILE: c/core/src/pb_encode.c
  function buf_write (line 52) | static bool checkreturn buf_write(pb_ostream_t *stream, const pb_byte_t ...
  function pb_ostream_t (line 64) | pb_ostream_t pb_ostream_from_buffer(pb_byte_t *buf, size_t bufsize)
  function pb_write (line 81) | bool checkreturn pb_write(pb_ostream_t *stream, const pb_byte_t *buf, si...
  function safe_read_bool (line 109) | static bool safe_read_bool(const void *pSize)
  function encode_array (line 122) | static bool checkreturn encode_array(pb_ostream_t *stream, pb_field_iter...
  function pb_check_proto3_default_value (line 238) | static bool checkreturn pb_check_proto3_default_value(const pb_field_ite...
  function encode_basic_field (line 330) | static bool checkreturn encode_basic_field(pb_ostream_t *stream, const p...
  function encode_callback_field (line 375) | static bool checkreturn encode_callback_field(pb_ostream_t *stream, cons...
  function encode_field (line 386) | static bool checkreturn encode_field(pb_ostream_t *stream, pb_field_iter...
  function default_extension_encoder (line 442) | static bool checkreturn default_extension_encoder(pb_ostream_t *stream, ...
  function encode_extension_field (line 455) | static bool checkreturn encode_extension_field(pb_ostream_t *stream, con...
  function pb_encode (line 480) | bool checkreturn pb_encode(pb_ostream_t *stream, const pb_msgdesc_t *fie...
  function pb_encode_ex (line 504) | bool checkreturn pb_encode_ex(pb_ostream_t *stream, const pb_msgdesc_t *...
  function pb_get_encoded_size (line 525) | bool pb_get_encoded_size(size_t *size, const pb_msgdesc_t *fields, const...
  function pb_encode_varint_32 (line 541) | static bool checkreturn pb_encode_varint_32(pb_ostream_t *stream, uint32...
  function pb_encode_varint (line 575) | bool checkreturn pb_encode_varint(pb_ostream_t *stream, pb_uint64_t value)
  function pb_encode_svarint (line 593) | bool checkreturn pb_encode_svarint(pb_ostream_t *stream, pb_int64_t value)
  function pb_encode_fixed32 (line 604) | bool checkreturn pb_encode_fixed32(pb_ostream_t *stream, const void *value)
  function pb_encode_fixed64 (line 616) | bool checkreturn pb_encode_fixed64(pb_ostream_t *stream, const void *value)
  function pb_encode_tag (line 632) | bool checkreturn pb_encode_tag(pb_ostream_t *stream, pb_wire_type_t wire...
  function pb_encode_tag_for_field (line 638) | bool pb_encode_tag_for_field ( pb_ostream_t* stream, const pb_field_iter...
  function pb_encode_string (line 673) | bool checkreturn pb_encode_string(pb_ostream_t *stream, const pb_byte_t ...
  function pb_encode_submessage (line 681) | bool checkreturn pb_encode_submessage(pb_ostream_t *stream, const pb_msg...
  function pb_enc_bool (line 733) | static bool checkreturn pb_enc_bool(pb_ostream_t *stream, const pb_field...
  function pb_enc_varint (line 740) | static bool checkreturn pb_enc_varint(pb_ostream_t *stream, const pb_fie...
  function pb_enc_fixed (line 788) | static bool checkreturn pb_enc_fixed(pb_ostream_t *stream, const pb_fiel...
  function pb_enc_bytes (line 813) | static bool checkreturn pb_enc_bytes(pb_ostream_t *stream, const pb_fiel...
  function pb_enc_string (line 834) | static bool checkreturn pb_enc_string(pb_ostream_t *stream, const pb_fie...
  function pb_enc_submessage (line 887) | static bool checkreturn pb_enc_submessage(pb_ostream_t *stream, const pb...
  function pb_enc_fixed_length_bytes (line 906) | static bool checkreturn pb_enc_fixed_length_bytes(pb_ostream_t *stream, ...
  function pb_encode_float_as_double (line 912) | bool pb_encode_float_as_double(pb_ostream_t *stream, float value)

FILE: c/core/src/tahu.c
  function add_metadata_to_metric (line 24) | int add_metadata_to_metric(org_eclipse_tahu_protobuf_Payload_Metric *met...
  function add_metric_to_payload (line 32) | int add_metric_to_payload(org_eclipse_tahu_protobuf_Payload *payload,
  function set_propertyvalue (line 50) | int set_propertyvalue(org_eclipse_tahu_protobuf_Payload_PropertyValue *p...
  function add_property_to_set (line 113) | int add_property_to_set(org_eclipse_tahu_protobuf_Payload_PropertySet *p...
  function add_propertyset_to_metric (line 155) | int add_propertyset_to_metric(org_eclipse_tahu_protobuf_Payload_Metric *...
  function set_metric_value (line 163) | int set_metric_value(org_eclipse_tahu_protobuf_Payload_Metric *metric, u...
  function add_simple_metric (line 235) | int add_simple_metric(org_eclipse_tahu_protobuf_Payload *payload,
  function encode_payload (line 278) | ssize_t encode_payload(uint8_t *out_buffer,
  function decode_payload (line 302) | ssize_t decode_payload(org_eclipse_tahu_protobuf_Payload *payload,
  function free_payload (line 323) | int free_payload(org_eclipse_tahu_protobuf_Payload *payload) {
  function get_current_timestamp (line 329) | uint64_t get_current_timestamp() {
  function reset_sparkplug_sequence (line 346) | void reset_sparkplug_sequence(void) {
  function get_next_payload (line 350) | int get_next_payload(org_eclipse_tahu_protobuf_Payload *payload) {
  function init_dataset (line 366) | int init_dataset(org_eclipse_tahu_protobuf_Payload_DataSet *dataset,
  function init_metric (line 409) | int init_metric(org_eclipse_tahu_protobuf_Payload_Metric *metric,
  function print_metadata (line 472) | void print_metadata(const char *prefix, org_eclipse_tahu_protobuf_Payloa...
  function print_propertyvalue (line 505) | void print_propertyvalue(const char *prefix, org_eclipse_tahu_protobuf_P...
  function print_propertyset (line 551) | void print_propertyset(const char *prefix, org_eclipse_tahu_protobuf_Pay...
  function print_propertysetlist (line 570) | void print_propertysetlist(const char *prefix, org_eclipse_tahu_protobuf...
  function print_dataset_row (line 587) | void print_dataset_row(const char *prefix, org_eclipse_tahu_protobuf_Pay...
  function print_datasetvalue (line 602) | void print_datasetvalue(const char *prefix, org_eclipse_tahu_protobuf_Pa...
  function print_dataset (line 630) | void print_dataset(const char *prefix, org_eclipse_tahu_protobuf_Payload...
  function print_template_parameter (line 656) | void print_template_parameter(const char *prefix, org_eclipse_tahu_proto...
  function print_template (line 695) | void print_template(const char *prefix, org_eclipse_tahu_protobuf_Payloa...
  function print_metric (line 724) | void print_metric(const char *prefix, org_eclipse_tahu_protobuf_Payload_...
  function print_payload (line 797) | void print_payload(org_eclipse_tahu_protobuf_Payload *payload) {

FILE: c/core/test/test.c
  type mosquitto (line 27) | struct mosquitto
  type mosquitto (line 28) | struct mosquitto
  type mosquitto (line 29) | struct mosquitto
  type mosquitto (line 30) | struct mosquitto
  type mosquitto (line 31) | struct mosquitto
  type mosquitto (line 34) | struct mosquitto
  type mosquitto_message (line 34) | struct mosquitto_message
  type mosquitto (line 35) | struct mosquitto
  type mosquitto (line 36) | struct mosquitto
  type mosquitto (line 37) | struct mosquitto
  function main (line 67) | int main(int argc, char *argv[]) {
  function my_message_callback (line 138) | void my_message_callback(struct mosquitto *mosq, void *userdata, const s...
  function my_connect_callback (line 300) | void my_connect_callback(struct mosquitto *mosq, void *userdata, int res...
  function my_subscribe_callback (line 314) | void my_subscribe_callback(struct mosquitto *mosq, void *userdata, int m...
  function my_log_callback (line 327) | void my_log_callback(struct mosquitto *mosq, void *userdata, int level, ...
  function publisher (line 335) | void publisher(struct mosquitto *mosq, char *topic, void *buf, unsigned ...
  function publish_births (line 344) | void publish_births(struct mosquitto *mosq) {
  function publish_node_birth (line 361) | void publish_node_birth(struct mosquitto *mosq) {
  function publish_device_birth (line 522) | void publish_device_birth(struct mosquitto *mosq) {
  function publish_ddata_message (line 613) | void publish_ddata_message(struct mosquitto *mosq) {

FILE: c/examples/template_as_custom_props/example.c
  type mosquitto (line 25) | struct mosquitto
  type mosquitto_message (line 25) | struct mosquitto_message
  type mosquitto (line 26) | struct mosquitto
  type mosquitto (line 27) | struct mosquitto
  type mosquitto (line 28) | struct mosquitto
  type mosquitto (line 31) | struct mosquitto
  type mosquitto (line 32) | struct mosquitto
  type mosquitto (line 33) | struct mosquitto
  type mosquitto (line 34) | struct mosquitto
  type mosquitto (line 35) | struct mosquitto
  function main (line 37) | int main(int argc, char *argv[]) {
  function publisher (line 96) | void publisher(struct mosquitto *mosq, char *topic, void *buf, unsigned ...
  function my_message_callback (line 104) | void my_message_callback(struct mosquitto *mosq, void *userdata, const s...
  function my_connect_callback (line 172) | void my_connect_callback(struct mosquitto *mosq, void *userdata, int res...
  function my_subscribe_callback (line 185) | void my_subscribe_callback(struct mosquitto *mosq, void *userdata, int m...
  function my_log_callback (line 198) | void my_log_callback(struct mosquitto *mosq, void *userdata, int level, ...
  function publish_births (line 207) | void publish_births(struct mosquitto *mosq) {
  function publish_node_birth (line 223) | void publish_node_birth(struct mosquitto *mosq) {
  function publish_device_birth (line 310) | void publish_device_birth(struct mosquitto *mosq) {
  function publish_ddata_message (line 393) | void publish_ddata_message(struct mosquitto *mosq) {

FILE: c/examples/udt_example/example.c
  type mosquitto (line 25) | struct mosquitto
  type mosquitto_message (line 25) | struct mosquitto_message
  type mosquitto (line 26) | struct mosquitto
  type mosquitto (line 27) | struct mosquitto
  type mosquitto (line 28) | struct mosquitto
  type mosquitto (line 31) | struct mosquitto
  type mosquitto (line 32) | struct mosquitto
  type mosquitto (line 33) | struct mosquitto
  type mosquitto (line 34) | struct mosquitto
  type mosquitto (line 35) | struct mosquitto
  type alias_map (line 37) | enum alias_map {
  function main (line 52) | int main(int argc, char *argv[]) {
  function publisher (line 111) | void publisher(struct mosquitto *mosq, char *topic, void *buf, unsigned ...
  function my_message_callback (line 119) | void my_message_callback(struct mosquitto *mosq, void *userdata, const s...
  function my_connect_callback (line 309) | void my_connect_callback(struct mosquitto *mosq, void *userdata, int res...
  function my_subscribe_callback (line 322) | void my_subscribe_callback(struct mosquitto *mosq, void *userdata, int m...
  function my_log_callback (line 335) | void my_log_callback(struct mosquitto *mosq, void *userdata, int level, ...
  function publish_births (line 344) | void publish_births(struct mosquitto *mosq) {
  function publish_node_birth (line 360) | void publish_node_birth(struct mosquitto *mosq) {
  function publish_device_birth (line 493) | void publish_device_birth(struct mosquitto *mosq) {
  function publish_ddata_message (line 573) | void publish_ddata_message(struct mosquitto *mosq) {

FILE: c_sharp/core/src/SparkplugBCSharp.cs
  class SparkplugBCSharpReflection (line 13) | public static partial class SparkplugBCSharpReflection {
    method SparkplugBCSharpReflection (line 22) | static SparkplugBCSharpReflection() {
  class Payload (line 145) | public sealed partial class Payload : pb::IMessage<Payload> {
    method Payload (line 160) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    method OnConstruction (line 165) | partial void OnConstruction();
    method Payload (line 167) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    method Clone (line 177) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    method Equals (line 261) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    method Equals (line 266) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    method GetHashCode (line 283) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    method ToString (line 295) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    method WriteTo (line 300) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    method CalculateSize (line 322) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    method MergeFrom (line 342) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    method MergeFrom (line 363) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    class Types (line 401) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
      class Template (line 403) | public sealed partial class Template : pb::IMessage<Template> {
        method Template (line 418) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method OnConstruction (line 423) | partial void OnConstruction();
        method Template (line 425) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method Clone (line 435) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method Equals (line 512) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method Equals (line 517) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method GetHashCode (line 534) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method ToString (line 546) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method WriteTo (line 551) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method CalculateSize (line 570) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method MergeFrom (line 588) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method MergeFrom (line 607) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        class Types (line 645) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
          class Parameter (line 647) | public sealed partial class Parameter : pb::IMessage<Parameter> {
            method Parameter (line 662) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method OnConstruction (line 667) | partial void OnConstruction();
            method Parameter (line 669) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method Clone (line 699) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            type ValueOneofCase (line 805) | public enum ValueOneofCase {
            method ClearValue (line 821) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method Equals (line 827) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method Equals (line 832) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method GetHashCode (line 853) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method ToString (line 869) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method WriteTo (line 874) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method CalculateSize (line 914) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method MergeFrom (line 947) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method MergeFrom (line 984) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            class Types (line 1039) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
              class ParameterValueExtension (line 1041) | public sealed partial class ParameterValueExtension : pb::IM...
                method ParameterValueExtension (line 1056) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
                method OnConstruction (line 1061) | partial void OnConstruction();
                method ParameterValueExtension (line 1063) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
                method Clone (line 1068) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
                method Equals (line 1083) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
                method Equals (line 1088) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
                method GetHashCode (line 1100) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
                method ToString (line 1107) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
                method WriteTo (line 1112) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
                method CalculateSize (line 1117) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
                method MergeFrom (line 1124) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
                method MergeFrom (line 1132) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
      class DataSet (line 1160) | public sealed partial class DataSet : pb::IMessage<DataSet> {
        method DataSet (line 1175) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method OnConstruction (line 1180) | partial void OnConstruction();
        method DataSet (line 1182) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method Clone (line 1191) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method Equals (line 1247) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method Equals (line 1252) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method GetHashCode (line 1268) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method ToString (line 1279) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method WriteTo (line 1284) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method CalculateSize (line 1296) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method MergeFrom (line 1309) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method MergeFrom (line 1323) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        class Types (line 1358) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
          class DataSetValue (line 1360) | public sealed partial class DataSetValue : pb::IMessage<DataSetV...
            method DataSetValue (line 1375) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method OnConstruction (line 1380) | partial void OnConstruction();
            method DataSetValue (line 1382) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method Clone (line 1410) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            type ValueOneofCase (line 1494) | public enum ValueOneofCase {
            method ClearValue (line 1510) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method Equals (line 1516) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method Equals (line 1521) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method GetHashCode (line 1540) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method ToString (line 1554) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method WriteTo (line 1559) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method CalculateSize (line 1591) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method MergeFrom (line 1618) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method MergeFrom (line 1649) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            class Types (line 1696) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
              class DataSetValueExtension (line 1698) | public sealed partial class DataSetValueExtension : pb::IMes...
                method DataSetValueExtension (line 1713) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
                method OnConstruction (line 1718) | partial void OnConstruction();
                method DataSetValueExtension (line 1720) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
                method Clone (line 1725) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
                method Equals (line 1740) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
                method Equals (line 1745) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
                method GetHashCode (line 1757) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
                method ToString (line 1764) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
                method WriteTo (line 1769) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
                method CalculateSize (line 1774) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
                method MergeFrom (line 1781) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
                method MergeFrom (line 1789) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
          class Row (line 1812) | public sealed partial class Row : pb::IMessage<Row> {
            method Row (line 1827) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method OnConstruction (line 1832) | partial void OnConstruction();
            method Row (line 1834) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method Clone (line 1840) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method Equals (line 1865) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method Equals (line 1870) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method GetHashCode (line 1883) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method ToString (line 1891) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method WriteTo (line 1896) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method CalculateSize (line 1902) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method MergeFrom (line 1910) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method MergeFrom (line 1919) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
      class PropertyValue (line 1946) | public sealed partial class PropertyValue : pb::IMessage<PropertyVal...
        method PropertyValue (line 1961) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method OnConstruction (line 1966) | partial void OnConstruction();
        method PropertyValue (line 1968) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method Clone (line 2004) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        type ValueOneofCase (line 2135) | public enum ValueOneofCase {
        method ClearValue (line 2153) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method Equals (line 2159) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method Equals (line 2164) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method GetHashCode (line 2187) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method ToString (line 2205) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method WriteTo (line 2210) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method CalculateSize (line 2258) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method MergeFrom (line 2297) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method MergeFrom (line 2340) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        class Types (line 2413) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
          class PropertyValueExtension (line 2415) | public sealed partial class PropertyValueExtension : pb::IMessag...
            method PropertyValueExtension (line 2430) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method OnConstruction (line 2435) | partial void OnConstruction();
            method PropertyValueExtension (line 2437) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method Clone (line 2442) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method Equals (line 2457) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method Equals (line 2462) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method GetHashCode (line 2474) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method ToString (line 2481) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method WriteTo (line 2486) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method CalculateSize (line 2491) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method MergeFrom (line 2498) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method MergeFrom (line 2506) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
      class PropertySet (line 2529) | public sealed partial class PropertySet : pb::IMessage<PropertySet> {
        method PropertySet (line 2544) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method OnConstruction (line 2549) | partial void OnConstruction();
        method PropertySet (line 2551) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method Clone (line 2558) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method Equals (line 2596) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method Equals (line 2601) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method GetHashCode (line 2615) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method ToString (line 2624) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method WriteTo (line 2629) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method CalculateSize (line 2636) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method MergeFrom (line 2645) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method MergeFrom (line 2655) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
      class PropertySetList (line 2681) | public sealed partial class PropertySetList : pb::IMessage<PropertyS...
        method PropertySetList (line 2696) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method OnConstruction (line 2701) | partial void OnConstruction();
        method PropertySetList (line 2703) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method Clone (line 2709) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method Equals (line 2734) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method Equals (line 2739) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method GetHashCode (line 2752) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method ToString (line 2760) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method WriteTo (line 2765) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method CalculateSize (line 2771) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method MergeFrom (line 2779) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method MergeFrom (line 2788) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
      class MetaData (line 2810) | public sealed partial class MetaData : pb::IMessage<MetaData> {
        method MetaData (line 2825) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method OnConstruction (line 2830) | partial void OnConstruction();
        method MetaData (line 2832) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method Clone (line 2845) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method Equals (line 2972) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method Equals (line 2977) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method GetHashCode (line 2997) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method ToString (line 3012) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method WriteTo (line 3017) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method CalculateSize (line 3054) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method MergeFrom (line 3085) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method MergeFrom (line 3117) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
      class Metric (line 3167) | public sealed partial class Metric : pb::IMessage<Metric> {
        method Metric (line 3182) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method OnConstruction (line 3187) | partial void OnConstruction();
        method Metric (line 3189) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method Clone (line 3235) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        type ValueOneofCase (line 3478) | public enum ValueOneofCase {
        method ClearValue (line 3497) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method Equals (line 3503) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method Equals (line 3508) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method GetHashCode (line 3539) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method ToString (line 3565) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method WriteTo (line 3570) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method CalculateSize (line 3650) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method MergeFrom (line 3713) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        method MergeFrom (line 3786) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
        class Types (line 3897) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
          class MetricValueExtension (line 3899) | public sealed partial class MetricValueExtension : pb::IMessage<...
            method MetricValueExtension (line 3914) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method OnConstruction (line 3919) | partial void OnConstruction();
            method MetricValueExtension (line 3921) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method Clone (line 3926) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method Equals (line 3941) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method Equals (line 3946) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method GetHashCode (line 3958) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method ToString (line 3965) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method WriteTo (line 3970) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method CalculateSize (line 3975) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method MergeFrom (line 3982) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
            method MergeFrom (line 3990) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]

FILE: java/compat_impl/edge/src/main/java/org/eclipse/tahu/edge/CommandCallback.java
  type CommandCallback (line 16) | public interface CommandCallback {
    method setDeviceOffline (line 18) | public void setDeviceOffline(String deviceId);
    method setDeviceOnline (line 20) | public void setDeviceOnline(String deviceId);

FILE: java/compat_impl/edge/src/main/java/org/eclipse/tahu/edge/CommandListener.java
  class CommandListener (line 32) | public class CommandListener implements Runnable {
    method CommandListener (line 48) | public CommandListener(CommandCallback commandCallback, String fileDir...
    method start (line 54) | public void start() throws TahuException {
    method shutdown (line 66) | public void shutdown() {
    method run (line 71) | @Override

FILE: java/compat_impl/edge/src/main/java/org/eclipse/tahu/edge/PeriodicPublisher.java
  class PeriodicPublisher (line 25) | public class PeriodicPublisher implements Runnable {
    method PeriodicPublisher (line 37) | public PeriodicPublisher(long period, DataSimulator dataSimulator, Edg...
    method run (line 47) | @Override
    method shutdown (line 67) | public void shutdown() {

FILE: java/compat_impl/edge/src/main/java/org/eclipse/tahu/edge/SparkplugEdgeNode.java
  class SparkplugEdgeNode (line 58) | public class SparkplugEdgeNode implements Runnable, MetricHandler, Clien...
    method main (line 120) | public static void main(String[] arg) {
    method SparkplugEdgeNode (line 164) | public SparkplugEdgeNode() {
    method run (line 177) | @Override
    method getDeathTopic (line 191) | @Override
    method getDeathPayloadBytes (line 197) | @Override
    method publishBirthSequence (line 205) | @Override
    method hasMetric (line 229) | @Override
    method shutdown (line 235) | @Override
    method messageArrived (line 260) | @Override
    method connectionLost (line 424) | @Override
    method connectComplete (line 431) | @Override
    method setDeviceOffline (line 438) | @Override
    method setDeviceOnline (line 444) | @Override
    method addDeathSeqNum (line 454) | private SparkplugBPayload addDeathSeqNum(SparkplugBPayload payload) {
    method addBirthSeqNum (line 483) | private SparkplugBPayloadMap addBirthSeqNum(SparkplugBPayloadMap nBirt...

FILE: java/compat_impl/edge/src/main/java/org/eclipse/tahu/edge/sim/DataSimulator.java
  type DataSimulator (line 23) | public interface DataSimulator {
    method getNodeBirthPayload (line 32) | public SparkplugBPayloadMap getNodeBirthPayload(EdgeNodeDescriptor edg...
    method getNodeDataPayload (line 41) | public SparkplugBPayload getNodeDataPayload(EdgeNodeDescriptor edgeNod...
    method getDeviceBirthPayload (line 50) | public SparkplugBPayload getDeviceBirthPayload(DeviceDescriptor device...
    method getDeviceDataPayload (line 59) | public SparkplugBPayload getDeviceDataPayload(DeviceDescriptor deviceD...
    method hasMetric (line 67) | public boolean hasMetric(SparkplugDescriptor sparkplugDescriptor, Stri...
    method handleMetricWrite (line 69) | public Metric handleMetricWrite(SparkplugDescriptor sparkplugDescripto...

FILE: java/compat_impl/edge/src/main/java/org/eclipse/tahu/edge/sim/RandomDataSimulator.java
  class RandomDataSimulator (line 56) | public class RandomDataSimulator implements DataSimulator {
    method RandomDataSimulator (line 67) | public RandomDataSimulator(int numNodeMetrics, Map<SparkplugDescriptor...
    method getNodeBirthPayload (line 73) | @Override
    method getNodeDataPayload (line 105) | @Override
    method getDeviceBirthPayload (line 132) | @Override
    method getDeviceDataPayload (line 159) | @Override
    method hasMetric (line 186) | @Override
    method handleMetricWrite (line 197) | @Override
    method getRandomMetric (line 203) | private Metric getRandomMetric(String namePrefix, int index, boolean i...
    method newDataSet (line 373) | private DataSet newDataSet() throws SparkplugException {
    method newSimpleTemplate (line 414) | private Template newSimpleTemplate(boolean isDef, String templatRef) t...
    method newParams (line 436) | private List<Parameter> newParams() throws SparkplugException {
    method newComplexTemplateDefs (line 447) | private List<Metric> newComplexTemplateDefs() throws Exception {
    method newComplexTemplateInstance (line 469) | private Template newComplexTemplateInstance() throws Exception {
    method getRandomInt8 (line 480) | private byte getRandomInt8() {
    method getRandomInt16 (line 486) | private short getRandomInt16() {
    method getRandomInt32 (line 490) | private int getRandomInt32() {
    method getRandomInt64 (line 494) | private long getRandomInt64() {
    method getRandomUInt8 (line 498) | private short getRandomUInt8() {
    method getRandomUInt16 (line 502) | private int getRandomUInt16() {
    method getRandomUInt32 (line 507) | private long getRandomUInt32() {
    method getRandomUInt64 (line 511) | private BigInteger getRandomUInt64() {
    method getRandomString (line 521) | private String getRandomString(int length) {

FILE: java/compat_impl/host/src/main/java/org/eclipse/tahu/host/CommandListener.java
  class CommandListener (line 34) | public class CommandListener implements Runnable {
    method CommandListener (line 46) | public CommandListener(CommandPublisher commandPublisher, String fileD...
    method start (line 52) | public void start() throws TahuException {
    method shutdown (line 64) | public void shutdown() {
    method run (line 69) | @Override

FILE: java/compat_impl/host/src/main/java/org/eclipse/tahu/host/SparkplugHostApplication.java
  class SparkplugHostApplication (line 36) | public class SparkplugHostApplication implements HostApplicationEventHan...
    method main (line 61) | public static void main(String[] arg) {
    method SparkplugHostApplication (line 100) | public SparkplugHostApplication() {
    method start (line 110) | public void start() throws TahuException {
    method shutdown (line 116) | public void shutdown() {
    method onConnect (line 122) | @Override
    method onDisconnect (line 127) | @Override
    method onNodeBirthArrived (line 132) | @Override
    method onNodeBirthComplete (line 137) | @Override
    method onNodeDataArrived (line 142) | @Override
    method onNodeDataComplete (line 147) | @Override
    method onNodeDeath (line 152) | @Override
    method onNodeDeathComplete (line 157) | @Override
    method onDeviceBirthArrived (line 162) | @Override
    method onDeviceBirthComplete (line 167) | @Override
    method onDeviceDataArrived (line 172) | @Override
    method onDeviceDataComplete (line 177) | @Override
    method onDeviceDeath (line 182) | @Override
    method onDeviceDeathComplete (line 187) | @Override
    method onBirthMetric (line 192) | @Override
    method onDataMetric (line 197) | @Override
    method onStale (line 202) | public void onStale(SparkplugDescriptor sparkplugDescriptor, Metric me...
    method onMessage (line 206) | @Override

FILE: java/examples/device_timestamp/src/main/java/org/eclipse/tahu/SparkplugExample.java
  class SparkplugExample (line 47) | public class SparkplugExample implements MqttCallbackExtended {
    method main (line 72) | public static void main(String[] args) {
    method run (line 77) | public void run() {
    method publishBirth (line 166) | private void publishBirth() {
    method addBdSeqNum (line 209) | private SparkplugBPayloadBuilder addBdSeqNum(SparkplugBPayloadBuilder ...
    method getSeqNum (line 222) | private long getSeqNum() throws Exception {
    method connectComplete (line 230) | @Override
    method connectionLost (line 236) | public void connectionLost(Throwable cause) {
    method messageArrived (line 241) | public void messageArrived(String topic, MqttMessage message) throws E...
    method deliveryComplete (line 265) | public void deliveryComplete(IMqttDeliveryToken token) {
    class Publisher (line 269) | private class Publisher implements Runnable {
      method Publisher (line 274) | public Publisher(String topic, SparkplugBPayload outboundPayload) {
      method run (line 279) | public void run() {

FILE: java/examples/edge_node_control/src/main/java/org/eclipse/tahu/SparkplugExample.java
  class SparkplugExample (line 45) | public class SparkplugExample implements MqttCallbackExtended {
    method SparkplugExample (line 62) | public SparkplugExample(String groupId, String edgeNodeId) {
    method main (line 67) | public static void main(String[] args) {
    method run (line 72) | public void run() {
    method handleCommand (line 105) | private void handleCommand(String command)
    method connectComplete (line 135) | @Override
    method connectionLost (line 140) | public void connectionLost(Throwable cause) {
    method messageArrived (line 144) | public void messageArrived(String topic, MqttMessage message) throws E...
    method deliveryComplete (line 163) | public void deliveryComplete(IMqttDeliveryToken token) {

FILE: java/examples/host_file/src/main/java/org/eclipse/tahu/example/host/file/FileAssembler.java
  class FileAssembler (line 43) | public class FileAssembler {
    method FileAssembler (line 78) | public FileAssembler(ExecutorService executor, MqttClient client, Stri...
    method FileAssembler (line 92) | public FileAssembler(ExecutorService executor, MqttClient client, Stri...
    method processMetric (line 100) | public FilePublishStatus processMetric(Metric metric) {
    method getName (line 135) | String getName() {
    method processFileMetric (line 142) | private FilePublishStatus processFileMetric(Metric metric) {
    method processFileMetricMultipart (line 166) | private FilePublishStatus processFileMetricMultipart(Metric metric) {
    method publishAckCommand (line 241) | private boolean publishAckCommand(Metric metric, FilePublishStatus fil...
    method writeToDstFile (line 288) | private boolean writeToDstFile(byte[] fileData, boolean isPartial, boo...
    method formDstFolderPath (line 310) | private String formDstFolderPath() {
    method formDstFilename (line 320) | private String formDstFilename(String metaDataFilename) {
    method getFileNumber (line 356) | private int getFileNumber(String fname) {
    method formAbsoluteDstFilePath (line 369) | private String formAbsoluteDstFilePath(boolean isPartial) {
    method formAbsoluteDstFilePath (line 376) | private String formAbsoluteDstFilePath(String folderPath, boolean isPa...
    method isValidMd5Sum (line 386) | private boolean isValidMd5Sum(byte[] fileData, String expectedMd5Sum) {
    method isValidMd5Sum (line 398) | private boolean isValidMd5Sum(File file, String expectedMd5Sum) {
    method isValidMetric (line 417) | private boolean isValidMetric(Metric metric) {

FILE: java/examples/host_file/src/main/java/org/eclipse/tahu/example/host/file/Publisher.java
  class Publisher (line 24) | public class Publisher implements Runnable {
    method Publisher (line 33) | public Publisher(MqttClient client, String topic, byte[] bytePayload, ...
    method Publisher (line 42) | public Publisher(MqttClient client, String topic, SparkplugBPayload sp...
    method run (line 51) | public void run() {

FILE: java/examples/host_file/src/main/java/org/eclipse/tahu/example/host/file/SparkplugExample.java
  class SparkplugExample (line 51) | public class SparkplugExample implements MqttCallbackExtended {
    method main (line 72) | public static void main(String[] args) {
    method SparkplugExample (line 77) | public SparkplugExample() {
    method run (line 83) | public void run() {
    method publishHostBirth (line 123) | private void publishHostBirth() {
    method connectComplete (line 135) | @Override
    method connectionLost (line 141) | public void connectionLost(Throwable cause) {
    method messageArrived (line 146) | public void messageArrived(String stringTopic, MqttMessage message) th...
    method deliveryComplete (line 211) | public void deliveryComplete(IMqttDeliveryToken token) {
    method handleSeqNumberCheck (line 215) | private boolean handleSeqNumberCheck(EdgeNode edgeNode, long incomingS...
    method requestRebirth (line 233) | private void requestRebirth(EdgeNodeDescriptor edgeNodeDescriptor) {
    class RebirthDelayTask (line 266) | private class RebirthDelayTask extends TimerTask {
      method RebirthDelayTask (line 269) | public RebirthDelayTask(EdgeNodeDescriptor edgeNodeDescriptor) {
      method run (line 273) | public void run() {
    method handleFileMetric (line 281) | private void handleFileMetric(EdgeNode edgeNode, String deviceName, Me...
    method handleFileMetric (line 300) | private void handleFileMetric(FileAssembler fileAssembler, Metric metr...

FILE: java/examples/host_file/src/main/java/org/eclipse/tahu/example/host/file/model/EdgeNode.java
  class EdgeNode (line 18) | public class EdgeNode {
    method EdgeNode (line 27) | public EdgeNode(String groupName, String edgeNodeName) {
    method getGroupName (line 35) | public String getGroupName() {
    method getEdgeNodeName (line 39) | public String getEdgeNodeName() {
    method getEdgeNodeId (line 43) | public EdgeNodeDescriptor getEdgeNodeId() {
    method isOnline (line 47) | public boolean isOnline() {
    method setOnline (line 51) | public void setOnline(boolean online) {
    method getLastSeqNumber (line 55) | public long getLastSeqNumber() {
    method setLastSeqNumber (line 59) | public void setLastSeqNumber(long lastSeqNumber) {
    method hashCode (line 63) | @Override
    method equals (line 71) | @Override

FILE: java/examples/host_file/src/main/java/org/eclipse/tahu/example/host/file/model/FilePublishStatus.java
  type FilePublishStatus (line 19) | public enum FilePublishStatus {
    method FilePublishStatus (line 57) | private FilePublishStatus(int code, String description) {
    method getCode (line 67) | public int getCode() {
    method getDescription (line 76) | public String getDescription() {
    method getInstance (line 86) | public static FilePublishStatus getInstance(int statusCode) {

FILE: java/examples/host_file/src/main/java/org/eclipse/tahu/example/host/file/util/FileValidationUtils.java
  class FileValidationUtils (line 29) | public class FileValidationUtils {
    method FileValidationUtils (line 36) | private FileValidationUtils() {
    method calculateMd5Sum (line 46) | public static String calculateMd5Sum(byte[] bytes) {
    method calculateMd5Sum (line 63) | public static String calculateMd5Sum(String filename) {
    method calculateMd5Sum (line 73) | public static String calculateMd5Sum(File file) {

FILE: java/examples/listener/src/main/java/org/eclipse/tahu/SparkplugListener.java
  class SparkplugListener (line 29) | public class SparkplugListener implements MqttCallbackExtended {
    method main (line 38) | public static void main(String[] args) {
    method run (line 43) | public void run() {
    method connectComplete (line 65) | @Override
    method connectionLost (line 70) | @Override
    method messageArrived (line 75) | @Override
    method deliveryComplete (line 95) | @Override

FILE: java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/SparkplugRaspberryPiExample.java
  class SparkplugRaspberryPiExample (line 60) | public class SparkplugRaspberryPiExample implements MqttCallbackExtended {
    method main (line 96) | public static void main(String[] args) {
    method formServerUrl (line 118) | private static String formServerUrl(String mqttServerhostname, int por...
    method run (line 134) | public void run() {
    method establishMqttSession (line 180) | public boolean establishMqttSession() {
    method publishBirth (line 250) | public void publishBirth() {
    method incrementBdSeqNum (line 389) | private void incrementBdSeqNum() {
    method getNextSeqNum (line 398) | private long getNextSeqNum() {
    method connectComplete (line 408) | @Override
    method connectionLost (line 414) | public void connectionLost(Throwable cause) {
    method messageArrived (line 423) | public void messageArrived(String topic, MqttMessage message) throws E...
    method deliveryComplete (line 542) | public void deliveryComplete(IMqttDeliveryToken token) {
    class Publisher (line 546) | private class Publisher implements Runnable {
      method Publisher (line 551) | public Publisher(String topic, SparkplugBPayload payload) {
      method run (line 556) | public void run() {
    method createPibrellaListeners (line 570) | private void createPibrellaListeners() throws DioException {
    method shutdownPibrella (line 724) | private static void shutdownPibrella() {
    method parseCommandLineArguments (line 751) | private static void parseCommandLineArguments(String[] args) {

FILE: java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pi/dio/DigitalOutputPin.java
  class DigitalOutputPin (line 19) | public class DigitalOutputPin extends DioPin {
    method DigitalOutputPin (line 21) | public DigitalOutputPin(String name) {
    method setHigh (line 30) | public void setHigh() throws DioException {
    method setLow (line 43) | public void setLow() throws DioException {
    method setState (line 57) | public void setState(boolean state) throws DioException {

FILE: java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pi/dio/DioException.java
  class DioException (line 19) | public class DioException extends Exception {
    method DioException (line 23) | public DioException(String msg) {
    method DioException (line 27) | public DioException(String message, Throwable cause) {

FILE: java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pi/dio/DioLibrary.java
  class DioLibrary (line 35) | public class DioLibrary {
    method DioLibrary (line 45) | private DioLibrary() {
    method DioLibrary (line 49) | private DioLibrary(String pathToLibdio) {
    method getInstance (line 58) | public static DioLibrary getInstance() {
    method getInstance (line 71) | public static DioLibrary getInstance(String pathToLibdio) {
    method getJavaLibraryPath (line 83) | public String getJavaLibraryPath() {
    method setJavaLibraryPath (line 93) | public void setJavaLibraryPath(String pathToLibdio) throws DioException {
    method setJavaLibraryPath (line 103) | public void setJavaLibraryPath() throws DioException {
    method setDioLibrary (line 126) | public void setDioLibrary() throws DioException {
    method copyDioLibrary (line 140) | private void copyDioLibrary(Path path) throws DioException {
    method getMD5sumOfResourceLibdio (line 148) | private String getMD5sumOfResourceLibdio() throws DioException {
    method getMD5sumOfTargetLibdio (line 158) | private String getMD5sumOfTargetLibdio(File file) throws DioException {
    method getMD5 (line 168) | private String getMD5(InputStream is) throws DioException {
    method addToJavaLibraryPath (line 187) | private void addToJavaLibraryPath(String path) {
    method formAbsolutePathToTargetLibdioFile (line 193) | private String formAbsolutePathToTargetLibdioFile() {

FILE: java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pi/dio/DioPin.java
  class DioPin (line 23) | public class DioPin {
    method DioPin (line 28) | public DioPin(String name) {
    method getPinName (line 37) | public String getPinName() {
    method getGpioPin (line 46) | public GPIOPin getGpioPin() {
    method setGpioPin (line 55) | public void setGpioPin(GPIOPin gpioPin) {
    method open (line 59) | public static GPIOPin open(String pinName, GPIOPinConfig gpioPinConfig...
    method close (line 74) | public void close() throws DioException {
    method isHigh (line 90) | public boolean isHigh() throws DioException {

FILE: java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pi/dio/PinDirection.java
  type PinDirection (line 19) | public enum PinDirection {

FILE: java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pi/dio/Pins.java
  type Pins (line 19) | public enum Pins {
    method Pins (line 52) | private Pins(int gpio, String name) {
    method getGPIO (line 57) | public int getGPIO() {
    method getName (line 61) | public String getName() {

FILE: java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pi/system/BoardModels.java
  type BoardModels (line 19) | public enum BoardModels {
    method BoardModels (line 46) | private BoardModels(String code, String model, float revision, int ram...
    method getCode (line 54) | public String getCode() {
    method getModel (line 58) | public String getModel() {
    method getRevision (line 62) | public float getRevision() {
    method getRamSize (line 66) | public int getRamSize() {
    method getManufacturer (line 70) | public String getManufacturer() {
    class Constants (line 74) | private static class Constants {

FILE: java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pi/system/SystemInfo.java
  class SystemInfo (line 25) | public class SystemInfo {
    method SystemInfo (line 39) | private SystemInfo() throws SystemInfoException {
    method getInstance (line 52) | public static SystemInfo getInstance() throws SystemInfoException {
    method getOsFirmwareBuild (line 64) | public String getOsFirmwareBuild() {
    method getModel (line 78) | public String getModel() {
    method getManufacturer (line 92) | public String getManufacturer() {
    method getHardware (line 106) | public String getHardware() {
    method getRevision (line 120) | public String getRevision() {
    method populateBoardModels (line 129) | private void populateBoardModels() {
    method getSystemInfo (line 150) | private void getSystemInfo() throws SystemInfoException {
    method getOsFirmwareVersion (line 172) | private void getOsFirmwareVersion() throws SystemInfoException {

FILE: java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pi/system/SystemInfoException.java
  class SystemInfoException (line 19) | public class SystemInfoException extends Exception {
    method SystemInfoException (line 22) | public SystemInfoException(String msg) {
    method SystemInfoException (line 26) | public SystemInfoException(String message, Throwable cause) {

FILE: java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pibrella/Pibrella.java
  class Pibrella (line 27) | public class Pibrella {
    method Pibrella (line 34) | private Pibrella() {
    method getInstance (line 43) | public static Pibrella getInstance() {
    method getRegisteredPins (line 55) | public Map<PibrellaPins, GPIOPin> getRegisteredPins() {
    method registerPin (line 65) | public void registerPin(PibrellaPins pin, GPIOPin gpioPin) {
    method getInput (line 76) | public PibrellaInputPin getInput(PibrellaInputPins input) throws DioEx...
    method getOutput (line 87) | public PibrellaOutputPin getOutput(PibrellaOutputPins output) throws D...
    method getButton (line 97) | public PibrellaButton getButton() throws DioException {
    method getBuzzer (line 107) | public PibrellaBuzzer getBuzzer() throws DioException {
    method getLED (line 118) | public PibrellaLED getLED(PibrellaLEDs led) throws DioException {
    method closeAllIOpins (line 125) | public void closeAllIOpins() {

FILE: java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pibrella/PibrellaButton.java
  class PibrellaButton (line 26) | public class PibrellaButton extends DioPin {
    method PibrellaButton (line 30) | private PibrellaButton() {
    method getInstance (line 40) | public static PibrellaButton getInstance() throws DioException {
    method isPressed (line 61) | public boolean isPressed() throws DioException {

FILE: java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pibrella/PibrellaBuzzer.java
  class PibrellaBuzzer (line 26) | public class PibrellaBuzzer extends DigitalOutputPin {
    method PibrellaBuzzer (line 31) | private PibrellaBuzzer() {
    method getInstance (line 41) | public static PibrellaBuzzer getInstance() throws DioException {
    method buzz (line 63) | public void buzz(int frequency, int duration) {
    class Buzzer (line 70) | private class Buzzer extends Thread {
      method Buzzer (line 75) | private Buzzer(int frequency, int duration) {
      method run (line 80) | @Override

FILE: java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pibrella/PibrellaInputPin.java
  class PibrellaInputPin (line 29) | public class PibrellaInputPin extends DioPin {
    method PibrellaInputPin (line 33) | private PibrellaInputPin(PibrellaInputPins input) {
    method getInstance (line 44) | public static PibrellaInputPin getInstance(PibrellaInputPins input) th...
    method closeAll (line 64) | public static void closeAll() {

FILE: java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pibrella/PibrellaInputPins.java
  type PibrellaInputPins (line 19) | public enum PibrellaInputPins {
    method PibrellaInputPins (line 27) | private PibrellaInputPins(PibrellaPins pin) {
    method getPin (line 31) | public PibrellaPins getPin() {
    method getGPIO (line 35) | public int getGPIO() {
    method getName (line 39) | public String getName() {

FILE: java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pibrella/PibrellaLED.java
  class PibrellaLED (line 29) | public class PibrellaLED extends DigitalOutputPin {
    method PibrellaLED (line 33) | private PibrellaLED(PibrellaLEDs led) {
    method getInstance (line 44) | public static PibrellaLED getInstance(PibrellaLEDs led) throws DioExce...
    method closeAll (line 64) | public static void closeAll() {
    method turnOn (line 79) | public void turnOn() throws DioException {
    method turnOff (line 88) | public void turnOff() throws DioException {
    method isOn (line 98) | public boolean isOn() throws DioException {

FILE: java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pibrella/PibrellaLEDs.java
  type PibrellaLEDs (line 19) | public enum PibrellaLEDs {
    method PibrellaLEDs (line 26) | private PibrellaLEDs(PibrellaPins pin) {
    method getPin (line 30) | public PibrellaPins getPin() {
    method getGPIO (line 34) | public int getGPIO() {
    method getName (line 38) | public String getName() {

FILE: java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pibrella/PibrellaOutputPin.java
  class PibrellaOutputPin (line 29) | public class PibrellaOutputPin extends DigitalOutputPin {
    method PibrellaOutputPin (line 33) | private PibrellaOutputPin(PibrellaOutputPins output) {
    method getInstance (line 44) | public static PibrellaOutputPin getInstance(PibrellaOutputPins output)...
    method closeAll (line 64) | public static void closeAll() {

FILE: java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pibrella/PibrellaOutputPins.java
  type PibrellaOutputPins (line 19) | public enum PibrellaOutputPins {
    method PibrellaOutputPins (line 27) | private PibrellaOutputPins(PibrellaPins pin) {
    method getPin (line 31) | public PibrellaPins getPin() {
    method getGPIO (line 35) | public int getGPIO() {
    method getName (line 39) | public String getName() {

FILE: java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pibrella/PibrellaPins.java
  type PibrellaPins (line 22) | public enum PibrellaPins {
    method PibrellaPins (line 42) | private PibrellaPins(Pins pin, PinDirection direction, String name, St...
    method getPin (line 49) | public Pins getPin() {
    method getGPIO (line 53) | public int getGPIO() {
    method getDirection (line 57) | public PinDirection getDirection() {
    method getName (line 61) | public String getName() {
    method getDescription (line 65) | public String getDescription() {

FILE: java/examples/records/src/main/java/org/eclipse/tahu/SparkplugRecordsExample.java
  class SparkplugRecordsExample (line 49) | public class SparkplugRecordsExample implements MqttCallbackExtended {
    method main (line 72) | public static void main(String[] args) {
    method run (line 77) | public void run() {
    method newRecord (line 146) | private Metric newRecord(String type) throws SparkplugInvalidTypeExcep...
    method publishBirth (line 178) | private void publishBirth() {
    method publishNodeBirth (line 183) | private void publishNodeBirth() {
    method publishDeviceBirth (line 203) | private void publishDeviceBirth() {
    method addBdSeqNum (line 224) | private SparkplugBPayloadBuilder addBdSeqNum(SparkplugBPayloadBuilder ...
    method getSeqNum (line 239) | private long getSeqNum() throws Exception {
    method connectComplete (line 247) | @Override
    method connectionLost (line 253) | public void connectionLost(Throwable cause) {
    method messageArrived (line 258) | public void messageArrived(String topic, MqttMessage message) throws E...
    method deliveryComplete (line 285) | public void deliveryComplete(IMqttDeliveryToken token) {
    method newUUID (line 289) | private String newUUID() {
    class Publisher (line 293) | private class Publisher implements Runnable {
      method Publisher (line 298) | public Publisher(String topic, SparkplugBPayload outboundPayload) {
      method run (line 303) | public void run() {

FILE: java/examples/simple/src/main/java/org/eclipse/tahu/SparkplugExample.java
  class SparkplugExample (line 80) | public class SparkplugExample implements MqttCallbackExtended {
    method main (line 108) | public static void main(String[] args) {
    method run (line 113) | public void run() {
    method randomBytes (line 186) | private byte[] randomBytes(int numOfBytes) {
    method publishBirth (line 192) | private void publishBirth() {
    method publishNodeBirth (line 197) | private void publishNodeBirth() {
    method publishDeviceBirth (line 237) | private void publishDeviceBirth() {
    method addBdSeqNum (line 297) | private SparkplugBPayloadBuilder addBdSeqNum(SparkplugBPayloadBuilder ...
    method getSeqNum (line 310) | private long getSeqNum() throws Exception {
    method connectComplete (line 318) | @Override
    method connectionLost (line 324) | public void connectionLost(Throwable cause) {
    method messageArrived (line 329) | public void messageArrived(String topic, MqttMessage message) throws E...
    method deliveryComplete (line 390) | public void deliveryComplete(IMqttDeliveryToken token) {
    method newUUID (line 394) | private String newUUID() {
    method newMetrics (line 398) | private List<Metric> newMetrics(boolean isBirth) throws SparkplugExcep...
    method newPropertySet (line 452) | private PropertySet newPropertySet() throws SparkplugException {
    method newProps (line 456) | private Map<String, PropertyValue> newProps(boolean withPropTypes) thr...
    method newParams (line 485) | private List<Parameter> newParams() throws SparkplugException {
    method newComplexTemplate (line 496) | private List<Metric> newComplexTemplate(boolean withTemplateDefs) thro...
    method newTemplate (line 530) | private Template newTemplate(boolean isDef, String templatRef) throws ...
    method newDataSet (line 553) | private DataSet newDataSet() throws SparkplugException {
    method getRandomUInt8 (line 595) | private short getRandomUInt8() {
    method getRandomUInt16 (line 600) | private int getRandomUInt16() {
    method getRandomUInt32 (line 606) | private long getRandomUInt32() {
    method getRandomUInt64 (line 610) | private BigInteger getRandomUInt64() {
    class Publisher (line 622) | private class Publisher implements Runnable {
      method Publisher (line 627) | public Publisher(String topic, SparkplugBPayload outboundPayload) {
      method run (line 632) | public void run() {

FILE: java/examples/udt/src/main/java/org/eclipse/tahu/SparkplugExample.java
  class SparkplugExample (line 65) | public class SparkplugExample implements MqttCallbackExtended {
    method main (line 87) | public static void main(String[] args) {
    method run (line 92) | public void run() {
    method publishBirth (line 149) | private void publishBirth() {
    method addBdSeqNum (line 187) | private SparkplugBPayloadBuilder addBdSeqNum(SparkplugBPayloadBuilder ...
    method getSeqNum (line 200) | private long getSeqNum() throws Exception {
    method connectComplete (line 208) | @Override
    method connectionLost (line 214) | public void connectionLost(Throwable cause) {
    method messageArrived (line 219) | public void messageArrived(String topic, MqttMessage message) throws E...
    method deliveryComplete (line 258) | public void deliveryComplete(IMqttDeliveryToken token) {
    method newUUID (line 262) | private String newUUID() {
    method newParams (line 266) | private List<Parameter> newParams() throws SparkplugException {
    method newComplexTemplateDefs (line 277) | private List<Metric> newComplexTemplateDefs() throws SparkplugInvalidT...
    method newComplexTemplateInstance (line 300) | private List<Metric> newComplexTemplateInstance() throws SparkplugInva...
    method newSimpleTemplate (line 316) | private Template newSimpleTemplate(boolean isDef, String templatRef) t...
    class Publisher (line 339) | private class Publisher implements Runnable {
      method Publisher (line 344) | public Publisher(String topic, SparkplugBPayload outboundPayload) {
      method run (line 349) | public void run() {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/SparkplugException.java
  class SparkplugException (line 19) | public class SparkplugException extends Exception {
    method SparkplugException (line 26) | public SparkplugException() {
    method SparkplugException (line 34) | public SparkplugException(String message) {
    method SparkplugException (line 44) | public SparkplugException(String message, Throwable exception) {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/SparkplugInvalidTypeException.java
  class SparkplugInvalidTypeException (line 19) | public class SparkplugInvalidTypeException extends SparkplugException {
    method SparkplugInvalidTypeException (line 28) | public SparkplugInvalidTypeException(Class<?> type) {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/SparkplugParsingException.java
  class SparkplugParsingException (line 19) | public class SparkplugParsingException extends SparkplugException {
    method SparkplugParsingException (line 28) | public SparkplugParsingException(String message) {
    method SparkplugParsingException (line 38) | public SparkplugParsingException(String message, Throwable exception) {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/exception/TahuErrorCode.java
  type TahuErrorCode (line 16) | public enum TahuErrorCode {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/exception/TahuException.java
  class TahuException (line 19) | public class TahuException extends Exception {
    method TahuException (line 28) | public TahuException() {
    method TahuException (line 37) | public TahuException(TahuErrorCode code) {
    method TahuException (line 49) | public TahuException(TahuErrorCode code, String message, Throwable e) {
    method TahuException (line 60) | public TahuException(TahuErrorCode code, Throwable e) {
    method TahuException (line 71) | public TahuException(TahuErrorCode code, String message) {
    method getDetails (line 81) | public String getDetails() {
    method getTahuErrorCode (line 90) | public TahuErrorCode getTahuErrorCode() {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/json/DataSetDeserializer.java
  class DataSetDeserializer (line 40) | public class DataSetDeserializer extends StdDeserializer<DataSet> {
    method DataSetDeserializer (line 56) | protected DataSetDeserializer(Class<DataSet> clazz) {
    method deserialize (line 60) | @Override
    method getValueFromNode (line 103) | private Value<?> getValueFromNode(JsonNode nodeValue, DataSetDataType ...

FILE: java/lib/core/src/main/java/org/eclipse/tahu/json/DeserializerModifier.java
  class DeserializerModifier (line 28) | public class DeserializerModifier extends BeanDeserializerModifier {
    method modifyDeserializer (line 30) | @Override

FILE: java/lib/core/src/main/java/org/eclipse/tahu/json/DeserializerModule.java
  class DeserializerModule (line 23) | public class DeserializerModule extends SimpleModule {
    method DeserializerModule (line 29) | public DeserializerModule(BeanDeserializerModifier deserializerModifie...
    method setupModule (line 34) | @Override

FILE: java/lib/core/src/main/java/org/eclipse/tahu/json/FileSerializer.java
  class FileSerializer (line 28) | public class FileSerializer extends StdSerializer<File> {
    method FileSerializer (line 35) | protected FileSerializer() {
    method FileSerializer (line 44) | protected FileSerializer(Class<File> clazz) {
    method serialize (line 48) | @Override

FILE: java/lib/core/src/main/java/org/eclipse/tahu/json/JsonValidator.java
  class JsonValidator (line 19) | public class JsonValidator {
    method JsonValidator (line 28) | protected JsonValidator() {
    method getInstance (line 36) | public static JsonValidator getInstance() {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/json/MetricDeserializer.java
  class MetricDeserializer (line 35) | public class MetricDeserializer extends StdDeserializer<Metric> implemen...
    method MetricDeserializer (line 44) | protected MetricDeserializer(JsonDeserializer<?> defaultDeserializer) {
    method deserialize (line 49) | @Override
    method resolve (line 66) | @Override

FILE: java/lib/core/src/main/java/org/eclipse/tahu/json/PropertySetDeserializer.java
  class PropertySetDeserializer (line 30) | public class PropertySetDeserializer extends StdDeserializer<PropertySet...
    method PropertySetDeserializer (line 39) | protected PropertySetDeserializer(JsonDeserializer<?> defaultDeseriali...
    method resolve (line 44) | @Override
    method deserialize (line 49) | @Override

FILE: java/lib/core/src/main/java/org/eclipse/tahu/json/TemplateDeserializer.java
  class TemplateDeserializer (line 30) | public class TemplateDeserializer extends StdDeserializer<Template> impl...
    method TemplateDeserializer (line 39) | protected TemplateDeserializer(JsonDeserializer<?> defaultDeserializer) {
    method resolve (line 44) | @Override
    method deserialize (line 49) | @Override

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/BdSeqManager.java
  type BdSeqManager (line 19) | public interface BdSeqManager {
    method getNextDeathBdSeqNum (line 29) | public long getNextDeathBdSeqNum();
    method storeNextDeathBdSeqNum (line 37) | public void storeNextDeathBdSeqNum(long bdSeqNum);

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/DefaultBdSeqManager.java
  class DefaultBdSeqManager (line 23) | public class DefaultBdSeqManager implements BdSeqManager {
    method DefaultBdSeqManager (line 38) | public DefaultBdSeqManager(String fileName) {
    method getNextDeathBdSeqNum (line 42) | @Override
    method storeNextDeathBdSeqNum (line 63) | @Override

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/PayloadDecoder.java
  type PayloadDecoder (line 23) | public interface PayloadDecoder<P> {
    method buildFromByteArray (line 33) | public P buildFromByteArray(byte[] bytes, MetricDataTypeMap metricData...

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/PayloadEncoder.java
  type PayloadEncoder (line 23) | public interface PayloadEncoder<P> {
    method getBytes (line 32) | public byte[] getBytes(P payload, boolean stripDataTypes) throws IOExc...

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/SparkplugBPayloadDecoder.java
  class SparkplugBPayloadDecoder (line 56) | public class SparkplugBPayloadDecoder implements PayloadDecoder<Sparkplu...
    method SparkplugBPayloadDecoder (line 63) | public SparkplugBPayloadDecoder() {
    method buildFromByteArray (line 67) | @Override
    method convertMetric (line 100) | private Metric convertMetric(SparkplugBProto.Payload.Metric protoMetri...
    method convertProperties (line 147) | private Map<String, PropertyValue> convertProperties(SparkplugBProto.P...
    method getPropertyValue (line 160) | private Object getPropertyValue(SparkplugBProto.Payload.PropertyValue ...
    method getMetricValue (line 214) | private Object getMetricValue(SparkplugBProto.Payload.Metric protoMetr...
    method convertDataSetRows (line 477) | private Collection<Row> convertDataSetRows(List<SparkplugBProto.Payloa...
    method convertDataSetDataTypes (line 494) | private Collection<DataSetDataType> convertDataSetDataTypes(List<Integ...
    method getParameterValue (line 503) | private Object getParameterValue(SparkplugBProto.Payload.Template.Para...
    method convertDataSetValue (line 544) | private Value<?> convertDataSetValue(int protoType, SparkplugBProto.Pa...

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/SparkplugBPayloadEncoder.java
  class SparkplugBPayloadEncoder (line 49) | public class SparkplugBPayloadEncoder implements PayloadEncoder<Sparkplu...
    method SparkplugBPayloadEncoder (line 56) | public SparkplugBPayloadEncoder() {
    method getBytes (line 60) | @Override
    method convertMetric (line 102) | private SparkplugBProto.Payload.Metric.Builder convertMetric(Metric me...
    method convertParameter (line 160) | private SparkplugBProto.Payload.Template.Parameter.Builder convertPara...
    method convertPropertySet (line 180) | private SparkplugBProto.Payload.PropertySet.Builder convertPropertySet...
    method setParameterValue (line 257) | private SparkplugBProto.Payload.Template.Parameter.Builder setParamete...
    method setMetricValue (line 316) | private SparkplugBProto.Payload.Metric.Builder setMetricValue(Sparkplu...
    method setMetaData (line 779) | private SparkplugBProto.Payload.Metric.Builder setMetaData(SparkplugBP...
    method convertDataSetValue (line 816) | private SparkplugBProto.Payload.DataSet.DataSetValue.Builder convertDa...
    method toBoolean (line 911) | private Boolean toBoolean(Object value) {
    method bigIntegerToUnsignedLong (line 933) | private long bigIntegerToUnsignedLong(BigInteger bigInteger) {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/DataSet.java
  class DataSet (line 33) | @JsonDeserialize(
    method DataSet (line 65) | public DataSet() {
    method DataSet (line 76) | public DataSet(long numOfColumns, List<String> columnNames, List<DataS...
    method getNumOfColumns (line 88) | public long getNumOfColumns() {
    method setNumOfColumns (line 97) | public void setNumOfColumns(long numOfColumns) {
    method getColumnNames (line 106) | public List<String> getColumnNames() {
    method setColumnNames (line 115) | public void setColumnNames(List<String> columnNames) {
    method addColumnName (line 124) | public void addColumnName(String columnName) {
    method getRows (line 133) | public List<Row> getRows() {
    method getRowsAsLists (line 142) | @JsonGetter("rows")
    method addRow (line 156) | public void addRow(Row row) {
    method addRow (line 166) | public void addRow(int index, Row row) {
    method removeRow (line 177) | public Row removeRow(int index) {
    method removeRow (line 188) | public boolean removeRow(Row row) {
    method setRows (line 197) | public void setRows(List<Row> rows) {
    method getTypes (line 206) | public List<DataSetDataType> getTypes() {
    method setTypes (line 215) | public void setTypes(List<DataSetDataType> types) {
    method addType (line 224) | public void addType(DataSetDataType type) {
    method addType (line 235) | public void addType(int index, DataSetDataType type) {
    method toString (line 239) | @Override
    class DataSetBuilder (line 257) | public static class DataSetBuilder {
      method DataSetBuilder (line 264) | public DataSetBuilder(long numOfColumns) {
      method DataSetBuilder (line 271) | public DataSetBuilder(DataSet dataSet) {
      method addColumnNames (line 281) | public DataSetBuilder addColumnNames(Collection<String> columnNames) {
      method addColumnName (line 286) | public DataSetBuilder addColumnName(String columnName) {
      method addType (line 291) | public DataSetBuilder addType(DataSetDataType type) {
      method addTypes (line 296) | public DataSetBuilder addTypes(Collection<DataSetDataType> types) {
      method addRow (line 301) | public DataSetBuilder addRow(Row row) {
      method addRows (line 306) | public DataSetBuilder addRows(Collection<Row> rows) {
      method createDataSet (line 311) | public DataSet createDataSet() throws SparkplugException {
      method validate (line 327) | public void validate() throws SparkplugException {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/DataSetDataType.java
  type DataSetDataType (line 24) | public enum DataSetDataType {
    method DataSetDataType (line 48) | private DataSetDataType(int intValue, Class<?> clazz) {
    method checkType (line 53) | public void checkType(Object value) throws SparkplugInvalidTypeExcepti...
    method toIntValue (line 64) | public int toIntValue() {
    method fromInteger (line 74) | public static DataSetDataType fromInteger(int i) {
    method getClazz (line 114) | public Class<?> getClazz() {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/DeviceDescriptor.java
  class DeviceDescriptor (line 16) | public class DeviceDescriptor extends EdgeNodeDescriptor {
    method DeviceDescriptor (line 28) | public DeviceDescriptor(String groupId, String edgeNodeId, String devi...
    method DeviceDescriptor (line 40) | public DeviceDescriptor(String descriptorString) {
    method DeviceDescriptor (line 53) | public DeviceDescriptor(EdgeNodeDescriptor edgeNodeDescriptor, String ...
    method isDeviceDescriptor (line 64) | @Override
    method getDeviceId (line 74) | @Override
    method getDescriptorString (line 85) | @Override
    method getEdgeNodeDescriptor (line 95) | public EdgeNodeDescriptor getEdgeNodeDescriptor() {
    method getEdgeNodeDescriptorString (line 105) | public String getEdgeNodeDescriptorString() {
    method hashCode (line 109) | @Override
    method equals (line 114) | @Override
    method toString (line 122) | @Override

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/EdgeNodeDescriptor.java
  class EdgeNodeDescriptor (line 21) | public class EdgeNodeDescriptor implements SparkplugDescriptor {
    method EdgeNodeDescriptor (line 33) | public EdgeNodeDescriptor(String groupId, String edgeNodeId) {
    method EdgeNodeDescriptor (line 44) | public EdgeNodeDescriptor(String descriptorString) {
    method getGroupId (line 56) | @Override
    method getEdgeNodeId (line 66) | @Override
    method getDeviceId (line 77) | @Override
    method isDeviceDescriptor (line 85) | @Override
    method getEdgeNodeDescriptor (line 95) | protected EdgeNodeDescriptor getEdgeNodeDescriptor() {
    method getDescriptorString (line 104) | @Override
    method hashCode (line 109) | @Override
    method equals (line 114) | @Override
    method toString (line 122) | @Override

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/File.java
  class File (line 23) | @JsonIgnoreProperties(
    method File (line 35) | public File() {
    method File (line 45) | public File(String fileName, byte[] bytes) {
    method getFileName (line 59) | public String getFileName() {
    method setFileName (line 68) | public void setFileName(String fileName) {
    method getBytes (line 77) | public byte[] getBytes() {
    method setBytes (line 86) | public void setBytes(byte[] bytes) {
    method toString (line 90) | @Override

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/Message.java
  class Message (line 19) | public class Message {
    method Message (line 28) | public Message() {
    method Message (line 36) | public Message(Message message) {
    method Message (line 47) | private Message(Topic topic, SparkplugBPayload payload) {
    method getTopic (line 58) | public Topic getTopic() {
    method getPayload (line 67) | public SparkplugBPayload getPayload() {
    method toString (line 71) | @Override
    class MessageBuilder (line 85) | public static class MessageBuilder {
      method MessageBuilder (line 91) | public MessageBuilder(Topic topic, SparkplugBPayload payload) {
      method MessageBuilder (line 96) | public MessageBuilder() {
      method topic (line 99) | public MessageBuilder topic(Topic topic) {
      method payload (line 104) | public MessageBuilder payload(SparkplugBPayload payload) {
      method build (line 109) | public Message build() {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/MessageType.java
  type MessageType (line 22) | public enum MessageType {
    method parseMessageType (line 88) | public static MessageType parseMessageType(String type) throws Sparkpl...
    method isDeath (line 102) | public boolean isDeath() {
    method isCommand (line 111) | public boolean isCommand() {
    method isData (line 120) | public boolean isData() {
    method isBirth (line 129) | public boolean isBirth() {
    method isRecord (line 138) | public boolean isRecord() {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/MetaData.java
  class MetaData (line 24) | @JsonInclude(Include.NON_NULL)
    method MetaData (line 70) | public MetaData() {
    method MetaData (line 85) | public MetaData(Boolean isMultiPart, String contentType, Long size, Lo...
    method MetaData (line 102) | public MetaData(MetaData metaData) {
    method isMultiPart (line 112) | public Boolean isMultiPart() {
    method setMultiPart (line 123) | public MetaData setMultiPart(Boolean isMultiPart) {
    method getContentType (line 133) | public String getContentType() {
    method setContentType (line 144) | public MetaData setContentType(String contentType) {
    method getSize (line 154) | public Long getSize() {
    method setSize (line 165) | public MetaData setSize(Long size) {
    method getSeq (line 175) | public Long getSeq() {
    method setSeq (line 186) | public MetaData setSeq(Long seq) {
    method getFileName (line 196) | public String getFileName() {
    method setFileName (line 207) | public MetaData setFileName(String fileName) {
    method getFileType (line 217) | public String getFileType() {
    method setFileType (line 228) | public MetaData setFileType(String fileType) {
    method getMd5 (line 238) | public String getMd5() {
    method setMd5 (line 249) | public MetaData setMd5(String md5) {
    method getDescription (line 259) | public String getDescription() {
    method setDescription (line 270) | public MetaData setDescription(String description) {
    method toString (line 275) | @Override
    method equals (line 298) | @Override
    class MetaDataBuilder (line 316) | public static class MetaDataBuilder {
      method MetaDataBuilder (line 327) | public MetaDataBuilder() {
      method MetaDataBuilder (line 330) | public MetaDataBuilder(MetaData metaData) {
      method multiPart (line 341) | public MetaDataBuilder multiPart(Boolean isMultiPart) {
      method contentType (line 346) | public MetaDataBuilder contentType(String contentType) {
      method size (line 351) | public MetaDataBuilder size(Long size) {
      method seq (line 356) | public MetaDataBuilder seq(Long seq) {
      method fileName (line 361) | public MetaDataBuilder fileName(String fileName) {
      method fileType (line 366) | public MetaDataBuilder fileType(String fileType) {
      method md5 (line 371) | public MetaDataBuilder md5(String md5) {
      method description (line 376) | public MetaDataBuilder description(String description) {
      method createMetaData (line 381) | public MetaData createMetaData() {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/Metric.java
  class Metric (line 39) | @JsonIgnoreProperties(
    method Metric (line 78) | public Metric() {
    method Metric (line 99) | public Metric(String name, Long alias, Date timestamp, MetricDataType ...
    method Metric (line 122) | public Metric(Metric metric) throws SparkplugInvalidTypeException {
    method getName (line 133) | public String getName() {
    method setName (line 142) | public void setName(String name) {
    method hasName (line 151) | public boolean hasName() {
    method hasAlias (line 160) | public boolean hasAlias() {
    method getAlias (line 169) | public Long getAlias() {
    method setAlias (line 178) | public void setAlias(long alias) {
    method getTimestamp (line 187) | public Date getTimestamp() {
    method setTimestamp (line 196) | public void setTimestamp(Date timestamp) {
    method getDataType (line 205) | public MetricDataType getDataType() {
    method setDataType (line 214) | public void setDataType(MetricDataType dataType) {
    method getMetaData (line 223) | @JsonGetter("metaData")
    method setMetaData (line 233) | @JsonSetter("metaData")
    method getValue (line 243) | public Object getValue() {
    method setValue (line 252) | public void setValue(Object value) {
    method getProperties (line 262) | public PropertySet getProperties() {
    method setProperties (line 271) | public void setProperties(PropertySet properties) {
    method isHistorical (line 280) | @JsonIgnore
    method getIsHistorical (line 290) | @JsonGetter("isHistorical")
    method setHistorical (line 300) | @JsonSetter("isHistorical")
    method isTransient (line 310) | @JsonIgnore
    method getIsTransient (line 320) | @JsonGetter("isTransient")
    method setTransient (line 330) | @JsonSetter("isTransient")
    method isNull (line 340) | @JsonIgnore
    method getIsNull (line 350) | @JsonIgnore
    method hashCode (line 355) | @Override
    method equals (line 372) | @Override
    method toString (line 431) | @Override
    class MetricBuilder (line 489) | public static class MetricBuilder {
      method MetricBuilder (line 501) | public MetricBuilder(String name, MetricDataType dataType, Object va...
      method MetricBuilder (line 508) | public MetricBuilder(Long alias, MetricDataType dataType, Object val...
      method MetricBuilder (line 515) | public MetricBuilder(Metric metric) throws SparkplugException {
      method name (line 543) | public MetricBuilder name(String name) {
      method alias (line 548) | public MetricBuilder alias(Long alias) {
      method timestamp (line 553) | public MetricBuilder timestamp(Date timestamp) {
      method dataType (line 558) | public MetricBuilder dataType(MetricDataType dataType) {
      method isHistorical (line 563) | public MetricBuilder isHistorical(Boolean isHistorical) {
      method isTransient (line 568) | public MetricBuilder isTransient(Boolean isTransient) {
      method metaData (line 573) | public MetricBuilder metaData(MetaData metaData) {
      method properties (line 578) | public MetricBuilder properties(PropertySet properties) {
      method value (line 583) | public MetricBuilder value(Object value) {
      method createMetric (line 588) | public Metric createMetric() throws SparkplugInvalidTypeException {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/MetricDataType.java
  type MetricDataType (line 26) | public enum MetricDataType {
    method MetricDataType (line 83) | private MetricDataType(int intValue, Class<?> clazz) {
    method checkType (line 95) | public void checkType(Object value) throws SparkplugInvalidTypeExcepti...
    method toIntValue (line 108) | public int toIntValue() {
    method fromInteger (line 118) | public static MetricDataType fromInteger(int i) {
    method getClazz (line 194) | public Class<?> getClazz() {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/Parameter.java
  class Parameter (line 29) | @JsonInclude(Include.NON_NULL)
    method Parameter (line 51) | public Parameter() {
    method Parameter (line 62) | public Parameter(String name, ParameterDataType type, Object value) th...
    method getName (line 76) | @JsonGetter("name")
    method setName (line 86) | @JsonSetter("name")
    method getType (line 96) | public ParameterDataType getType() {
    method setType (line 105) | public void setType(ParameterDataType type) {
    method getValue (line 114) | public Object getValue() {
    method setValue (line 123) | public void setValue(Object value) {
    method equals (line 127) | @Override
    method toString (line 140) | @Override

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/ParameterDataType.java
  type ParameterDataType (line 26) | public enum ParameterDataType {
    method ParameterDataType (line 59) | private ParameterDataType(int intValue, Class<?> clazz) {
    method checkType (line 72) | public void checkType(Object value) throws SparkplugInvalidTypeExcepti...
    method toIntValue (line 84) | public int toIntValue() {
    method fromInteger (line 94) | public static ParameterDataType fromInteger(int i) {
    method getClazz (line 134) | public Class<?> getClazz() {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/Property.java
  class Property (line 9) | public class Property<T> {
    method Property (line 17) | public Property(String name, T defaultValue) {
    method Property (line 22) | public Property(String name, T defaultValue, T value) {
    method getValue (line 27) | public T getValue() {
    method setValue (line 31) | public void setValue(T value) {
    method getName (line 35) | public String getName() {
    method getDefaultValue (line 39) | public T getDefaultValue() {
    method toString (line 43) | @Override

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/PropertyDataType.java
  type PropertyDataType (line 27) | public enum PropertyDataType {
    method PropertyDataType (line 64) | private PropertyDataType(int intValue, Class<?> clazz) {
    method checkType (line 77) | public void checkType(Object value) throws SparkplugInvalidTypeExcepti...
    method toIntValue (line 93) | public int toIntValue() {
    method fromInteger (line 103) | public static PropertyDataType fromInteger(int i) {
    method getClazz (line 147) | public Class<?> getClazz() {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/PropertySet.java
  class PropertySet (line 28) | public class PropertySet implements Map<String, PropertyValue> {
    method PropertySet (line 36) | public PropertySet() {
    method PropertySet (line 45) | public PropertySet(PropertySet propertySet) {
    method PropertySet (line 54) | private PropertySet(Map<String, PropertyValue> propertyMap) {
    method getPropertyValue (line 65) | @JsonIgnore
    method setProperty (line 76) | @JsonIgnore
    method removeProperty (line 86) | @JsonIgnore
    method clear (line 94) | @JsonIgnore
    method getNames (line 104) | @JsonIgnore
    method getValues (line 114) | @JsonIgnore
    method getPropertyMap (line 124) | @JsonIgnore
    method toString (line 129) | @Override
    method size (line 134) | @Override
    method isEmpty (line 139) | @Override
    method containsKey (line 144) | @Override
    method containsValue (line 149) | @Override
    method get (line 154) | @Override
    method put (line 159) | @Override
    method remove (line 164) | @Override
    method putAll (line 169) | @Override
    method keySet (line 174) | @Override
    method values (line 179) | @Override
    method entrySet (line 184) | @Override
    class PropertySetBuilder (line 192) | public static class PropertySetBuilder {
      method PropertySetBuilder (line 196) | public PropertySetBuilder() {
      method PropertySetBuilder (line 200) | public PropertySetBuilder(Map<String, PropertyValue> propertyMap) {
      method PropertySetBuilder (line 204) | public PropertySetBuilder(PropertySet propertySet) throws SparkplugI...
      method addProperty (line 212) | public PropertySetBuilder addProperty(String name, PropertyValue val...
      method addProperties (line 217) | public PropertySetBuilder addProperties(Map<String, PropertyValue> p...
      method createPropertySet (line 222) | public PropertySet createPropertySet() {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/PropertyValue.java
  class PropertyValue (line 25) | public class PropertyValue {
    method PropertyValue (line 34) | public PropertyValue() {
    method PropertyValue (line 44) | public PropertyValue(PropertyDataType type, Object value) throws Spark...
    method getType (line 56) | public PropertyDataType getType() {
    method setType (line 65) | public void setType(PropertyDataType type) {
    method getValue (line 74) | public Object getValue() {
    method setValue (line 83) | public void setValue(Object value) {
    method isNull (line 93) | @JsonIgnore
    method equals (line 98) | @Override
    method toString (line 110) | @Override

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/Quality.java
  class Quality (line 19) | public class Quality {
    method Quality (line 24) | public Quality() {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/Row.java
  class Row (line 23) | public class Row {
    method Row (line 30) | public Row() {
    method Row (line 39) | public Row(List<Value<?>> values) {
    method getValues (line 48) | public List<Value<?>> getValues() {
    method setValues (line 57) | public void setValues(List<Value<?>> values) {
    method addValue (line 66) | public void addValue(Value<?> value) {
    method toString (line 70) | @Override
    method hashCode (line 75) | @Override
    method equals (line 83) | @Override
    method toValues (line 106) | public static List<Object> toValues(Row row) {
    class RowBuilder (line 117) | public static class RowBuilder {
      method RowBuilder (line 121) | public RowBuilder() {
      method RowBuilder (line 125) | public RowBuilder(Row row) {
      method addValue (line 129) | public RowBuilder addValue(Value<?> value) {
      method addValues (line 134) | public RowBuilder addValues(Collection<Value<?>> values) {
      method createRow (line 139) | public Row createRow() {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/SparkplugBPayload.java
  class SparkplugBPayload (line 32) | @JsonInclude(Include.NON_NULL)
    method SparkplugBPayload (line 46) | public SparkplugBPayload() {
    method SparkplugBPayload (line 58) | public SparkplugBPayload(Date timestamp, List<Metric> metrics, Long se...
    method SparkplugBPayload (line 71) | public SparkplugBPayload(Date timestamp, List<Metric> metrics, Long se...
    method SparkplugBPayload (line 82) | public SparkplugBPayload(Date timestamp, List<Metric> metrics) {
    method SparkplugBPayload (line 92) | public SparkplugBPayload(SparkplugBPayload payload) {
    method getTimestamp (line 114) | public Date getTimestamp() {
    method setTimestamp (line 123) | public void setTimestamp(Date timestamp) {
    method addMetric (line 132) | public void addMetric(Metric metric) {
    method addMetric (line 142) | public void addMetric(int index, Metric metric) {
    method addMetrics (line 151) | public void addMetrics(List<Metric> metrics) {
    method removeMetric (line 161) | public Metric removeMetric(int index) {
    method removeMetric (line 171) | public boolean removeMetric(Metric metric) {
    method getMetrics (line 180) | public List<Metric> getMetrics() {
    method getMetricCount (line 189) | @JsonIgnore
    method setMetrics (line 199) | public void setMetrics(List<Metric> metrics) {
    method getSeq (line 208) | public Long getSeq() {
    method setSeq (line 217) | public void setSeq(Long seq) {
    method getUuid (line 226) | public String getUuid() {
    method setUuid (line 235) | public void setUuid(String uuid) {
    method getBody (line 244) | public byte[] getBody() {
    method setBody (line 253) | public void setBody(byte[] body) {
    method toString (line 257) | @Override
    class SparkplugBPayloadBuilder (line 277) | public static class SparkplugBPayloadBuilder {
      method SparkplugBPayloadBuilder (line 285) | public SparkplugBPayloadBuilder(Long sequenceNumber) {
      method SparkplugBPayloadBuilder (line 290) | public SparkplugBPayloadBuilder() {
      method addMetric (line 294) | public SparkplugBPayloadBuilder addMetric(Metric metric) {
      method addMetrics (line 299) | public SparkplugBPayloadBuilder addMetrics(Collection<Metric> metric...
      method setTimestamp (line 304) | public SparkplugBPayloadBuilder setTimestamp(Date timestamp) {
      method setSeq (line 309) | public SparkplugBPayloadBuilder setSeq(Long seq) {
      method setUuid (line 314) | public SparkplugBPayloadBuilder setUuid(String uuid) {
      method setBody (line 319) | public SparkplugBPayloadBuilder setBody(byte[] body) {
      method createPayload (line 324) | public SparkplugBPayload createPayload() {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/SparkplugBPayloadMap.java
  class SparkplugBPayloadMap (line 33) | public class SparkplugBPayloadMap extends SparkplugBPayload {
    method SparkplugBPayloadMap (line 44) | public SparkplugBPayloadMap() {
    method SparkplugBPayloadMap (line 58) | public SparkplugBPayloadMap(Date timestamp, List<Metric> metrics, long...
    method addMetric (line 72) | @Override
    method addMetric (line 85) | @Override
    method addMetrics (line 99) | @Override
    method removeMetric (line 113) | @Override
    method removeMetric (line 126) | @Override
    method removeMetric (line 143) | public boolean removeMetric(String metricName) {
    method getMetrics (line 159) | @Override
    method getMetricCount (line 167) | @Override
    method setMetrics (line 178) | @Override
    method getMetric (line 193) | public Metric getMetric(String metricName) {
    method updateMetricValue (line 204) | public void updateMetricValue(String newMetricName, Metric newMetric, ...
    method updateTemplateMetricValues (line 230) | private void updateTemplateMetricValues(TemplateMap existingTemplateMa...
    method handleProps (line 250) | private void handleProps(Metric existingMetric, Metric newMetric, List...
    method updateMetricTimestamps (line 289) | public void updateMetricTimestamps(Date date) {
    method updateTemplateTimestamps (line 298) | private void updateTemplateTimestamps(Template template, Date date) {
    method uptickMetricTimestamps (line 309) | public void uptickMetricTimestamps(Date birthTimestamp) {
    method uptickTemplateTimestamps (line 323) | private void uptickTemplateTimestamps(Template template, Date birthTim...
    method toString (line 339) | @Override
    class SparkplugBPayloadMapBuilder (line 359) | public static class SparkplugBPayloadMapBuilder {
      method SparkplugBPayloadMapBuilder (line 367) | public SparkplugBPayloadMapBuilder(long sequenceNumber) {
      method SparkplugBPayloadMapBuilder (line 372) | public SparkplugBPayloadMapBuilder() {
      method addMetric (line 376) | public SparkplugBPayloadMapBuilder addMetric(Metric metric) {
      method addMetrics (line 381) | public SparkplugBPayloadMapBuilder addMetrics(Collection<Metric> met...
      method setTimestamp (line 386) | public SparkplugBPayloadMapBuilder setTimestamp(Date timestamp) {
      method setSeq (line 391) | public SparkplugBPayloadMapBuilder setSeq(long seq) {
      method setUuid (line 396) | public SparkplugBPayloadMapBuilder setUuid(String uuid) {
      method setBody (line 401) | public SparkplugBPayloadMapBuilder setBody(byte[] body) {
      method createPayload (line 406) | public SparkplugBPayloadMap createPayload() {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/SparkplugDescriptor.java
  type SparkplugDescriptor (line 16) | public interface SparkplugDescriptor {
    method getDescriptorString (line 23) | public String getDescriptorString();
    method getGroupId (line 30) | public String getGroupId();
    method getEdgeNodeId (line 37) | public String getEdgeNodeId();
    method isDeviceDescriptor (line 44) | public boolean isDeviceDescriptor();
    method getDeviceId (line 51) | public String getDeviceId();

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/SparkplugMeta.java
  class SparkplugMeta (line 16) | public class SparkplugMeta {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/StatePayload.java
  class StatePayload (line 21) | public class StatePayload {
    method StatePayload (line 32) | public StatePayload() {
    method StatePayload (line 43) | public StatePayload(Boolean online, Long timestamp) {
    method isOnline (line 54) | public Boolean isOnline() {
    method setOnline (line 63) | public void setOnline(Boolean online) {
    method getTimestamp (line 72) | public Long getTimestamp() {
    method setTimestamp (line 81) | public void setTimestamp(Long timestamp) {
    method toString (line 85) | @Override

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/Template.java
  class Template (line 32) | @JsonInclude(Include.NON_NULL)
    method Template (line 66) | public Template() {
    method Template (line 79) | public Template(String version, String templateRef, boolean isDefiniti...
    method getVersion (line 93) | public String getVersion() {
    method setVersion (line 102) | public void setVersion(String version) {
    method getTemplateRef (line 111) | public String getTemplateRef() {
    method setTemplateRef (line 120) | public void setTemplateRef(String templateRef) {
    method isDefinition (line 129) | @JsonGetter("isDefinition")
    method setDefinition (line 139) | @JsonSetter("isDefinition")
    method getMetrics (line 149) | public List<Metric> getMetrics() {
    method setMetrics (line 158) | public void setMetrics(List<Metric> metrics) {
    method addMetric (line 167) | public void addMetric(Metric metric) {
    method getParameters (line 176) | public List<Parameter> getParameters() {
    method setParameters (line 185) | public void setParameters(List<Parameter> parameters) {
    method addParameter (line 193) | public void addParameter(Parameter parameter) {
    method toString (line 197) | @Override
    class TemplateBuilder (line 217) | public static class TemplateBuilder {
      method TemplateBuilder (line 233) | public TemplateBuilder() {
      method TemplateBuilder (line 239) | public TemplateBuilder(Template template) throws SparkplugException {
      method version (line 253) | public TemplateBuilder version(String version) {
      method templateRef (line 258) | public TemplateBuilder templateRef(String templateRef) {
      method definition (line 263) | public TemplateBuilder definition(boolean isDefinition) {
      method addMetric (line 268) | public TemplateBuilder addMetric(Metric metric) {
      method addMetrics (line 273) | public TemplateBuilder addMetrics(Collection<Metric> metrics) {
      method addParameter (line 278) | public TemplateBuilder addParameter(Parameter parameter) {
      method addParameters (line 283) | public TemplateBuilder addParameters(Collection<Parameter> parameter...
      method createTemplate (line 288) | public Template createTemplate() {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/TemplateMap.java
  class TemplateMap (line 35) | public class TemplateMap extends Template {
    method TemplateMap (line 43) | public TemplateMap() {
    method TemplateMap (line 57) | public TemplateMap(String version, String templateRef, boolean isDefin...
    method getMetricMap (line 68) | public Map<String, Metric> getMetricMap() {
    method updateMetric (line 80) | public void updateMetric(String metricName, Metric metric) {
    method getMetrics (line 89) | @Override
    method setMetrics (line 100) | @Override
    method addMetric (line 114) | @Override
    method toString (line 121) | @Override
    class TemplateMapBuilder (line 141) | public static class TemplateMapBuilder {
      method TemplateMapBuilder (line 157) | public TemplateMapBuilder() {
      method TemplateMapBuilder (line 163) | public TemplateMapBuilder(Template template) throws SparkplugExcepti...
      method TemplateMapBuilder (line 180) | public TemplateMapBuilder(TemplateMap templateMap) throws SparkplugE...
      method version (line 194) | public TemplateMapBuilder version(String version) {
      method templateRef (line 199) | public TemplateMapBuilder templateRef(String templateRef) {
      method definition (line 204) | public TemplateMapBuilder definition(boolean isDefinition) {
      method addParameter (line 209) | public TemplateMapBuilder addParameter(Parameter parameter) {
      method addParameters (line 214) | public TemplateMapBuilder addParameters(Collection<Parameter> parame...
      method createTemplateMap (line 219) | public TemplateMap createTemplateMap() {
    class CustomMetricBuilder (line 227) | public static class CustomMetricBuilder {
      method CustomMetricBuilder (line 239) | public CustomMetricBuilder(Metric metric) throws SparkplugException {
      method createMetric (line 267) | public Metric createMetric() throws SparkplugInvalidTypeException {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/Topic.java
  class Topic (line 26) | @JsonInclude(Include.NON_NULL)
    method Topic (line 73) | public Topic() {
    method Topic (line 93) | public Topic(String namespace, String groupId, String edgeNodeId, Stri...
    method Topic (line 115) | public Topic(String namespace, String groupId, String edgeNodeId, Mess...
    method Topic (line 134) | public Topic(String namespace, DeviceDescriptor deviceDescriptor, Mess...
    method Topic (line 146) | public Topic(String namespace, EdgeNodeDescriptor edgeNodeDescriptor, ...
    method Topic (line 157) | public Topic(String namespace, String hostApplicationId, MessageType t...
    method parseTopic (line 176) | public static Topic parseTopic(String topicString) throws TahuException {
    method getNamespace (line 227) | public String getNamespace() {
    method getSparkplugDescriptor (line 236) | public SparkplugDescriptor getSparkplugDescriptor() {
    method getEdgeNodeDescriptor (line 245) | public EdgeNodeDescriptor getEdgeNodeDescriptor() {
    method getGroupId (line 254) | public String getGroupId() {
    method getEdgeNodeId (line 263) | public String getEdgeNodeId() {
    method getDeviceId (line 272) | public String getDeviceId() {
    method getHostApplicationId (line 281) | public String getHostApplicationId() {
    method getType (line 290) | public MessageType getType() {
    method toString (line 294) | @Override
    method isType (line 315) | public boolean isType(MessageType type) {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/message/model/Value.java
  class Value (line 19) | public class Value<V> {
    method Value (line 27) | public Value() {
    method Value (line 37) | public Value(DataSetDataType type, V value) {
    method getType (line 48) | public DataSetDataType getType() {
    method setType (line 57) | public void setType(DataSetDataType type) {
    method getValue (line 66) | public V getValue() {
    method setValue (line 75) | public void setValue(V value) {
    method hashCode (line 79) | @Override
    method equals (line 88) | @Override
    method toString (line 107) | @Override

FILE: java/lib/core/src/main/java/org/eclipse/tahu/model/MetricDataTypeMap.java
  class MetricDataTypeMap (line 20) | public class MetricDataTypeMap {
    method MetricDataTypeMap (line 25) | public MetricDataTypeMap() {
    method addMetricDataType (line 30) | public void addMetricDataType(String metricName, MetricDataType metric...
    method addMetricDataType (line 34) | public void addMetricDataType(Long alias, MetricDataType metricDataTyp...
    method getMetricDataType (line 38) | public MetricDataType getMetricDataType(String metricName) {
    method getMetricDataType (line 42) | public MetricDataType getMetricDataType(Long alias) {
    method isEmpty (line 46) | public boolean isEmpty() {
    method clear (line 54) | public void clear() {
    method toString (line 58) | @Override

FILE: java/lib/core/src/main/java/org/eclipse/tahu/model/MetricMap.java
  class MetricMap (line 25) | public class MetricMap {
    method MetricMap (line 38) | public MetricMap() {
    method addGeneratedAlias (line 54) | public long addGeneratedAlias(String metricName, MetricDataType metric...
    method addAlias (line 72) | public void addAlias(String metricName, Long alias, MetricDataType met...
    method clear (line 86) | public void clear() {
    method getAlias (line 101) | public Long getAlias(String metricName) {
    method getMetricName (line 111) | public String getMetricName(long alias) {
    method getMetricDataType (line 121) | public MetricDataType getMetricDataType(String metricName) {
    method getMetricDataType (line 131) | public MetricDataType getMetricDataType(Long alias) {
    method getMetricDataTypeMap (line 140) | public MetricDataTypeMap getMetricDataTypeMap() {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/model/MqttServerDefinition.java
  class MqttServerDefinition (line 21) | public class MqttServerDefinition {
    method MqttServerDefinition (line 31) | public MqttServerDefinition(MqttServerName mqttServerName, MqttClientI...
    method getMqttServerName (line 42) | public MqttServerName getMqttServerName() {
    method getMqttClientId (line 46) | public MqttClientId getMqttClientId() {
    method getMqttServerUrl (line 50) | public MqttServerUrl getMqttServerUrl() {
    method getUsername (line 54) | public String getUsername() {
    method getPassword (line 58) | public String getPassword() {
    method getKeepAliveTimeout (line 62) | public int getKeepAliveTimeout() {
    method getNdeathTopic (line 66) | public Topic getNdeathTopic() {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/mqtt/ClientCallback.java
  type ClientCallback (line 21) | public interface ClientCallback {
    method shutdown (line 23) | public void shutdown();
    method messageArrived (line 25) | public void messageArrived(MqttServerName mqttServerName, MqttServerUr...
    method connectionLost (line 28) | public void connectionLost(MqttServerName mqttServerName, MqttServerUr...
    method connectComplete (line 31) | public void connectComplete(boolean reconnect, MqttServerName mqttServ...

FILE: java/lib/core/src/main/java/org/eclipse/tahu/mqtt/MqttClientId.java
  class MqttClientId (line 24) | public class MqttClientId {
    method MqttClientId (line 40) | public MqttClientId(String mqttClientId, boolean checkClientIdLength) ...
    method generate (line 58) | public static String generate(String clientIdPrefix) throws TahuExcept...
    method getMqttClientId (line 72) | public String getMqttClientId() {
    method toString (line 76) | @Override
    method hashCode (line 81) | @Override
    method equals (line 89) | @Override

FILE: java/lib/core/src/main/java/org/eclipse/tahu/mqtt/MqttOperatorDefs.java
  class MqttOperatorDefs (line 16) | public class MqttOperatorDefs {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/mqtt/MqttServerName.java
  class MqttServerName (line 16) | public class MqttServerName {
    method MqttServerName (line 20) | public MqttServerName(String mqttServerName) {
    method getMqttServerName (line 24) | public String getMqttServerName() {
    method toString (line 28) | @Override
    method hashCode (line 33) | @Override
    method equals (line 41) | @Override

FILE: java/lib/core/src/main/java/org/eclipse/tahu/mqtt/MqttServerUrl.java
  class MqttServerUrl (line 19) | public class MqttServerUrl {
    method MqttServerUrl (line 26) | public MqttServerUrl(String mqttServerUrl) throws TahuException {
    method MqttServerUrl (line 54) | public MqttServerUrl(String protocol, String fqdn, Integer port) throw...
    method getMqttServerUrlSafe (line 66) | public static MqttServerUrl getMqttServerUrlSafe(String mqttServerUrl) {
    method getMqttServerUrl (line 74) | public String getMqttServerUrl() {
    method getProtocol (line 78) | public String getProtocol() {
    method getFqdn (line 82) | public String getFqdn() {
    method getPort (line 86) | public Integer getPort() {
    method toString (line 90) | @Override
    method hashCode (line 95) | @Override
    method equals (line 103) | @Override

FILE: java/lib/core/src/main/java/org/eclipse/tahu/mqtt/RandomStartupDelay.java
  class RandomStartupDelay (line 19) | public class RandomStartupDelay {
    method RandomStartupDelay (line 28) | public RandomStartupDelay(String randomStartupDelayString) throws Tahu...
    method getRandomStartupDelayString (line 53) | public String getRandomStartupDelayString() {
    method getLow (line 57) | public long getLow() {
    method getHigh (line 61) | public long getHigh() {
    method isValid (line 65) | public boolean isValid() {
    method getRandomDelay (line 69) | public long getRandomDelay() {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/mqtt/TahuClient.java
  class TahuClient (line 46) | public class TahuClient implements MqttCallbackExtended {
    method TahuClient (line 144) | public TahuClient(final MqttClientId clientId, final MqttServerName mq...
    method TahuClient (line 166) | public TahuClient(final MqttClientId clientId, final MqttServerName mq...
    method TahuClient (line 176) | public TahuClient(final MqttClientId clientId, final MqttServerName mq...
    method setLifecycleProps (line 197) | private void setLifecycleProps(boolean useSparkplugStatePayload, Strin...
    method getMqttConnectOptions (line 210) | protected MqttConnectOptions getMqttConnectOptions() {
    method setMqttConnectOptions (line 214) | protected void setMqttConnectOptions(MqttConnectOptions connectOptions) {
    method getNumMesgsArrived (line 218) | public long getNumMesgsArrived() {
    method getMesgsArrivedDelta (line 222) | public long getMesgsArrivedDelta() {
    method clearMesgArrivedCount (line 229) | public void clearMesgArrivedCount() {
    method setMaxInflightMessages (line 234) | public void setMaxInflightMessages(int max) {
    method getMaxInflightMessages (line 238) | public int getMaxInflightMessages() {
    method setDoLatencyCheck (line 242) | public void setDoLatencyCheck(boolean state) {
    method getDoLatencyCheck (line 246) | public boolean getDoLatencyCheck() {
    method clearConnectionCount (line 250) | public void clearConnectionCount() {
    method incrementConnectionCount (line 254) | public void incrementConnectionCount() {
    method getConnectionCount (line 258) | public int getConnectionCount() {
    method getMqttServerUrl (line 262) | public MqttServerUrl getMqttServerUrl() {
    method getMqttServerName (line 266) | public MqttServerName getMqttServerName() {
    method getClientId (line 270) | public MqttClientId getClientId() {
    method getUsername (line 274) | public String getUsername() {
    method setUsername (line 278) | public void setUsername(String username) {
    method getPassword (line 282) | public String getPassword() {
    method setPassord (line 286) | public void setPassord(String password) {
    method getKeepAlive (line 290) | public int getKeepAlive() {
    method isCleanSession (line 294) | public boolean isCleanSession() {
    method getSubscriptions (line 298) | public Map<String, Integer> getSubscriptions() {
    method getMaxTopicsPerSubscribe (line 302) | public int getMaxTopicsPerSubscribe() {
    method setMaxTopicsPerSubscribe (line 306) | public void setMaxTopicsPerSubscribe(int maxTopicsPerSubscribe) {
    method getCallback (line 310) | public ClientCallback getCallback() {
    method setAutoReconnect (line 335) | public void setAutoReconnect(boolean autoReconnect) {
    method getAutoReconnect (line 339) | public boolean getAutoReconnect() {
    method getLwtTopic (line 343) | public String getLwtTopic() {
    method setLwtRetain (line 347) | public void setLwtRetain(boolean retain) {
    method getLwtRetain (line 351) | public boolean getLwtRetain() {
    method getLastStateDeathPayloadTimestamp (line 355) | public Long getLastStateDeathPayloadTimestamp() {
    method isConnected (line 359) | public boolean isConnected() {
    method isConnectedAndResubscribed (line 367) | public boolean isConnectedAndResubscribed() {
    method getConnectDuration (line 375) | public long getConnectDuration() throws TahuException {
    method getAvailability (line 393) | public double getAvailability() throws TahuException {
    method resetAvailability (line 410) | public void resetAvailability() {
    method getOnlineDateTime (line 420) | public Date getOnlineDateTime() {
    method renewOnlineDate (line 427) | public void renewOnlineDate() {
    method getOfflineDateTime (line 436) | public Date getOfflineDateTime() {
    method renewOfflineDate (line 443) | public void renewOfflineDate() {
    method publish (line 447) | public IMqttDeliveryToken publish(String topic, byte[] payload, int qo...
    method asyncPublish (line 464) | public void asyncPublish(String topic, byte[] payload, int qos, boolea...
    method asyncPublish (line 469) | public void asyncPublish(String topic, byte[] payload, int qos, boolea...
    method subscribe (line 484) | public int subscribe(String topic, int qos) throws TahuException {
    method subscribe (line 529) | public int[] subscribe(String[] topics, int[] qos) throws TahuException {
    method unsubscribe (line 576) | public void unsubscribe(String topic) throws TahuException {
    method connectionLost (line 593) | @Override
    method deliveryComplete (line 621) | @Override
    method messageArrived (line 633) | @Override
    method connect (line 643) | public void connect() {
    method isDisconnectInProgress (line 678) | public boolean isDisconnectInProgress() {
    method disconnect (line 687) | public void disconnect(long disconnectQuieseTime, long disconnectTimeo...
    method disconnect (line 697) | public void disconnect(long disconnectQuieseTime, long disconnectTimeo...
    method attemptConnect (line 791) | private IMqttToken attemptConnect(MqttAsyncClient client, MqttConnectO...
    class ConnectingState (line 846) | private class ConnectingState {
      method setInProgress (line 850) | protected void setInProgress(boolean inProgress) {
      method inProgress (line 854) | protected boolean inProgress() {
    class ConnectRunnable (line 863) | protected class ConnectRunnable implements Runnable {
      method ConnectRunnable (line 869) | public ConnectRunnable(final MqttCallback callback) {
      method stopConnectAttempts (line 873) | public void stopConnectAttempts() {
      method run (line 877) | @Override
    method attemptRecovery (line 1036) | private void attemptRecovery() {
    class AsyncPublisher (line 1058) | private class AsyncPublisher implements Runnable {
      method AsyncPublisher (line 1070) | public AsyncPublisher(String topic, byte[] payload, int qos, boolean...
      method run (line 1081) | @Override
    method shutdownConnectionMonitorThread (line 1115) | private void shutdownConnectionMonitorThread() {
    class ConnectionMonitorThread (line 1129) | private class ConnectionMonitorThread extends Thread {
      method ConnectionMonitorThread (line 1132) | public ConnectionMonitorThread(ConnectionMonitor connectionMonitor) {
      method shutdown (line 1137) | public void shutdown() {
    class ConnectionMonitor (line 1143) | private class ConnectionMonitor implements Runnable {
      method ConnectionMonitor (line 1149) | public ConnectionMonitor(MqttAsyncClient client, MqttClientId client...
      method setKeepRunning (line 1154) | public void setKeepRunning(boolean keepRunning) {
      method run (line 1158) | public void run() {
    method connectComplete (line 1201) | @Override
    method setTrackFirstConnection (line 1335) | public void setTrackFirstConnection(boolean trackFirstConnection) {
    method publishBirthMessage (line 1341) | public void publishBirthMessage() {
    method getConnectTime (line 1368) | private Date getConnectTime() {
    method getDisconnectTime (line 1372) | private Date getDisconnectTime() {
    method clearConnectTime (line 1376) | private void clearConnectTime() {
    method clearDisconnectTime (line 1380) | private void clearDisconnectTime() {
    method renewConnectTime (line 1384) | private void renewConnectTime() {
    method renewDisconnectTime (line 1388) | private void renewDisconnectTime() {
    method getConnectRetryInterval (line 1392) | private long getConnectRetryInterval() {
    method setConnectRetryInterval (line 1396) | public void setConnectRetryInterval(long connectRetryInterval) {
    method getConnectAttemptTimeout (line 1400) | private long getConnectAttemptTimeout() {
    method setConnectAttemptTimeout (line 1404) | public void setConnectAttemptTimeout(long connectAttemptTimeout) {
    method isAttemptingConnect (line 1408) | public boolean isAttemptingConnect() {
    method getErrorMessage (line 1412) | private String getErrorMessage(String prefix, Throwable throwable) {
    method getErrorMessage (line 1416) | private String getErrorMessage(Throwable throwable) {
    method logException (line 1425) | private void logException(String message, Throwable throwable) {
    method isLwtDeliveryComplete (line 1440) | private boolean isLwtDeliveryComplete() {

FILE: java/lib/core/src/main/java/org/eclipse/tahu/protobuf/SparkplugBProto.java
  class SparkplugBProto (line 6) | public final class SparkplugBProto {
    method SparkplugBProto (line 7) | private SparkplugBProto() {}
    method registerAllExtensions (line 8) | public static void registerAllExtensions(
    method registerAllExtensions (line 12) | public static void registerAllExtensions(
    type DataType (line 24) | public enum DataType
      method getNumber (line 350) | public final int getNumber() {
      method valueOf (line 357) | @java.lang.Deprecated
      method forNumber (line 362) | public static DataType forNumber(int value) {
      method internalGetValueMap (line 403) | public static com.google.protobuf.Internal.EnumLiteMap<DataType>
      method findValueByNumber (line 410) | public DataType findValueByNumber(int number) {
      method getValueDescriptor (line 415) | public final com.google.protobuf.Descriptors.EnumValueDescriptor
      method getDescriptorForType (line 419) | public final com.google.protobuf.Descriptors.EnumDescriptor
      method getDescriptor (line 423) | public static final com.google.protobuf.Descriptors.EnumDescriptor
      method valueOf (line 430) | public static DataType valueOf(
      method DataType (line 441) | private DataType(int value) {
    type PayloadOrBuilder (line 448) | public interface PayloadOrBuilder extends
      method hasTimestamp (line 460) | boolean hasTimestamp();
      method getTimestamp (line 468) | long getTimestamp();
      method getMetricsList (line 477) | java.util.List<org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Met...
      method getMetrics (line 486) | org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Metric getMetrics(...
      method getMetricsCount (line 494) | int getMetricsCount();
      method getMetricsOrBuilderList (line 502) | java.util.List<? extends org.eclipse.tahu.protobuf.SparkplugBProto.P...
      method getMetricsOrBuilder (line 511) | org.eclipse.tahu.protobuf.SparkplugBProto.Payload.MetricOrBuilder ge...
      method hasSeq (line 521) | boolean hasSeq();
      method getSeq (line 529) | long getSeq();
      method hasUuid (line 538) | boolean hasUuid();
      method getUuid (line 546) | java.lang.String getUuid();
      method getUuidBytes (line 554) | com.google.protobuf.ByteString
      method hasBody (line 564) | boolean hasBody();
      method getBody (line 572) | com.google.protobuf.ByteString getBody();
    class Payload (line 577) | public  static final class Payload extends
      method Payload (line 583) | private Payload(com.google.protobuf.GeneratedMessageV3.ExtendableBui...
      method Payload (line 586) | private Payload() {
      method getUnknownFields (line 594) | @java.lang.Override
      method Payload (line 599) | private Payload(
      method getDescriptor (line 667) | public static final com.google.protobuf.Descriptors.Descriptor
      method internalGetFieldAccessorTable (line 672) | protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      type TemplateOrBuilder (line 679) | public interface TemplateOrBuilder extends
        method hasVersion (line 691) | boolean hasVersion();
        method getVersion (line 699) | java.lang.String getVersion();
        method getVersionBytes (line 707) | com.google.protobuf.ByteString
        method getMetricsList (line 717) | java.util.List<org.eclipse.tahu.protobuf.SparkplugBProto.Payload.M...
        method getMetrics (line 726) | org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Metric getMetric...
        method getMetricsCount (line 734) | int getMetricsCount();
        method getMetricsOrBuilderList (line 742) | java.util.List<? extends org.eclipse.tahu.protobuf.SparkplugBProto...
        method getMetricsOrBuilder (line 751) | org.eclipse.tahu.protobuf.SparkplugBProto.Payload.MetricOrBuilder ...
        method getParametersList (line 757) | java.util.List<org.eclipse.tahu.protobuf.SparkplugBProto.Payload.T...
        method getParameters (line 762) | org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Template.Paramet...
        method getParametersCount (line 766) | int getParametersCount();
        method getParametersOrBuilderList (line 770) | java.util.List<? extends org.eclipse.tahu.protobuf.SparkplugBProto...
        method getParametersOrBuilder (line 775) | org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Template.Paramet...
        method hasTemplateRef (line 785) | boolean hasTemplateRef();
        method getTemplateRef (line 793) | java.lang.String getTemplateRef();
        method getTemplateRefBytes (line 801) | com.google.protobuf.ByteString
        method hasIsDefinition (line 807) | boolean hasIsDefinition();
        method getIsDefinition (line 811) | boolean getIsDefinition();
      class Template (line 816) | public  static final class Template extends
        method Template (line 822) | private Template(com.google.protobuf.GeneratedMessageV3.Extendable...
        method Template (line 825) | private Template() {
        method getUnknownFields (line 833) | @java.lang.Override
        method Template (line 838) | private Template(
        method getDescriptor (line 914) | public static final com.google.protobuf.Descriptors.Descriptor
        method internalGetFieldAccessorTable (line 919) | protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        type ParameterOrBuilder (line 926) | public interface ParameterOrBuilder extends
          method hasName (line 933) | boolean hasName();
          method getName (line 937) | java.lang.String getName();
          method getNameBytes (line 941) | com.google.protobuf.ByteString
          method hasType (line 947) | boolean hasType();
          method getType (line 951) | int getType();
          method hasIntValue (line 956) | boolean hasIntValue();
          method getIntValue (line 960) | int getIntValue();
          method hasLongValue (line 965) | boolean hasLongValue();
          method getLongValue (line 969) | long getLongValue();
          method hasFloatValue (line 974) | boolean hasFloatValue();
          method getFloatValue (line 978) | float getFloatValue();
          method hasDoubleValue (line 983) | boolean hasDoubleValue();
          method getDoubleValue (line 987) | double getDoubleValue();
          method hasBooleanValue (line 992) | boolean hasBooleanValue();
          method getBooleanValue (line 996) | boolean getBooleanValue();
          method hasStringValue (line 1001) | boolean hasStringValue();
          method getStringValue (line 1005) | java.lang.String getStringValue();
          method getStringValueBytes (line 1009) | com.google.protobuf.ByteString
          method hasExtensionValue (line 1015) | boolean hasExtensionValue();
          method getExtensionValue (line 1019) | org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Template.Param...
          method getExtensionValueOrBuilder (line 1023) | org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Template.Param...
          method getValueCase (line 1025) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Templat...
        class Parameter (line 1030) | public  static final class Parameter extends
          method Parameter (line 1035) | private Parameter(com.google.protobuf.GeneratedMessageV3.Builder...
          method Parameter (line 1038) | private Parameter() {
          method getUnknownFields (line 1043) | @java.lang.Override
          method Parameter (line 1048) | private Parameter(
          method getDescriptor (line 1139) | public static final com.google.protobuf.Descriptors.Descriptor
          method internalGetFieldAccessorTable (line 1144) | protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          type ParameterValueExtensionOrBuilder (line 1151) | public interface ParameterValueExtensionOrBuilder extends
          class ParameterValueExtension (line 1159) | public  static final class ParameterValueExtension extends
            method ParameterValueExtension (line 1165) | private ParameterValueExtension(com.google.protobuf.GeneratedM...
            method ParameterValueExtension (line 1168) | private ParameterValueExtension() {
            method getUnknownFields (line 1171) | @java.lang.Override
            method ParameterValueExtension (line 1176) | private ParameterValueExtension(
            method getDescriptor (line 1210) | public static final com.google.protobuf.Descriptors.Descriptor
            method internalGetFieldAccessorTable (line 1215) | protected com.google.protobuf.GeneratedMessageV3.FieldAccessor...
            method isInitialized (line 1223) | public final boolean isInitialized() {
            method writeTo (line 1236) | public void writeTo(com.google.protobuf.CodedOutputStream output)
            method getSerializedSize (line 1245) | public int getSerializedSize() {
            method equals (line 1257) | @java.lang.Override
            method hashCode (line 1274) | @java.lang.Override
            method parseFrom (line 1287) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method parseFrom (line 1292) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method parseFrom (line 1298) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method parseFrom (line 1302) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method parseFrom (line 1308) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method parseFrom (line 1313) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method parseDelimitedFrom (line 1320) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method parseDelimitedFrom (line 1325) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method parseFrom (line 1332) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method parseFrom (line 1338) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method newBuilderForType (line 1346) | public Builder newBuilderForType() { return newBuilder(); }
            method newBuilder (line 1347) | public static Builder newBuilder() {
            method newBuilder (line 1350) | public static Builder newBuilder(org.eclipse.tahu.protobuf.Spa...
            method toBuilder (line 1353) | public Builder toBuilder() {
            method newBuilderForType (line 1358) | @java.lang.Override
            class Builder (line 1367) | public static final class Builder extends
              method getDescriptor (line 1372) | public static final com.google.protobuf.Descriptors.Descriptor
              method internalGetFieldAccessorTable (line 1377) | protected com.google.protobuf.GeneratedMessageV3.FieldAccess...
              method Builder (line 1385) | private Builder() {
              method Builder (line 1389) | private Builder(
              method maybeForceBuilderInitialization (line 1394) | private void maybeForceBuilderInitialization() {
              method clear (line 1399) | public Builder clear() {
              method getDescriptorForType (line 1404) | public com.google.protobuf.Descriptors.Descriptor
              method getDefaultInstanceForType (line 1409) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Tem...
              method build (line 1413) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Tem...
              method buildPartial (line 1421) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Tem...
              method clone (line 1427) | public Builder clone() {
              method setField (line 1430) | public Builder setField(
              method clearField (line 1435) | public Builder clearField(
              method clearOneof (line 1439) | public Builder clearOneof(
              method setRepeatedField (line 1443) | public Builder setRepeatedField(
              method addRepeatedField (line 1448) | public Builder addRepeatedField(
              method setExtension (line 1453) | public <Type> Builder setExtension(
              method setExtension (line 1459) | public <Type> Builder setExtension(
              method addExtension (line 1465) | public <Type> Builder addExtension(
              method clearExtension (line 1471) | public <Type> Builder clearExtension(
              method mergeFrom (line 1476) | public Builder mergeFrom(com.google.protobuf.Message other) {
              method mergeFrom (line 1485) | public Builder mergeFrom(org.eclipse.tahu.protobuf.Sparkplug...
              method isInitialized (line 1493) | public final boolean isInitialized() {
              method mergeFrom (line 1500) | public Builder mergeFrom(
              method setUnknownFields (line 1517) | public final Builder setUnknownFields(
              method mergeUnknownFields (line 1522) | public final Builder mergeUnknownFields(
            method getDefaultInstance (line 1537) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method parsePartialFrom (line 1543) | public ParameterValueExtension parsePartialFrom(
            method parser (line 1551) | public static com.google.protobuf.Parser<ParameterValueExtensi...
            method getParserForType (line 1555) | @java.lang.Override
            method getDefaultInstanceForType (line 1560) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Templ...
          type ValueCase (line 1569) | public enum ValueCase
            method ValueCase (line 1580) | private ValueCase(int value) {
            method valueOf (line 1586) | @java.lang.Deprecated
            method forNumber (line 1591) | public static ValueCase forNumber(int value) {
            method getNumber (line 1604) | public int getNumber() {
          method getValueCase (line 1609) | public ValueCase
          method hasName (line 1620) | public boolean hasName() {
          method getName (line 1626) | public java.lang.String getName() {
          method getNameBytes (line 1643) | public com.google.protobuf.ByteString
          method hasType (line 1662) | public boolean hasType() {
          method getType (line 1668) | public int getType() {
          method hasIntValue (line 1676) | public boolean hasIntValue() {
          method getIntValue (line 1682) | public int getIntValue() {
          method hasLongValue (line 1693) | public boolean hasLongValue() {
          method getLongValue (line 1699) | public long getLongValue() {
          method hasFloatValue (line 1710) | public boolean hasFloatValue() {
          method getFloatValue (line 1716) | public float getFloatValue() {
          method hasDoubleValue (line 1727) | public boolean hasDoubleValue() {
          method getDoubleValue (line 1733) | public double getDoubleValue() {
          method hasBooleanValue (line 1744) | public boolean hasBooleanValue() {
          method getBooleanValue (line 1750) | public boolean getBooleanValue() {
          method hasStringValue (line 1761) | public boolean hasStringValue() {
          method getStringValue (line 1767) | public java.lang.String getStringValue() {
          method getStringValueBytes (line 1787) | public com.google.protobuf.ByteString
          method hasExtensionValue (line 1810) | public boolean hasExtensionValue() {
          method getExtensionValue (line 1816) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Templat...
          method getExtensionValueOrBuilder (line 1825) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Templat...
          method isInitialized (line 1833) | public final boolean isInitialized() {
          method writeTo (line 1848) | public void writeTo(com.google.protobuf.CodedOutputStream output)
          method getSerializedSize (line 1885) | public int getSerializedSize() {
          method equals (line 1935) | @java.lang.Override
          method hashCode (line 1999) | @java.lang.Override
          method parseFrom (line 2055) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseFrom (line 2060) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseFrom (line 2066) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseFrom (line 2070) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseFrom (line 2076) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseFrom (line 2081) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseDelimitedFrom (line 2088) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseDelimitedFrom (line 2093) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseFrom (line 2100) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseFrom (line 2106) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method newBuilderForType (line 2114) | public Builder newBuilderForType() { return newBuilder(); }
          method newBuilder (line 2115) | public static Builder newBuilder() {
          method newBuilder (line 2118) | public static Builder newBuilder(org.eclipse.tahu.protobuf.Spark...
          method toBuilder (line 2121) | public Builder toBuilder() {
          method newBuilderForType (line 2126) | @java.lang.Override
          class Builder (line 2135) | public static final class Builder extends
            method getDescriptor (line 2139) | public static final com.google.protobuf.Descriptors.Descriptor
            method internalGetFieldAccessorTable (line 2144) | protected com.google.protobuf.GeneratedMessageV3.FieldAccessor...
            method Builder (line 2152) | private Builder() {
            method Builder (line 2156) | private Builder(
            method maybeForceBuilderInitialization (line 2161) | private void maybeForceBuilderInitialization() {
            method clear (line 2166) | public Builder clear() {
            method getDescriptorForType (line 2177) | public com.google.protobuf.Descriptors.Descriptor
            method getDefaultInstanceForType (line 2182) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Templ...
            method build (line 2186) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Templ...
            method buildPartial (line 2194) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Templ...
            method clone (line 2237) | public Builder clone() {
            method setField (line 2240) | public Builder setField(
            method clearField (line 2245) | public Builder clearField(
            method clearOneof (line 2249) | public Builder clearOneof(
            method setRepeatedField (line 2253) | public Builder setRepeatedField(
            method addRepeatedField (line 2258) | public Builder addRepeatedField(
            method mergeFrom (line 2263) | public Builder mergeFrom(com.google.protobuf.Message other) {
            method mergeFrom (line 2272) | public Builder mergeFrom(org.eclipse.tahu.protobuf.SparkplugBP...
            method isInitialized (line 2322) | public final boolean isInitialized() {
            method mergeFrom (line 2331) | public Builder mergeFrom(
            method getValueCase (line 2350) | public ValueCase
            method clearValue (line 2356) | public Builder clearValue() {
            method hasName (line 2369) | public boolean hasName() {
            method getName (line 2375) | public java.lang.String getName() {
            method getNameBytes (line 2392) | public com.google.protobuf.ByteString
            method setName (line 2408) | public Builder setName(
            method clearName (line 2421) | public Builder clearName() {
            method setNameBytes (line 2430) | public Builder setNameBytes(
            method hasType (line 2445) | public boolean hasType() {
            method getType (line 2451) | public int getType() {
            method setType (line 2457) | public Builder setType(int value) {
            method clearType (line 2466) | public Builder clearType() {
            method hasIntValue (line 2476) | public boolean hasIntValue() {
            method getIntValue (line 2482) | public int getIntValue() {
            method setIntValue (line 2491) | public Builder setIntValue(int value) {
            method clearIntValue (line 2500) | public Builder clearIntValue() {
            method hasLongValue (line 2512) | public boolean hasLongValue() {
            method getLongValue (line 2518) | public long getLongValue() {
            method setLongValue (line 2527) | public Builder setLongValue(long value) {
            method clearLongValue (line 2536) | public Builder clearLongValue() {
            method hasFloatValue (line 2548) | public boolean hasFloatValue() {
            method getFloatValue (line 2554) | public float getFloatValue() {
            method setFloatValue (line 2563) | public Builder setFloatValue(float value) {
            method clearFloatValue (line 2572) | public Builder clearFloatValue() {
            method hasDoubleValue (line 2584) | public boolean hasDoubleValue() {
            method getDoubleValue (line 2590) | public double getDoubleValue() {
            method setDoubleValue (line 2599) | public Builder setDoubleValue(double value) {
            method clearDoubleValue (line 2608) | public Builder clearDoubleValue() {
            method hasBooleanValue (line 2620) | public boolean hasBooleanValue() {
            method getBooleanValue (line 2626) | public boolean getBooleanValue() {
            method setBooleanValue (line 2635) | public Builder setBooleanValue(boolean value) {
            method clearBooleanValue (line 2644) | public Builder clearBooleanValue() {
            method hasStringValue (line 2656) | public boolean hasStringValue() {
            method getStringValue (line 2662) | public java.lang.String getStringValue() {
            method getStringValueBytes (line 2684) | public com.google.protobuf.ByteString
            method setStringValue (line 2705) | public Builder setStringValue(
            method clearStringValue (line 2718) | public Builder clearStringValue() {
            method setStringValueBytes (line 2729) | public Builder setStringValueBytes(
            method hasExtensionValue (line 2745) | public boolean hasExtensionValue() {
            method getExtensionValue (line 2751) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Templ...
            method setExtensionValue (line 2767) | public Builder setExtensionValue(org.eclipse.tahu.protobuf.Spa...
            method setExtensionValue (line 2783) | public Builder setExtensionValue(
            method mergeExtensionValue (line 2797) | public Builder mergeExtensionValue(org.eclipse.tahu.protobuf.S...
            method clearExtensionValue (line 2819) | public Builder clearExtensionValue() {
            method getExtensionValueBuilder (line 2838) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Templ...
            method getExtensionValueOrBuilder (line 2844) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Templ...
            method getExtensionValueFieldBuilder (line 2857) | private com.google.protobuf.SingleFieldBuilderV3<
            method setUnknownFields (line 2875) | public final Builder setUnknownFields(
            method mergeUnknownFields (line 2880) | public final Builder mergeUnknownFields(
          method getDefaultInstance (line 2895) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parsePartialFrom (line 2901) | public Parameter parsePartialFrom(
          method parser (line 2909) | public static com.google.protobuf.Parser<Parameter> parser() {
          method getParserForType (line 2913) | @java.lang.Override
          method getDefaultInstanceForType (line 2918) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Templat...
        method hasVersion (line 2934) | public boolean hasVersion() {
        method getVersion (line 2944) | public java.lang.String getVersion() {
        method getVersionBytes (line 2965) | public com.google.protobuf.ByteString
        method getMetricsList (line 2988) | public java.util.List<org.eclipse.tahu.protobuf.SparkplugBProto.Pa...
        method getMetricsOrBuilderList (line 2998) | public java.util.List<? extends org.eclipse.tahu.protobuf.Sparkplu...
        method getMetricsCount (line 3009) | public int getMetricsCount() {
        method getMetrics (line 3019) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Metric ge...
        method getMetricsOrBuilder (line 3029) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.MetricOrB...
        method getParametersList (line 3039) | public java.util.List<org.eclipse.tahu.protobuf.SparkplugBProto.Pa...
        method getParametersOrBuilderList (line 3045) | public java.util.List<? extends org.eclipse.tahu.protobuf.Sparkplu...
        method getParametersCount (line 3052) | public int getParametersCount() {
        method getParameters (line 3058) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Template....
        method getParametersOrBuilder (line 3064) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Template....
        method hasTemplateRef (line 3078) | public boolean hasTemplateRef() {
        method getTemplateRef (line 3088) | public java.lang.String getTemplateRef() {
        method getTemplateRefBytes (line 3109) | public com.google.protobuf.ByteString
        method hasIsDefinition (line 3128) | public boolean hasIsDefinition() {
        method getIsDefinition (line 3134) | public boolean getIsDefinition() {
        method isInitialized (line 3139) | public final boolean isInitialized() {
        method writeTo (line 3164) | public void writeTo(com.google.protobuf.CodedOutputStream output)
        method getSerializedSize (line 3188) | public int getSerializedSize() {
        method equals (line 3218) | @java.lang.Override
        method hashCode (line 3254) | @java.lang.Override
        method parseFrom (line 3288) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Te...
        method parseFrom (line 3293) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Te...
        method parseFrom (line 3299) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Te...
        method parseFrom (line 3303) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Te...
        method parseFrom (line 3309) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Te...
        method parseFrom (line 3314) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Te...
        method parseDelimitedFrom (line 3321) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Te...
        method parseDelimitedFrom (line 3326) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Te...
        method parseFrom (line 3333) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Te...
        method parseFrom (line 3339) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Te...
        method newBuilderForType (line 3347) | public Builder newBuilderForType() { return newBuilder(); }
        method newBuilder (line 3348) | public static Builder newBuilder() {
        method newBuilder (line 3351) | public static Builder newBuilder(org.eclipse.tahu.protobuf.Sparkpl...
        method toBuilder (line 3354) | public Builder toBuilder() {
        method newBuilderForType (line 3359) | @java.lang.Override
        class Builder (line 3368) | public static final class Builder extends
          method getDescriptor (line 3373) | public static final com.google.protobuf.Descriptors.Descriptor
          method internalGetFieldAccessorTable (line 3378) | protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          method Builder (line 3386) | private Builder() {
          method Builder (line 3390) | private Builder(
          method maybeForceBuilderInitialization (line 3395) | private void maybeForceBuilderInitialization() {
          method clear (line 3402) | public Builder clear() {
          method getDescriptorForType (line 3425) | public com.google.protobuf.Descriptors.Descriptor
          method getDefaultInstanceForType (line 3430) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Templat...
          method build (line 3434) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Templat...
          method buildPartial (line 3442) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Templat...
          method clone (line 3481) | public Builder clone() {
          method setField (line 3484) | public Builder setField(
          method clearField (line 3489) | public Builder clearField(
          method clearOneof (line 3493) | public Builder clearOneof(
          method setRepeatedField (line 3497) | public Builder setRepeatedField(
          method addRepeatedField (line 3502) | public Builder addRepeatedField(
          method setExtension (line 3507) | public <Type> Builder setExtension(
          method setExtension (line 3513) | public <Type> Builder setExtension(
          method addExtension (line 3519) | public <Type> Builder addExtension(
          method clearExtension (line 3525) | public <Type> Builder clearExtension(
          method mergeFrom (line 3530) | public Builder mergeFrom(com.google.protobuf.Message other) {
          method mergeFrom (line 3539) | public Builder mergeFrom(org.eclipse.tahu.protobuf.SparkplugBPro...
          method isInitialized (line 3612) | public final boolean isInitialized() {
          method mergeFrom (line 3629) | public Builder mergeFrom(
          method hasVersion (line 3656) | public boolean hasVersion() {
          method getVersion (line 3666) | public java.lang.String getVersion() {
          method getVersionBytes (line 3687) | public com.google.protobuf.ByteString
          method setVersion (line 3707) | public Builder setVersion(
          method clearVersion (line 3724) | public Builder clearVersion() {
          method setVersionBytes (line 3737) | public Builder setVersionBytes(
          method ensureMetricsIsMutable (line 3750) | private void ensureMetricsIsMutable() {
          method getMetricsList (line 3767) | public java.util.List<org.eclipse.tahu.protobuf.SparkplugBProto....
          method getMetricsCount (line 3781) | public int getMetricsCount() {
          method getMetrics (line 3795) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Metric ...
          method setMetrics (line 3809) | public Builder setMetrics(
          method setMetrics (line 3830) | public Builder setMetrics(
          method addMetrics (line 3848) | public Builder addMetrics(org.eclipse.tahu.protobuf.SparkplugBPr...
          method addMetrics (line 3868) | public Builder addMetrics(
          method addMetrics (line 3889) | public Builder addMetrics(
          method addMetrics (line 3907) | public Builder addMetrics(
          method addAllMetrics (line 3925) | public Builder addAllMetrics(
          method clearMetrics (line 3944) | public Builder clearMetrics() {
          method removeMetrics (line 3961) | public Builder removeMetrics(int index) {
          method getMetricsBuilder (line 3978) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Metric....
          method getMetricsOrBuilder (line 3989) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.MetricO...
          method getMetricsOrBuilderList (line 4003) | public java.util.List<? extends org.eclipse.tahu.protobuf.Sparkp...
          method addMetricsBuilder (line 4018) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Metric....
          method addMetricsBuilder (line 4029) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Metric....
          method getMetricsBuilderList (line 4041) | public java.util.List<org.eclipse.tahu.protobuf.SparkplugBProto....
          method getMetricsFieldBuilder (line 4045) | private com.google.protobuf.RepeatedFieldBuilderV3<
          method ensureParametersIsMutable (line 4062) | private void ensureParametersIsMutable() {
          method getParametersList (line 4075) | public java.util.List<org.eclipse.tahu.protobuf.SparkplugBProto....
          method getParametersCount (line 4085) | public int getParametersCount() {
          method getParameters (line 4095) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Templat...
          method setParameters (line 4105) | public Builder setParameters(
          method setParameters (line 4122) | public Builder setParameters(
          method addParameters (line 4136) | public Builder addParameters(org.eclipse.tahu.protobuf.Sparkplug...
          method addParameters (line 4152) | public Builder addParameters(
          method addParameters (line 4169) | public Builder addParameters(
          method addParameters (line 4183) | public Builder addParameters(
          method addAllParameters (line 4197) | public Builder addAllParameters(
          method clearParameters (line 4212) | public Builder clearParameters() {
          method removeParameters (line 4225) | public Builder removeParameters(int index) {
          method getParametersBuilder (line 4238) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Templat...
          method getParametersOrBuilder (line 4245) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Templat...
          method getParametersOrBuilderList (line 4255) | public java.util.List<? extends org.eclipse.tahu.protobuf.Sparkp...
          method addParametersBuilder (line 4266) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Templat...
          method addParametersBuilder (line 4273) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Templat...
          method getParametersBuilderList (line 4281) | public java.util.List<org.eclipse.tahu.protobuf.SparkplugBProto....
          method getParametersFieldBuilder (line 4285) | private com.google.protobuf.RepeatedFieldBuilderV3<
          method hasTemplateRef (line 4308) | public boolean hasTemplateRef() {
          method getTemplateRef (line 4318) | public java.lang.String getTemplateRef() {
          method getTemplateRefBytes (line 4339) | public com.google.protobuf.ByteString
          method setTemplateRef (line 4359) | public Builder setTemplateRef(
          method clearTemplateRef (line 4376) | public Builder clearTemplateRef() {
          method setTemplateRefBytes (line 4389) | public Builder setTemplateRefBytes(
          method hasIsDefinition (line 4404) | public boolean hasIsDefinition() {
          method getIsDefinition (line 4410) | public boolean getIsDefinition() {
          method setIsDefinition (line 4416) | public Builder setIsDefinition(boolean value) {
          method clearIsDefinition (line 4425) | public Builder clearIsDefinition() {
          method setUnknownFields (line 4431) | public final Builder setUnknownFields(
          method mergeUnknownFields (line 4436) | public final Builder mergeUnknownFields(
        method getDefaultInstance (line 4451) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Te...
        method parsePartialFrom (line 4457) | public Template parsePartialFrom(
        method parser (line 4465) | public static com.google.protobuf.Parser<Template> parser() {
        method getParserForType (line 4469) | @java.lang.Override
        method getDefaultInstanceForType (line 4474) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Template ...
      type DataSetOrBuilder (line 4480) | public interface DataSetOrBuilder extends
        method hasNumOfColumns (line 4488) | boolean hasNumOfColumns();
        method getNumOfColumns (line 4492) | long getNumOfColumns();
        method getColumnsList (line 4497) | java.util.List<java.lang.String>
        method getColumnsCount (line 4502) | int getColumnsCount();
        method getColumns (line 4506) | java.lang.String getColumns(int index);
        method getColumnsBytes (line 4510) | com.google.protobuf.ByteString
        method getTypesList (line 4516) | java.util.List<java.lang.Integer> getTypesList();
        method getTypesCount (line 4520) | int getTypesCount();
        method getTypes (line 4524) | int getTypes(int index);
        method getRowsList (line 4529) | java.util.List<org.eclipse.tahu.protobuf.SparkplugBProto.Payload.D...
        method getRows (line 4534) | org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataSet.Row getR...
        method getRowsCount (line 4538) | int getRowsCount();
        method getRowsOrBuilderList (line 4542) | java.util.List<? extends org.eclipse.tahu.protobuf.SparkplugBProto...
        method getRowsOrBuilder (line 4547) | org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataSet.RowOrBui...
      class DataSet (line 4553) | public  static final class DataSet extends
        method DataSet (line 4559) | private DataSet(com.google.protobuf.GeneratedMessageV3.ExtendableB...
        method DataSet (line 4562) | private DataSet() {
        method getUnknownFields (line 4569) | @java.lang.Override
        method DataSet (line 4574) | private DataSet(
        method getDescriptor (line 4662) | public static final com.google.protobuf.Descriptors.Descriptor
        method internalGetFieldAccessorTable (line 4667) | protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        type DataSetValueOrBuilder (line 4674) | public interface DataSetValueOrBuilder extends
          method hasIntValue (line 4681) | boolean hasIntValue();
          method getIntValue (line 4685) | int getIntValue();
          method hasLongValue (line 4690) | boolean hasLongValue();
          method getLongValue (line 4694) | long getLongValue();
          method hasFloatValue (line 4699) | boolean hasFloatValue();
          method getFloatValue (line 4703) | float getFloatValue();
          method hasDoubleValue (line 4708) | boolean hasDoubleValue();
          method getDoubleValue (line 4712) | double getDoubleValue();
          method hasBooleanValue (line 4717) | boolean hasBooleanValue();
          method getBooleanValue (line 4721) | boolean getBooleanValue();
          method hasStringValue (line 4726) | boolean hasStringValue();
          method getStringValue (line 4730) | java.lang.String getStringValue();
          method getStringValueBytes (line 4734) | com.google.protobuf.ByteString
          method hasExtensionValue (line 4740) | boolean hasExtensionValue();
          method getExtensionValue (line 4744) | org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataSet.DataSe...
          method getExtensionValueOrBuilder (line 4748) | org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataSet.DataSe...
          method getValueCase (line 4750) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataSet...
        class DataSetValue (line 4755) | public  static final class DataSetValue extends
          method DataSetValue (line 4760) | private DataSetValue(com.google.protobuf.GeneratedMessageV3.Buil...
          method DataSetValue (line 4763) | private DataSetValue() {
          method getUnknownFields (line 4766) | @java.lang.Override
          method DataSetValue (line 4771) | private DataSetValue(
          method getDescriptor (line 4851) | public static final com.google.protobuf.Descriptors.Descriptor
          method internalGetFieldAccessorTable (line 4856) | protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          type DataSetValueExtensionOrBuilder (line 4863) | public interface DataSetValueExtensionOrBuilder extends
          class DataSetValueExtension (line 4871) | public  static final class DataSetValueExtension extends
            method DataSetValueExtension (line 4877) | private DataSetValueExtension(com.google.protobuf.GeneratedMes...
            method DataSetValueExtension (line 4880) | private DataSetValueExtension() {
            method getUnknownFields (line 4883) | @java.lang.Override
            method DataSetValueExtension (line 4888) | private DataSetValueExtension(
            method getDescriptor (line 4922) | public static final com.google.protobuf.Descriptors.Descriptor
            method internalGetFieldAccessorTable (line 4927) | protected com.google.protobuf.GeneratedMessageV3.FieldAccessor...
            method isInitialized (line 4935) | public final boolean isInitialized() {
            method writeTo (line 4948) | public void writeTo(com.google.protobuf.CodedOutputStream output)
            method getSerializedSize (line 4957) | public int getSerializedSize() {
            method equals (line 4969) | @java.lang.Override
            method hashCode (line 4986) | @java.lang.Override
            method parseFrom (line 4999) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method parseFrom (line 5004) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method parseFrom (line 5010) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method parseFrom (line 5014) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method parseFrom (line 5020) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method parseFrom (line 5025) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method parseDelimitedFrom (line 5032) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method parseDelimitedFrom (line 5037) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method parseFrom (line 5044) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method parseFrom (line 5050) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method newBuilderForType (line 5058) | public Builder newBuilderForType() { return newBuilder(); }
            method newBuilder (line 5059) | public static Builder newBuilder() {
            method newBuilder (line 5062) | public static Builder newBuilder(org.eclipse.tahu.protobuf.Spa...
            method toBuilder (line 5065) | public Builder toBuilder() {
            method newBuilderForType (line 5070) | @java.lang.Override
            class Builder (line 5079) | public static final class Builder extends
              method getDescriptor (line 5084) | public static final com.google.protobuf.Descriptors.Descriptor
              method internalGetFieldAccessorTable (line 5089) | protected com.google.protobuf.GeneratedMessageV3.FieldAccess...
              method Builder (line 5097) | private Builder() {
              method Builder (line 5101) | private Builder(
              method maybeForceBuilderInitialization (line 5106) | private void maybeForceBuilderInitialization() {
              method clear (line 5111) | public Builder clear() {
              method getDescriptorForType (line 5116) | public com.google.protobuf.Descriptors.Descriptor
              method getDefaultInstanceForType (line 5121) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Dat...
              method build (line 5125) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Dat...
              method buildPartial (line 5133) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Dat...
              method clone (line 5139) | public Builder clone() {
              method setField (line 5142) | public Builder setField(
              method clearField (line 5147) | public Builder clearField(
              method clearOneof (line 5151) | public Builder clearOneof(
              method setRepeatedField (line 5155) | public Builder setRepeatedField(
              method addRepeatedField (line 5160) | public Builder addRepeatedField(
              method setExtension (line 5165) | public <Type> Builder setExtension(
              method setExtension (line 5171) | public <Type> Builder setExtension(
              method addExtension (line 5177) | public <Type> Builder addExtension(
              method clearExtension (line 5183) | public <Type> Builder clearExtension(
              method mergeFrom (line 5188) | public Builder mergeFrom(com.google.protobuf.Message other) {
              method mergeFrom (line 5197) | public Builder mergeFrom(org.eclipse.tahu.protobuf.Sparkplug...
              method isInitialized (line 5205) | public final boolean isInitialized() {
              method mergeFrom (line 5212) | public Builder mergeFrom(
              method setUnknownFields (line 5229) | public final Builder setUnknownFields(
              method mergeUnknownFields (line 5234) | public final Builder mergeUnknownFields(
            method getDefaultInstance (line 5249) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payloa...
            method parsePartialFrom (line 5255) | public DataSetValueExtension parsePartialFrom(
            method parser (line 5263) | public static com.google.protobuf.Parser<DataSetValueExtension...
            method getParserForType (line 5267) | @java.lang.Override
            method getDefaultInstanceForType (line 5272) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataS...
          type ValueCase (line 5281) | public enum ValueCase
            method ValueCase (line 5292) | private ValueCase(int value) {
            method valueOf (line 5298) | @java.lang.Deprecated
            method forNumber (line 5303) | public static ValueCase forNumber(int value) {
            method getNumber (line 5316) | public int getNumber() {
          method getValueCase (line 5321) | public ValueCase
          method hasIntValue (line 5331) | public boolean hasIntValue() {
          method getIntValue (line 5337) | public int getIntValue() {
          method hasLongValue (line 5348) | public boolean hasLongValue() {
          method getLongValue (line 5354) | public long getLongValue() {
          method hasFloatValue (line 5365) | public boolean hasFloatValue() {
          method getFloatValue (line 5371) | public float getFloatValue() {
          method hasDoubleValue (line 5382) | public boolean hasDoubleValue() {
          method getDoubleValue (line 5388) | public double getDoubleValue() {
          method hasBooleanValue (line 5399) | public boolean hasBooleanValue() {
          method getBooleanValue (line 5405) | public boolean getBooleanValue() {
          method hasStringValue (line 5416) | public boolean hasStringValue() {
          method getStringValue (line 5422) | public java.lang.String getStringValue() {
          method getStringValueBytes (line 5442) | public com.google.protobuf.ByteString
          method hasExtensionValue (line 5465) | public boolean hasExtensionValue() {
          method getExtensionValue (line 5471) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataSet...
          method getExtensionValueOrBuilder (line 5480) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataSet...
          method isInitialized (line 5488) | public final boolean isInitialized() {
          method writeTo (line 5503) | public void writeTo(com.google.protobuf.CodedOutputStream output)
          method getSerializedSize (line 5534) | public int getSerializedSize() {
          method equals (line 5577) | @java.lang.Override
          method hashCode (line 5631) | @java.lang.Override
          method parseFrom (line 5679) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseFrom (line 5684) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseFrom (line 5690) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseFrom (line 5694) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseFrom (line 5700) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseFrom (line 5705) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseDelimitedFrom (line 5712) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseDelimitedFrom (line 5717) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseFrom (line 5724) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseFrom (line 5730) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method newBuilderForType (line 5738) | public Builder newBuilderForType() { return newBuilder(); }
          method newBuilder (line 5739) | public static Builder newBuilder() {
          method newBuilder (line 5742) | public static Builder newBuilder(org.eclipse.tahu.protobuf.Spark...
          method toBuilder (line 5745) | public Builder toBuilder() {
          method newBuilderForType (line 5750) | @java.lang.Override
          class Builder (line 5759) | public static final class Builder extends
            method getDescriptor (line 5763) | public static final com.google.protobuf.Descriptors.Descriptor
            method internalGetFieldAccessorTable (line 5768) | protected com.google.protobuf.GeneratedMessageV3.FieldAccessor...
            method Builder (line 5776) | private Builder() {
            method Builder (line 5780) | private Builder(
            method maybeForceBuilderInitialization (line 5785) | private void maybeForceBuilderInitialization() {
            method clear (line 5790) | public Builder clear() {
            method getDescriptorForType (line 5797) | public com.google.protobuf.Descriptors.Descriptor
            method getDefaultInstanceForType (line 5802) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataS...
            method build (line 5806) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataS...
            method buildPartial (line 5814) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataS...
            method clone (line 5849) | public Builder clone() {
            method setField (line 5852) | public Builder setField(
            method clearField (line 5857) | public Builder clearField(
            method clearOneof (line 5861) | public Builder clearOneof(
            method setRepeatedField (line 5865) | public Builder setRepeatedField(
            method addRepeatedField (line 5870) | public Builder addRepeatedField(
            method mergeFrom (line 5875) | public Builder mergeFrom(com.google.protobuf.Message other) {
            method mergeFrom (line 5884) | public Builder mergeFrom(org.eclipse.tahu.protobuf.SparkplugBP...
            method isInitialized (line 5926) | public final boolean isInitialized() {
            method mergeFrom (line 5935) | public Builder mergeFrom(
            method getValueCase (line 5954) | public ValueCase
            method clearValue (line 5960) | public Builder clearValue() {
            method hasIntValue (line 5972) | public boolean hasIntValue() {
            method getIntValue (line 5978) | public int getIntValue() {
            method setIntValue (line 5987) | public Builder setIntValue(int value) {
            method clearIntValue (line 5996) | public Builder clearIntValue() {
            method hasLongValue (line 6008) | public boolean hasLongValue() {
            method getLongValue (line 6014) | public long getLongValue() {
            method setLongValue (line 6023) | public Builder setLongValue(long value) {
            method clearLongValue (line 6032) | public Builder clearLongValue() {
            method hasFloatValue (line 6044) | public boolean hasFloatValue() {
            method getFloatValue (line 6050) | public float getFloatValue() {
            method setFloatValue (line 6059) | public Builder setFloatValue(float value) {
            method clearFloatValue (line 6068) | public Builder clearFloatValue() {
            method hasDoubleValue (line 6080) | public boolean hasDoubleValue() {
            method getDoubleValue (line 6086) | public double getDoubleValue() {
            method setDoubleValue (line 6095) | public Builder setDoubleValue(double value) {
            method clearDoubleValue (line 6104) | public Builder clearDoubleValue() {
            method hasBooleanValue (line 6116) | public boolean hasBooleanValue() {
            method getBooleanValue (line 6122) | public boolean getBooleanValue() {
            method setBooleanValue (line 6131) | public Builder setBooleanValue(boolean value) {
            method clearBooleanValue (line 6140) | public Builder clearBooleanValue() {
            method hasStringValue (line 6152) | public boolean hasStringValue() {
            method getStringValue (line 6158) | public java.lang.String getStringValue() {
            method getStringValueBytes (line 6180) | public com.google.protobuf.ByteString
            method setStringValue (line 6201) | public Builder setStringValue(
            method clearStringValue (line 6214) | public Builder clearStringValue() {
            method setStringValueBytes (line 6225) | public Builder setStringValueBytes(
            method hasExtensionValue (line 6241) | public boolean hasExtensionValue() {
            method getExtensionValue (line 6247) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataS...
            method setExtensionValue (line 6263) | public Builder setExtensionValue(org.eclipse.tahu.protobuf.Spa...
            method setExtensionValue (line 6279) | public Builder setExtensionValue(
            method mergeExtensionValue (line 6293) | public Builder mergeExtensionValue(org.eclipse.tahu.protobuf.S...
            method clearExtensionValue (line 6315) | public Builder clearExtensionValue() {
            method getExtensionValueBuilder (line 6334) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataS...
            method getExtensionValueOrBuilder (line 6340) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataS...
            method getExtensionValueFieldBuilder (line 6353) | private com.google.protobuf.SingleFieldBuilderV3<
            method setUnknownFields (line 6371) | public final Builder setUnknownFields(
            method mergeUnknownFields (line 6376) | public final Builder mergeUnknownFields(
          method getDefaultInstance (line 6391) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parsePartialFrom (line 6397) | public DataSetValue parsePartialFrom(
          method parser (line 6405) | public static com.google.protobuf.Parser<DataSetValue> parser() {
          method getParserForType (line 6409) | @java.lang.Override
          method getDefaultInstanceForType (line 6414) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataSet...
        type RowOrBuilder (line 6420) | public interface RowOrBuilder extends
          method getElementsList (line 6428) | java.util.List<org.eclipse.tahu.protobuf.SparkplugBProto.Payload...
          method getElements (line 6433) | org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataSet.DataSe...
          method getElementsCount (line 6437) | int getElementsCount();
          method getElementsOrBuilderList (line 6441) | java.util.List<? extends org.eclipse.tahu.protobuf.SparkplugBPro...
          method getElementsOrBuilder (line 6446) | org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataSet.DataSe...
        class Row (line 6452) | public  static final class Row extends
          method Row (line 6458) | private Row(com.google.protobuf.GeneratedMessageV3.ExtendableBui...
          method Row (line 6461) | private Row() {
          method getUnknownFields (line 6465) | @java.lang.Override
          method Row (line 6470) | private Row(
          method getDescriptor (line 6517) | public static final com.google.protobuf.Descriptors.Descriptor
          method internalGetFieldAccessorTable (line 6522) | protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          method getElementsList (line 6534) | public java.util.List<org.eclipse.tahu.protobuf.SparkplugBProto....
          method getElementsOrBuilderList (line 6540) | public java.util.List<? extends org.eclipse.tahu.protobuf.Sparkp...
          method getElementsCount (line 6547) | public int getElementsCount() {
          method getElements (line 6553) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataSet...
          method getElementsOrBuilder (line 6559) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataSet...
          method isInitialized (line 6565) | public final boolean isInitialized() {
          method writeTo (line 6584) | public void writeTo(com.google.protobuf.CodedOutputStream output)
          method getSerializedSize (line 6596) | public int getSerializedSize() {
          method equals (line 6612) | @java.lang.Override
          method hashCode (line 6631) | @java.lang.Override
          method parseFrom (line 6648) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseFrom (line 6653) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseFrom (line 6659) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseFrom (line 6663) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseFrom (line 6669) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseFrom (line 6674) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseDelimitedFrom (line 6681) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseDelimitedFrom (line 6686) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseFrom (line 6693) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parseFrom (line 6699) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method newBuilderForType (line 6707) | public Builder newBuilderForType() { return newBuilder(); }
          method newBuilder (line 6708) | public static Builder newBuilder() {
          method newBuilder (line 6711) | public static Builder newBuilder(org.eclipse.tahu.protobuf.Spark...
          method toBuilder (line 6714) | public Builder toBuilder() {
          method newBuilderForType (line 6719) | @java.lang.Override
          class Builder (line 6728) | public static final class Builder extends
            method getDescriptor (line 6733) | public static final com.google.protobuf.Descriptors.Descriptor
            method internalGetFieldAccessorTable (line 6738) | protected com.google.protobuf.GeneratedMessageV3.FieldAccessor...
            method Builder (line 6746) | private Builder() {
            method Builder (line 6750) | private Builder(
            method maybeForceBuilderInitialization (line 6755) | private void maybeForceBuilderInitialization() {
            method clear (line 6761) | public Builder clear() {
            method getDescriptorForType (line 6772) | public com.google.protobuf.Descriptors.Descriptor
            method getDefaultInstanceForType (line 6777) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataS...
            method build (line 6781) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataS...
            method buildPartial (line 6789) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataS...
            method clone (line 6805) | public Builder clone() {
            method setField (line 6808) | public Builder setField(
            method clearField (line 6813) | public Builder clearField(
            method clearOneof (line 6817) | public Builder clearOneof(
            method setRepeatedField (line 6821) | public Builder setRepeatedField(
            method addRepeatedField (line 6826) | public Builder addRepeatedField(
            method setExtension (line 6831) | public <Type> Builder setExtension(
            method setExtension (line 6837) | public <Type> Builder setExtension(
            method addExtension (line 6843) | public <Type> Builder addExtension(
            method clearExtension (line 6849) | public <Type> Builder clearExtension(
            method mergeFrom (line 6854) | public Builder mergeFrom(com.google.protobuf.Message other) {
            method mergeFrom (line 6863) | public Builder mergeFrom(org.eclipse.tahu.protobuf.SparkplugBP...
            method isInitialized (line 6897) | public final boolean isInitialized() {
            method mergeFrom (line 6909) | public Builder mergeFrom(
            method ensureElementsIsMutable (line 6930) | private void ensureElementsIsMutable() {
            method getElementsList (line 6943) | public java.util.List<org.eclipse.tahu.protobuf.SparkplugBProt...
            method getElementsCount (line 6953) | public int getElementsCount() {
            method getElements (line 6963) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataS...
            method setElements (line 6973) | public Builder setElements(
            method setElements (line 6990) | public Builder setElements(
            method addElements (line 7004) | public Builder addElements(org.eclipse.tahu.protobuf.Sparkplug...
            method addElements (line 7020) | public Builder addElements(
            method addElements (line 7037) | public Builder addElements(
            method addElements (line 7051) | public Builder addElements(
            method addAllElements (line 7065) | public Builder addAllElements(
            method clearElements (line 7080) | public Builder clearElements() {
            method removeElements (line 7093) | public Builder removeElements(int index) {
            method getElementsBuilder (line 7106) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataS...
            method getElementsOrBuilder (line 7113) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataS...
            method getElementsOrBuilderList (line 7123) | public java.util.List<? extends org.eclipse.tahu.protobuf.Spar...
            method addElementsBuilder (line 7134) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataS...
            method addElementsBuilder (line 7141) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataS...
            method getElementsBuilderList (line 7149) | public java.util.List<org.eclipse.tahu.protobuf.SparkplugBProt...
            method getElementsFieldBuilder (line 7153) | private com.google.protobuf.RepeatedFieldBuilderV3<
            method setUnknownFields (line 7167) | public final Builder setUnknownFields(
            method mergeUnknownFields (line 7172) | public final Builder mergeUnknownFields(
          method getDefaultInstance (line 7187) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload....
          method parsePartialFrom (line 7193) | public Row parsePartialFrom(
          method parser (line 7201) | public static com.google.protobuf.Parser<Row> parser() {
          method getParserForType (line 7205) | @java.lang.Override
          method getDefaultInstanceForType (line 7210) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataSet...
        method hasNumOfColumns (line 7222) | public boolean hasNumOfColumns() {
        method getNumOfColumns (line 7228) | public long getNumOfColumns() {
        method getColumnsList (line 7237) | public com.google.protobuf.ProtocolStringList
        method getColumnsCount (line 7244) | public int getColumnsCount() {
        method getColumns (line 7250) | public java.lang.String getColumns(int index) {
        method getColumnsBytes (line 7256) | public com.google.protobuf.ByteString
        method getTypesList (line 7266) | public java.util.List<java.lang.Integer>
        method getTypesCount (line 7273) | public int getTypesCount() {
        method getTypes (line 7279) | public int getTypes(int index) {
        method getRowsList (line 7288) | public java.util.List<org.eclipse.tahu.protobuf.SparkplugBProto.Pa...
        method getRowsOrBuilderList (line 7294) | public java.util.List<? extends org.eclipse.tahu.protobuf.Sparkplu...
        method getRowsCount (line 7301) | public int getRowsCount() {
        method getRows (line 7307) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataSet.R...
        method getRowsOrBuilder (line 7313) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataSet.R...
        method isInitialized (line 7319) | public final boolean isInitialized() {
        method writeTo (line 7338) | public void writeTo(com.google.protobuf.CodedOutputStream output)
        method getSerializedSize (line 7359) | public int getSerializedSize() {
        method equals (line 7396) | @java.lang.Override
        method hashCode (line 7424) | @java.lang.Override
        method parseFrom (line 7454) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Da...
        method parseFrom (line 7459) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Da...
        method parseFrom (line 7465) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Da...
        method parseFrom (line 7469) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Da...
        method parseFrom (line 7475) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Da...
        method parseFrom (line 7480) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Da...
        method parseDelimitedFrom (line 7487) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Da...
        method parseDelimitedFrom (line 7492) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Da...
        method parseFrom (line 7499) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Da...
        method parseFrom (line 7505) | public static org.eclipse.tahu.protobuf.SparkplugBProto.Payload.Da...
        method newBuilderForType (line 7513) | public Builder newBuilderForType() { return newBuilder(); }
        method newBuilder (line 7514) | public static Builder newBuilder() {
        method newBuilder (line 7517) | public static Builder newBuilder(org.eclipse.tahu.protobuf.Sparkpl...
        method toBuilder (line 7520) | public Builder toBuilder() {
        method newBuilderForType (line 7525) | @java.lang.Override
        class Builder (line 7534) | public static final class Builder extends
          method getDescriptor (line 7539) | public static final com.google.protobuf.Descriptors.Descriptor
          method internalGetFieldAccessorTable (line 7544) | protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          method Builder (line 7552) | private Builder() {
          method Builder (line 7556) | private Builder(
          method maybeForceBuilderInitialization (line 7561) | private void maybeForceBuilderInitialization() {
          method clear (line 7567) | public Builder clear() {
          method getDescriptorForType (line 7584) | public com.google.protobuf.Descriptors.Descriptor
          method getDefaultInstanceForType (line 7589) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataSet...
          method build (line 7593) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataSet...
          method buildPartial (line 7601) | public org.eclipse.tahu.protobuf.SparkplugBProto.Payload.DataSet...
          method clone (line 7633) | public Builder clone() {
          method setField (line 7636) | public Builder setField(
          method clearField (line 7641) | public Builder clearField(
          method clearOneof (line 7645) | public Builder clearOneof(
          method setRepeatedField (line 7649) | public Builder setRepeatedField(
          method addRepeatedField (line 7654) | public Builder addRepeatedField(
          method setExtension (line 7659) | public <Type> Builder setExtension(
          method setExtension (line 7665) | public <Type> Builder setExtension(
          method addExtension (line 7671) | public <Type> Builder addExtension(
          method clearExtension (line 7677) | public <Type> Builder clearExtension(
          method mergeFrom (line 7682) | public Builder mergeFrom(com.google.protobuf.Message other) {
          method mergeFrom (line 7691) | public Builder mergeFrom(org.eclipse.tahu.protobuf.SparkplugBPro...
          method isInitialized (line 7748) | public final boolean isInitialized() {
          method mergeFrom (line 7760) | public Builder mergeFrom(
          method hasNumOfColumns (line 7783) | public boolean hasNumOfColumns() {
          method getNumOfColumns (line 7789) | public long getNumOfColumns() {
          method setNumOfColumns (line 7795) | public Builder s
Condensed preview — 228 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,543K chars).
[
  {
    "path": ".gitignore",
    "chars": 249,
    "preview": "target/\nbin/\nnode_modules/\ntest-output/\nlicense/\ndependency-reduced-pom.xml\n.settings/\n.project\n.classpath\njavaClientId-"
  },
  {
    "path": "LICENCE",
    "chars": 14199,
    "preview": "Eclipse Public License - v 2.0\n\n    THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE\n    PUBLIC LICE"
  },
  {
    "path": "README.md",
    "chars": 2670,
    "preview": "# Eclipse Tahu\n\nEclipse Tahu provide client libraries and reference implementations in various languages and for various"
  },
  {
    "path": "RELEASE_NOTES.md",
    "chars": 272,
    "preview": "# Eclipse Tahu v1.0.0\n\n* Initial complete Java based Sparkplug v3.0.0 compatible implementation\n* Java based library for"
  },
  {
    "path": "about.html",
    "chars": 1794,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\"/>\n    <title>A"
  },
  {
    "path": "c/core/Makefile",
    "chars": 1392,
    "preview": "#/********************************************************************************\n# * Copyright (c) 2014-2019 Cirrus Li"
  },
  {
    "path": "c/core/include/pb.h",
    "chars": 38151,
    "preview": "/* Common parts of the nanopb library. Most of these are quite low-level\n * stuff. For the high-level interface, see pb_"
  },
  {
    "path": "c/core/include/pb_common.h",
    "chars": 1479,
    "preview": "/* pb_common.h: Common support functions for pb_encode.c and pb_decode.c.\n * These functions are rarely needed by applic"
  },
  {
    "path": "c/core/include/pb_decode.h",
    "chars": 7312,
    "preview": "/* pb_decode.h: Functions to decode protocol buffers. Depends on pb_decode.c.\n * The main function is pb_decode. You als"
  },
  {
    "path": "c/core/include/pb_encode.h",
    "chars": 6951,
    "preview": "/* pb_encode.h: Functions to encode protocol buffers. Depends on pb_encode.c.\n * The main function is pb_encode. You als"
  },
  {
    "path": "c/core/include/tahu.h",
    "chars": 17687,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2019 Cirrus Link"
  },
  {
    "path": "c/core/include/tahu.pb.h",
    "chars": 30767,
    "preview": "/* Automatically generated nanopb header */\n/* Generated by nanopb-0.4.1 */\n\n#ifndef PB_ORG_ECLIPSE_TAHU_PROTOBUF_TAHU_P"
  },
  {
    "path": "c/core/readme.txt",
    "chars": 844,
    "preview": "#/********************************************************************************\n# * Copyright (c) 2014-2019 Cirrus Li"
  },
  {
    "path": "c/core/src/pb_common.c",
    "chars": 10192,
    "preview": "/* pb_common.c: Common support functions for pb_encode.c and pb_decode.c.\n *\n * 2014 Petteri Aimonen <jpa@kapsi.fi>\n */\n"
  },
  {
    "path": "c/core/src/pb_decode.c",
    "chars": 53464,
    "preview": "/* pb_decode.c -- decode a protobuf using minimal resources\n *\n * 2011 Petteri Aimonen <jpa@kapsi.fi>\n */\n\n/* Use the GC"
  },
  {
    "path": "c/core/src/pb_encode.c",
    "chars": 28633,
    "preview": "/* pb_encode.c -- encode a protobuf using minimal resources\n *\n * 2011 Petteri Aimonen <jpa@kapsi.fi>\n */\n\n#include \"pb."
  },
  {
    "path": "c/core/src/tahu.c",
    "chars": 34939,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2019 Cirrus Link"
  },
  {
    "path": "c/core/src/tahu.pb.c",
    "chars": 2072,
    "preview": "/* Automatically generated nanopb constant definitions */\n/* Generated by nanopb-0.4.1 */\n\n#include \"tahu.pb.h\"\n#if PB_P"
  },
  {
    "path": "c/core/tahu.options",
    "chars": 1838,
    "preview": "org.eclipse.tahu.protobuf.Payload.body\t\t\t\t\ttype:FT_POINTER\norg.eclipse.tahu.protobuf.Payload.metrics\t\t\t\ttype:FT_POINTER\n"
  },
  {
    "path": "c/core/test/.gitignore",
    "chars": 35,
    "preview": "test_dynamic.dSYM\ntest_static.dSYM\n"
  },
  {
    "path": "c/core/test/test.c",
    "chars": 37858,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2019 Cirrus Link"
  },
  {
    "path": "c/core/test.sh",
    "chars": 833,
    "preview": "#/********************************************************************************\n# * Copyright (c) 2014-2019 Cirrus Li"
  },
  {
    "path": "c/examples/template_as_custom_props/Makefile",
    "chars": 1025,
    "preview": "#/********************************************************************************\n# * Copyright (c) 2014, 2018 Cirrus L"
  },
  {
    "path": "c/examples/template_as_custom_props/example.c",
    "chars": 21639,
    "preview": "/********************************************************************************\n * Copyright (c) 2014, 2018 Cirrus Lin"
  },
  {
    "path": "c/examples/udt_example/Makefile",
    "chars": 1025,
    "preview": "#/********************************************************************************\n# * Copyright (c) 2014, 2018 Cirrus L"
  },
  {
    "path": "c/examples/udt_example/example.c",
    "chars": 33445,
    "preview": "/********************************************************************************\n * Copyright (c) 2014, 2018 Cirrus Lin"
  },
  {
    "path": "c_sharp/core/readme.txt",
    "chars": 199,
    "preview": "# To generate the base protobuf sparkplug_b Java library\nprotoc --proto_path=../../ --csharp_out=src --csharp_opt=base_n"
  },
  {
    "path": "c_sharp/core/src/SparkplugBCSharp.cs",
    "chars": 167607,
    "preview": "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n// source: sparkplug_b/sparkplug_b_c_sharp.proto\n#pragma war"
  },
  {
    "path": "edl-v10.html",
    "chars": 1561,
    "preview": "Eclipse Distribution License - v 1.0\n\nCopyright (c) 2007, Eclipse Foundation, Inc. and its licensors.\n\nAll rights reserv"
  },
  {
    "path": "epl-v20.html",
    "chars": 17300,
    "preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmln"
  },
  {
    "path": "java/.gitignore",
    "chars": 35,
    "preview": "DEPENDENCIES\nexamples/DEPENDENCIES\n"
  },
  {
    "path": "java/README.md",
    "chars": 7522,
    "preview": "# Tahu Java Libraries and Implementations\n\nThese are the Java based Eclipse Sparkplug libraries, implementations, and ex"
  },
  {
    "path": "java/compat_impl/edge/pom.xml",
    "chars": 5180,
    "preview": "<!--/********************************************************************************\n * Copyright (c) 2014, 2018 Cirrus"
  },
  {
    "path": "java/compat_impl/edge/src/main/java/org/eclipse/tahu/edge/CommandCallback.java",
    "chars": 683,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/compat_impl/edge/src/main/java/org/eclipse/tahu/edge/CommandListener.java",
    "chars": 3522,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/compat_impl/edge/src/main/java/org/eclipse/tahu/edge/PeriodicPublisher.java",
    "chars": 2312,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/compat_impl/edge/src/main/java/org/eclipse/tahu/edge/SparkplugEdgeNode.java",
    "chars": 18895,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/compat_impl/edge/src/main/java/org/eclipse/tahu/edge/sim/DataSimulator.java",
    "chars": 2581,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/compat_impl/edge/src/main/java/org/eclipse/tahu/edge/sim/RandomDataSimulator.java",
    "chars": 22736,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/compat_impl/edge/src/main/resources/logback.xml",
    "chars": 494,
    "preview": "<configuration>\n\n  <appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n    <!-- encoders are assigned t"
  },
  {
    "path": "java/compat_impl/host/pom.xml",
    "chars": 4886,
    "preview": "<!--/********************************************************************************\n * Copyright (c) 2014, 2018 Cirrus"
  },
  {
    "path": "java/compat_impl/host/src/main/java/org/eclipse/tahu/host/CommandListener.java",
    "chars": 3362,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/compat_impl/host/src/main/java/org/eclipse/tahu/host/SparkplugHostApplication.java",
    "chars": 7898,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/compat_impl/host/src/main/resources/logback.out.xml",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "java/compat_impl/host/src/main/resources/logback.xml",
    "chars": 494,
    "preview": "<configuration>\n\n  <appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n    <!-- encoders are assigned t"
  },
  {
    "path": "java/examples/device_timestamp/THIRD-PARTY.txt",
    "chars": 675,
    "preview": "\nLists of 5 third-party dependencies.\n     (New BSD license) Protocol Buffer Java API (com.google.protobuf:protobuf-java"
  },
  {
    "path": "java/examples/device_timestamp/pom.xml",
    "chars": 3900,
    "preview": "<!--/********************************************************************************\n * Copyright (c) 2014, 2018 Cirrus"
  },
  {
    "path": "java/examples/device_timestamp/src/main/java/org/eclipse/tahu/SparkplugExample.java",
    "chars": 10110,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/examples/edge_node_control/pom.xml",
    "chars": 3920,
    "preview": "<!--/********************************************************************************\n * Copyright (c) 2014, 2018 Cirrus"
  },
  {
    "path": "java/examples/edge_node_control/src/main/java/org/eclipse/tahu/SparkplugExample.java",
    "chars": 5632,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/examples/host_file/THIRD-PARTY.txt",
    "chars": 675,
    "preview": "\nLists of 5 third-party dependencies.\n     (New BSD license) Protocol Buffer Java API (com.google.protobuf:protobuf-java"
  },
  {
    "path": "java/examples/host_file/pom.xml",
    "chars": 4032,
    "preview": "<!--/********************************************************************************\n * Copyright (c) 2014, 2018 Cirrus"
  },
  {
    "path": "java/examples/host_file/src/main/java/org/eclipse/tahu/example/host/file/FileAssembler.java",
    "chars": 14960,
    "preview": "/********************************************************************************\n * Copyright (c) 2020-2022 Cirrus Link"
  },
  {
    "path": "java/examples/host_file/src/main/java/org/eclipse/tahu/example/host/file/Publisher.java",
    "chars": 2269,
    "preview": "/********************************************************************************\n * Copyright (c) 2020-2022 Cirrus Link"
  },
  {
    "path": "java/examples/host_file/src/main/java/org/eclipse/tahu/example/host/file/SparkplugExample.java",
    "chars": 11071,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/examples/host_file/src/main/java/org/eclipse/tahu/example/host/file/model/EdgeNode.java",
    "chars": 2164,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/examples/host_file/src/main/java/org/eclipse/tahu/example/host/file/model/FilePublishStatus.java",
    "chars": 2698,
    "preview": "/********************************************************************************\n * Copyright (c) 2020-2022 Cirrus Link"
  },
  {
    "path": "java/examples/host_file/src/main/java/org/eclipse/tahu/example/host/file/util/FileValidationUtils.java",
    "chars": 2558,
    "preview": "/********************************************************************************\n * Copyright (c) 2020-2022 Cirrus Link"
  },
  {
    "path": "java/examples/listener/THIRD-PARTY.txt",
    "chars": 675,
    "preview": "\nLists of 5 third-party dependencies.\n     (New BSD license) Protocol Buffer Java API (com.google.protobuf:protobuf-java"
  },
  {
    "path": "java/examples/listener/pom.xml",
    "chars": 3999,
    "preview": "<!--/********************************************************************************\n * Copyright (c) 2014, 2018 Cirrus"
  },
  {
    "path": "java/examples/listener/src/main/java/org/eclipse/tahu/SparkplugListener.java",
    "chars": 3443,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/examples/listener/src/main/resources/log4j.properties",
    "chars": 867,
    "preview": "#/********************************************************************************\n# * Copyright (c) 2014, 2018 Cirrus L"
  },
  {
    "path": "java/examples/pom.xml",
    "chars": 8370,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--/****************************************************************************"
  },
  {
    "path": "java/examples/raspberry_pi/THIRD-PARTY.txt",
    "chars": 675,
    "preview": "\nLists of 5 third-party dependencies.\n     (New BSD license) Protocol Buffer Java API (com.google.protobuf:protobuf-java"
  },
  {
    "path": "java/examples/raspberry_pi/pom.xml",
    "chars": 4416,
    "preview": "<!--/********************************************************************************\n * Copyright (c) 2014, 2018 Cirrus"
  },
  {
    "path": "java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/SparkplugRaspberryPiExample.java",
    "chars": 30108,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pi/dio/DigitalOutputPin.java",
    "chars": 1530,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pi/dio/DioException.java",
    "chars": 826,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pi/dio/DioLibrary.java",
    "chars": 5723,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pi/dio/DioPin.java",
    "chars": 2154,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pi/dio/PinDirection.java",
    "chars": 644,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pi/dio/Pins.java",
    "chars": 1602,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pi/system/BoardModels.java",
    "chars": 3366,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pi/system/SystemInfo.java",
    "chars": 6392,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pi/system/SystemInfoException.java",
    "chars": 855,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pibrella/Pibrella.java",
    "chars": 3367,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pibrella/PibrellaButton.java",
    "chars": 1906,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pibrella/PibrellaBuzzer.java",
    "chars": 2713,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pibrella/PibrellaInputPin.java",
    "chars": 2268,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pibrella/PibrellaInputPins.java",
    "chars": 996,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pibrella/PibrellaLED.java",
    "chars": 2554,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pibrella/PibrellaLEDs.java",
    "chars": 972,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pibrella/PibrellaOutputPin.java",
    "chars": 2325,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pibrella/PibrellaOutputPins.java",
    "chars": 1003,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/examples/raspberry_pi/src/main/java/org/eclipse/tahu/pibrella/PibrellaPins.java",
    "chars": 2121,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/examples/records/THIRD-PARTY.txt",
    "chars": 675,
    "preview": "\nLists of 5 third-party dependencies.\n     (New BSD license) Protocol Buffer Java API (com.google.protobuf:protobuf-java"
  },
  {
    "path": "java/examples/records/pom.xml",
    "chars": 3889,
    "preview": "<!--/********************************************************************************\n * Copyright (c) 2014, 2018 Cirrus"
  },
  {
    "path": "java/examples/records/src/main/java/org/eclipse/tahu/SparkplugRecordsExample.java",
    "chars": 11061,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/examples/simple/THIRD-PARTY.txt",
    "chars": 675,
    "preview": "\nLists of 5 third-party dependencies.\n     (New BSD license) Protocol Buffer Java API (com.google.protobuf:protobuf-java"
  },
  {
    "path": "java/examples/simple/pom.xml",
    "chars": 3880,
    "preview": "<!--/********************************************************************************\n * Copyright (c) 2014, 2018 Cirrus"
  },
  {
    "path": "java/examples/simple/src/main/java/org/eclipse/tahu/SparkplugExample.java",
    "chars": 30905,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/examples/udt/pom.xml",
    "chars": 3886,
    "preview": "<!--/********************************************************************************\n * Copyright (c) 2014, 2018 Cirrus"
  },
  {
    "path": "java/examples/udt/src/main/java/org/eclipse/tahu/SparkplugExample.java",
    "chars": 14973,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/pom.xml",
    "chars": 3429,
    "preview": "<!--/********************************************************************************\n * Copyright (c) 2014, 2018 Cirrus"
  },
  {
    "path": "java/lib/core/readme.txt",
    "chars": 145,
    "preview": "# To generate the base protobuf sparkplug_b Java library\nprotoc --proto_path=../../ --java_out=src/main/java ../../spark"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/SparkplugException.java",
    "chars": 1101,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/SparkplugInvalidTypeException.java",
    "chars": 914,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/SparkplugParsingException.java",
    "chars": 1119,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/exception/TahuErrorCode.java",
    "chars": 782,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/exception/TahuException.java",
    "chars": 2335,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/json/DataSetDeserializer.java",
    "chars": 4236,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/json/DeserializerModifier.java",
    "chars": 1635,
    "preview": "/********************************************************************************\n * Copyright (c) 2017-2023 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/json/DeserializerModule.java",
    "chars": 1307,
    "preview": "/********************************************************************************\n * Copyright (c) 2017-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/json/FileSerializer.java",
    "chars": 1413,
    "preview": "/********************************************************************************\n * Copyright (c) 2017-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/json/JsonValidator.java",
    "chars": 2080,
    "preview": "/********************************************************************************\n * Copyright (c) 2017-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/json/MetricDeserializer.java",
    "chars": 2475,
    "preview": "/********************************************************************************\n * Copyright (c) 2013-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/json/PropertySetDeserializer.java",
    "chars": 1889,
    "preview": "/********************************************************************************\n * Copyright (c) 2023 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/json/TemplateDeserializer.java",
    "chars": 1861,
    "preview": "/********************************************************************************\n * Copyright (c) 2023 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/BdSeqManager.java",
    "chars": 1410,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/DefaultBdSeqManager.java",
    "chars": 2395,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/PayloadDecoder.java",
    "chars": 1105,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/PayloadEncoder.java",
    "chars": 967,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/SparkplugBPayloadDecoder.java",
    "chars": 24279,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/SparkplugBPayloadEncoder.java",
    "chars": 31749,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2023 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/DataSet.java",
    "chars": 9638,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/DataSetDataType.java",
    "chars": 2657,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/DeviceDescriptor.java",
    "chars": 3917,
    "preview": "/********************************************************************************\n * Copyright (c) 2020-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/EdgeNodeDescriptor.java",
    "chars": 3371,
    "preview": "/********************************************************************************\n * Copyright (c) 2017-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/File.java",
    "chars": 2396,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/Message.java",
    "chars": 2522,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/MessageType.java",
    "chars": 3217,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/MetaData.java",
    "chars": 9225,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/Metric.java",
    "chars": 16975,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/MetricDataType.java",
    "chars": 4726,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/Parameter.java",
    "chars": 3692,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/ParameterDataType.java",
    "chars": 3473,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/Property.java",
    "chars": 1144,
    "preview": "/*\n * Licensed Materials - Property of Cirrus Link Solutions\n * Copyright (c) 2022 Cirrus Link Solutions LLC - All Right"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/PropertyDataType.java",
    "chars": 3746,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/PropertySet.java",
    "chars": 5113,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/PropertyValue.java",
    "chars": 3043,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/Quality.java",
    "chars": 756,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/Row.java",
    "chars": 3152,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/SparkplugBPayload.java",
    "chars": 8858,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/SparkplugBPayloadMap.java",
    "chars": 12897,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/SparkplugDescriptor.java",
    "chars": 1581,
    "preview": "/********************************************************************************\n * Copyright (c) 2020-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/SparkplugMeta.java",
    "chars": 1739,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/StatePayload.java",
    "chars": 2497,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/Template.java",
    "chars": 7738,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/TemplateMap.java",
    "chars": 8382,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/Topic.java",
    "chars": 9323,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/message/model/Value.java",
    "chars": 2626,
    "preview": "/********************************************************************************\n * Copyright (c) 2014-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/model/MetricDataTypeMap.java",
    "chars": 1938,
    "preview": "/********************************************************************************\n * Copyright (c) 2023 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/model/MetricMap.java",
    "chars": 4436,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/model/MqttServerDefinition.java",
    "chars": 1929,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/mqtt/ClientCallback.java",
    "chars": 1160,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/mqtt/MqttClientId.java",
    "chars": 3032,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/mqtt/MqttOperatorDefs.java",
    "chars": 833,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/mqtt/MqttServerName.java",
    "chars": 1428,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/mqtt/MqttServerUrl.java",
    "chars": 3124,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/mqtt/RandomStartupDelay.java",
    "chars": 2247,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/mqtt/TahuClient.java",
    "chars": 47160,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/protobuf/SparkplugBProto.java",
    "chars": 754088,
    "preview": "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n// source: sparkplug_b/sparkplug_b.proto\n\npackage org.eclips"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/util/CompressionAlgorithm.java",
    "chars": 809,
    "preview": "/********************************************************************************\n * Copyright (c) 2017-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/util/GZipUtil.java",
    "chars": 2022,
    "preview": "/********************************************************************************\n * Copyright (c) 2018-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/util/MessageUtil.java",
    "chars": 18782,
    "preview": "/********************************************************************************\n * Copyright (c) 2017-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/util/PayloadUtil.java",
    "chars": 7786,
    "preview": "/********************************************************************************\n * Copyright (c) 2017-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/util/SparkplugUtil.java",
    "chars": 2474,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/util/TopicUtil.java",
    "chars": 3486,
    "preview": "/********************************************************************************\n * Copyright (c) 2016-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/java/org/eclipse/tahu/util/ValidationUtils.java",
    "chars": 5565,
    "preview": "/********************************************************************************\n * Copyright (c) 2017-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/main/resources/logback.xml",
    "chars": 494,
    "preview": "<configuration>\n\n  <appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n    <!-- encoders are assigned t"
  },
  {
    "path": "java/lib/core/src/main/resources/payload.json",
    "chars": 4782,
    "preview": "{\n    \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n    \"title\": \"Sparkplug B Payload\",\n    \"description\": \"A Sp"
  },
  {
    "path": "java/lib/core/src/test/java/org/eclipse/tahu/message/test/EnDeCodeTest.java",
    "chars": 3164,
    "preview": "/*\n * Licensed Materials - Property of Cirrus Link Solutions\n * Copyright (c) 2023 Cirrus Link Solutions LLC - All Right"
  },
  {
    "path": "java/lib/core/src/test/java/org/eclipse/tahu/mqtt/test/MqttServerUrlTest.java",
    "chars": 1436,
    "preview": "/*\n * Licensed Materials - Property of Cirrus Link Solutions\n * Copyright (c) 2023 Cirrus Link Solutions LLC - All Right"
  },
  {
    "path": "java/lib/core/src/test/java/org/eclipse/tahu/test/SequenceTest.java",
    "chars": 2173,
    "preview": "/*\n * Licensed Materials - Property of Cirrus Link Solutions\n * Copyright (c) 2022 Cirrus Link Solutions LLC - All Right"
  },
  {
    "path": "java/lib/core/src/test/java/org/eclipse/tahu/test/SparkplugTest.java",
    "chars": 22738,
    "preview": "/********************************************************************************\n * Copyright (c) 2016-2022 Cirrus Link"
  },
  {
    "path": "java/lib/core/src/test/java/org/eclipse/tahu/util/MessageUtilTest.java",
    "chars": 2935,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/core/src/test/java/org/eclipse/tahu/util/PayloadUtilTest.java",
    "chars": 3566,
    "preview": "/********************************************************************************\n * Copyright (c) 2016-2022 Cirrus Link"
  },
  {
    "path": "java/lib/edge/pom.xml",
    "chars": 3264,
    "preview": "<!--/********************************************************************************\n * Copyright (c) 2014, 2018 Cirrus"
  },
  {
    "path": "java/lib/edge/src/main/java/org/eclipse/tahu/edge/EdgeClient.java",
    "chars": 21168,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/edge/src/main/java/org/eclipse/tahu/edge/EdgeNodeMetricMaps.java",
    "chars": 5601,
    "preview": "/********************************************************************************\n * Copyright (c) 2023 Cirrus Link Solu"
  },
  {
    "path": "java/lib/edge/src/main/java/org/eclipse/tahu/edge/api/MetricHandler.java",
    "chars": 1695,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/host/pom.xml",
    "chars": 3264,
    "preview": "<!--/********************************************************************************\n * Copyright (c) 2014, 2018 Cirrus"
  },
  {
    "path": "java/lib/host/src/main/java/org/eclipse/tahu/host/CommandPublisher.java",
    "chars": 940,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/host/src/main/java/org/eclipse/tahu/host/HostApplication.java",
    "chars": 8234,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/host/src/main/java/org/eclipse/tahu/host/TahuHostCallback.java",
    "chars": 9692,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/host/src/main/java/org/eclipse/tahu/host/TahuPayloadHandler.java",
    "chars": 22081,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/host/src/main/java/org/eclipse/tahu/host/api/HostApplicationEventHandler.java",
    "chars": 2211,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/host/src/main/java/org/eclipse/tahu/host/manager/EdgeNodeManager.java",
    "chars": 3171,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/host/src/main/java/org/eclipse/tahu/host/manager/MetricManager.java",
    "chars": 1793,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/host/src/main/java/org/eclipse/tahu/host/manager/SparkplugDevice.java",
    "chars": 2839,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/host/src/main/java/org/eclipse/tahu/host/manager/SparkplugEdgeNode.java",
    "chars": 5745,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/host/src/main/java/org/eclipse/tahu/host/model/HostApplicationMetricMap.java",
    "chars": 5539,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/host/src/main/java/org/eclipse/tahu/host/model/HostMetric.java",
    "chars": 1761,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/host/src/main/java/org/eclipse/tahu/host/model/MessageContext.java",
    "chars": 2011,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/host/src/main/java/org/eclipse/tahu/host/seq/SequenceReorderContext.java",
    "chars": 2340,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/host/src/main/java/org/eclipse/tahu/host/seq/SequenceReorderManager.java",
    "chars": 12641,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/lib/host/src/main/java/org/eclipse/tahu/host/seq/SequenceReorderMap.java",
    "chars": 5559,
    "preview": "/********************************************************************************\n * Copyright (c) 2022 Cirrus Link Solu"
  },
  {
    "path": "java/pom.xml",
    "chars": 8558,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--/****************************************************************************"
  },
  {
    "path": "javascript/core/node-red-contrib-sparkplug/README.md",
    "chars": 5947,
    "preview": "node-red-contrib-sparkplug\n=========\n\nA node for an MQTT Edge Node client for MQTT device communication using the\nSparkp"
  },
  {
    "path": "javascript/core/node-red-contrib-sparkplug/package.json",
    "chars": 796,
    "preview": "{\n  \"name\": \"node-red-contrib-sparkplug\",\n  \"version\": \"2.1.1\",\n  \"description\": \"A Sparkplug node for Node-RED\",\n  \"lic"
  },
  {
    "path": "javascript/core/node-red-contrib-sparkplug/sparkplug/sparkplug.html",
    "chars": 4870,
    "preview": "<!--\n/********************************************************************************\n * Copyright (c) 2014, 2018 Cirru"
  },
  {
    "path": "javascript/core/node-red-contrib-sparkplug/sparkplug/sparkplug.js",
    "chars": 9721,
    "preview": "/********************************************************************************\n * Copyright (c) 2016, 2018 Cirrus Lin"
  },
  {
    "path": "javascript/core/node-red-contrib-sparkplug-payload/README.md",
    "chars": 908,
    "preview": "node-red-contrib-sparkplug-payload\n=========\n\nA node that provides tools for encoding and decoding payload objects and \n"
  },
  {
    "path": "javascript/core/node-red-contrib-sparkplug-payload/package.json",
    "chars": 906,
    "preview": "{\n  \"name\": \"node-red-contrib-sparkplug-payload\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A node that provides tools for"
  },
  {
    "path": "javascript/core/node-red-contrib-sparkplug-payload/sparkplug-payload.html",
    "chars": 834,
    "preview": "<script type=\"text/javascript\">\r\n    RED.nodes.registerType('sparkplug-payload',{\r\n        category: 'function',\r\n      "
  },
  {
    "path": "javascript/core/node-red-contrib-sparkplug-payload/sparkplug-payload.js",
    "chars": 1170,
    "preview": "const sparkplug = require(\"sparkplug-payload\");\r\nconst Payload = sparkplug.get(\"spBv1.0\");\r\n\r\nmodule.exports = (RED) => "
  },
  {
    "path": "javascript/core/sparkplug-client/.gitignore",
    "chars": 48,
    "preview": "index.d.ts\nindex.js\nindex.js.map\nindex.d.ts.map\n"
  },
  {
    "path": "javascript/core/sparkplug-client/LICENSE",
    "chars": 14199,
    "preview": "Eclipse Public License - v 2.0\n\n    THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE\n    PUBLIC LICE"
  },
  {
    "path": "javascript/core/sparkplug-client/README.md",
    "chars": 14063,
    "preview": "Sparkplug Client\n=========\n\nA client library providing a MQTT client for MQTT device communication using\nthe Sparkplug S"
  },
  {
    "path": "javascript/core/sparkplug-client/index.ts",
    "chars": 17521,
    "preview": "/**\n * Copyright (c) 2016-2017 Cirrus Link Solutions\n *\n *  All rights reserved. This program and the accompanying mater"
  }
]

// ... and 28 more files (download for full content)

About this extraction

This page contains the full source code of the eclipse/tahu GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 228 files (2.3 MB), approximately 615.0k tokens, and a symbol index with 3709 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!