[
  {
    "path": ".gitignore",
    "content": ".idea/\n.state/\nbuild/\nlogs/\ncmake-build-debug/\ncmake-build-release/\nscripts/bluzelle_pb2.py\nscripts/database_pb2.py\nscripts/audit_pb2.py\nscripts/pbft_pb2.py\nscripts/status_pb2.py\n*.pyc\n*.pem\n"
  },
  {
    "path": ".travis.yml",
    "content": "sudo: false\nlanguage: cpp\n\nenv:\n  global:\n    - PROJECT_VERSION_MAJOR=\"0\"\n    - PROJECT_VERSION_MINOR=\"7\"\n    - PROJECT_VERSION_PATCH=\"${TRAVIS_BUILD_NUMBER}\"\n    - PROJECT_VERSION=\"${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}\"\n    - PACKAGE_ARCHITECTURE=\"amd64\"\n    - PACKAGE_NAME=\"bluzelle-swarmdb\"\n    - PACKAGE_NAME_DEB=\"${PACKAGE_NAME}_${PROJECT_VERSION}_${PACKAGE_ARCHITECTURE}.deb\"\n    - PACKAGE_NAME_OSX=\"${PACKAGE_NAME}_${PROJECT_VERSION}_darwin_${PACKAGE_ARCHITECTURE}.tar.gz\"\n    - secure: \"vF3zRyPiUm+VOVAq1y6TDGqr5s2XYk7In6Zh8LbX0VNv6ROQ7HEwusbO6tuR4I0Og0m59RplQd3oAr3nxLMN/85YQw1vvVbc+TC1wIenM15bfEgCKjTsiFbIEf7fPgUyqVg/YLGSEsskcXiFrfb5IyFmAj+v37u0N56u4B3/ga82e5RIXvu641z1Ex2sS0L/MhN4TOluI/5ASeg/D6QHKVx59HiX/PjOkWbCKY10p5CzbXgNyik37NrI1ZKnLTtYFCznuPeXpt4Vx0YdCLOaJw4uG2ay2CjayOmOvXlNWb9iHXL5EveovptDhSSqAJjzy+MqwnrjJHsciOBHX2efpeCpSBx6tGw9e8bi6Xg3MJvdPjEcfKoAWBG2MdJUAdGk48eduvdPqnx/Ig7//ez9aYLgbXaac3k09N5SeyPZuRE2mnQoXNcO2ApL3NfOAJ/3WRtFo/scgu8rBfEZrIqy2BAgnOK86TYZwIR1CabQgPDClY9XddcZ+PBQ4a+j/CqDTcjdYR5I7ABV4nPgCU2rheKEhKMv8yw4kFl5U6wFUOtkEdxFJk3+d8oxHPrQf0CDFKovkSEcMzEgcJE1DsVLNzNPlE9y12+Rsopt/fcCNqSvyl22XaI7O9UnE/j+Y2ATlydB+6olEvOEd02K9WYuVUotyeBu4bB8sY0V4VDREUI=\"\n    - secure: \"Z4h7T0uHpz3WLtX93NckznB/FujL7LncaZdxJQ5DrWOtIpUJA7REix8oMDyTaXqhsksX5x24CdxuArmFkgE5G1xJK7sIgI7R6RlDG0shRyfMBWaB0Olbsxq9FiZb11Cmguq2ANoPdwFj53BwSjLs+8QW7wWx2NE4TF0JWWNBVVi1hcX5cPc2xW8oEy7657mxCTq6/G8upOonMRHmiB3M+u9Xn0Sv7+SCmtkFw6uUSGfRRkwwRl0haf0qwlOg6o6Aihen0zFEM/Rf3imx5JhyxtlW6KQBG8WZOmv2gQ9AXD9sAZG4H52Klr81QIhKrzlQNEoLvPtkhqTFXCGlBRH7bBXbCYRFYhvm8j1ja2tM46wZHwdIx5gtUqLk5+PcNdFEO335003GeOPewzayk44WWkPQyHPkNLTLAnLJawKkSDsLsWIokl0BGz5m2O08GBoohTd0LaOQrEi3npI92s6OasxPh9wcCwYYwGT5WqLmnKc6XRpI5I+RFN6yjPYCYUwgCd5LVkOG5hpvg8tTYG63gxshPJWSWv5yObMPppmObnpQNjPOdw63m9cpnevo2DbGLZsHedDyqMGhjZnn3CG8ZlRQvdPLo56l2gFRxhw8J2xnk1C2ffil8C9IjiTLBK+Y5ALd17BuI40ZA+ClRHy8Z6MFXgMfFlr/YBrUtY3tvGg=\"\n    - secure: \"Hp7Ww6XhkZvzOsktsaL8lyiMbXLP3u/Entj7UXomywDr7gMIAyoIiD122bZ1Wa+sbNfnNd8lKS1AZxMtwxbhAK9hcB6ZvypAE3i4pfoQWxd4jq3pXltJ2oLbXEWzH1aGcTtibf2vI6WBpI8mPGWrykBeQfCzd0qs6t5pNzeA43ta77WCADWJivxe69l4rqxUGmXZVbGzApUgn5UP7FTscuByitQm6KPft63sre6aSC1P9FKWD4VOFlDqol3v+Bsmn05bNc9a/UuLq/C6vSa6BxsJpalMIRtlXE+MRXVpYxnBNS1UlH+8LA6txG3fwisyvwXG5KjO4tDuVLIYzuK1+TBCCnFBbTJ+2aCZ9iR7sA34A+AUbF2JyTfGtR4RnOd2cMgGuWgn1ASoe2c5GE45aK/s+ijDsKpzzHl8gR3QJS7yd0U/KCgnW3bsq4mRq95sjA/5MZuS2gmIpMS0JoprLmjXikZLI3LDQc8VHqK5U2ne/W7xZyszc57IlJI6HiL2v2yw25m8/yna7PXyAYFPsZ8LRzoZJvq/uBVh8sAnhpgMfQ5FxOuJGvhH56UjvcXqIYfz1a4ELIl8b2rLq6M1qUWYHwlTq8xHHhWShQBpfEiZQBncD0+K7LO7KhJb78sqJcbMFcgsWooKqlsElGQwK92BUkECRu8eC4n8uaaJ/GM=\"\n    - secure: \"D3BGFKFKHDG0ajTpvEAP7poQmOvSUq2l7jG9q7hK+xHDRKBhM7YfSUJicz5H358VBKURoURLbykq3WXw/gpzTSVqpusXJ4UjGiAZLRXHlTsyXW0IVGvXXPx53SiJkHbfVC/3MK22rzV9LYR3wxEt7k9xKLfRGBr+tAiTzi/ikox/4ibIx6cb0PQGrVTbeoSJfJfF6VQvzeaoST7K9CREJGb9PuLpiXPRt0CIeY5Y1r7+HCJSzO2XWX+8i+DpMB7ZItQjrt09vaoDoUS5WPxL92+S8nrWNH++LhEzvq1PTtZs0bQkLHG+zfrM/5j2Q34HP6QZceVSixMzEz2l9wE0lZI5d21udnh1CApbaZvHHvLuR7cvZGv6VCNZefZhKTsDAs+GRMYLhZgauqxnOxug0ZO8ErLHJ0K87l/U0krBUCtMTO5FPodEPahXVOe9UXlBnl8FFhihQ4VB23TXWbFy0qa1M1iCV3jT27hpDHCmPuD5KwGWzDITrnaC0+YzQpmOuZKLB/wlQdJD7XmRkV3OCye1ejwFpwCD1SMJLZBTd4rReAgxxgT4f0xq/IuoGORvAXYDbZeYNrISYrxN8u6LAAc56IDQ7F8nZO/l85gPZaSrkzL4zeuDhWsMr/SBysBL2XlwhL9iSYHWEhgr67hJVOzVUqpMCH6nr2Y8hc4cK1w=\"\n\nmatrix:\n  include:\n    - os: linux\n      dist: xenial\n      addons:\n        apt:\n          sources:\n            - ubuntu-toolchain-r-test\n            - sourceline: 'deb [trusted=yes] http://ppa.launchpad.net/maarten-fonville/protobuf/ubuntu xenial main'\n          packages:\n            - g++-7\n            - pkg-config\n            - protobuf-compiler\n            - libprotobuf-dev\n            - libsnappy-dev\n            - libbz2-dev\n      env:\n        - MATRIX_EVAL=\"CC=gcc-7 && CXX=g++-7\"\n        - CMAKE_URL=\"https://cmake.org/files/v3.12/cmake-3.12.1-Linux-x86_64.tar.gz\"\n        - CMAKE_COMMAND=\"$HOME/.local/bin/cmake -DPMD_EXE=$HOME/pmd-bin-6.6.0/bin/run.sh ${CMAKE_OPTIONS}\"\n\ncache:\n  directories:\n    - $HOME/.local\n\nbefore_install:\n    - eval \"${MATRIX_EVAL}\"\n    - mkdir -p $HOME/.local\n    - |\n      pip install --user cpp-coveralls\n      if [ ! -e $HOME/.local/bin/cmake ]; then\n        echo \"CMake not found in the cache, get and extract it...\"\n        travis_retry curl -L ${CMAKE_URL} \\\n          | tar -xz -C $HOME/.local --strip-components=1\n      else\n        echo \"Using cached CMake\"\n      fi\n    - |\n      if [ ! -e $HOME/pmd-bin-6.6.0/bin/run.sh ]; then\n        echo \"PMD not found in the cache, get and extract it...\"\n        cd $HOME\n        travis_retry curl -OL \"https://github.com/pmd/pmd/releases/download/pmd_releases%2F6.6.0/pmd-bin-6.6.0.zip\"\n        unzip pmd-bin-6.6.0.zip\n        rm pmd-bin-6.6.0.zip\n      else\n        echo \"Using cached PMD\"\n      fi\n\ncompiler:\n  - gcc\n\nbefore_script:\n  - cd ${TRAVIS_BUILD_DIR}\n  - mkdir build\n  - cd build\n  - >\n    if { [ \"$TRAVIS_BRANCH\" = \"master\" ] || [[ $TRAVIS_BRANCH == *\"release\"* ]]; } && [ $TRAVIS_OS_NAME = \"linux\" ] ; then\n      ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=RelWithDebInfo -DPROJECT_VERSION_MAJOR=${PROJECT_VERSION_MAJOR} -DPROJECT_VERSION_MINOR=${PROJECT_VERSION_MINOR} -DPROJECT_VERSION_PATCH=${PROJECT_VERSION_PATCH} ..\n    else\n      ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug -DENABLE_GCOV=ON -DPROJECT_VERSION_MAJOR=${PROJECT_VERSION_MAJOR} -DPROJECT_VERSION_MINOR=${PROJECT_VERSION_MINOR} -DPROJECT_VERSION_PATCH=${PROJECT_VERSION_PATCH} ..\n    fi\n\nscript:\n  - ${CXX} --version\n  - echo CXXFLAGS=${CXXFLAGS}\n  - git lfs install\n  - git lfs pull\n  - make -j2\n  - make static_analysis\n  - ctest\n  - make package\n\nafter_success:\n  - coveralls -r ${TRAVIS_BUILD_DIR} -e 'build/boost' -e 'build/openssl' -e 'build/rocksdb' -e 'build/jsoncpp' -e 'build/googletest' -e 'build/proto' -e 'build/CMakeFiles' -e 'build/swarm_version.hpp' -e 'audit/test' -e 'bootstrap/test' -e 'chaos/test' -e 'crud/test' -e 'crypto/test' -e 'ethereum/test' -e 'http/test' -e 'mocks' -e 'node/test' -e 'options/test' -e 'pbft/test' -e 'status/test' -e 'storage/test' -e 'swarm' -e 'include' -e 'utils/test' --gcov-options '\\-lp'\n  - echo ${TRAVIS_BRANCH}\n  - if [ \"$TRAVIS_BRANCH\" = \"master\" ] ; then PACKAGE_COMPONENT=\"stable\" ; else PACKAGE_COMPONENT=\"unstable\" ; fi\n  - |\n    if [ \"$TRAVIS_BRANCH\" = \"master\" ] || [ \"$TRAVIS_BRANCH\" = \"devel\" ] || [[ $TRAVIS_BRANCH == *\"release\"* ]]; then\n      travis_retry curl -u${REPO_USER}:${REPO_PASSWORD} -XPUT \"https://bluzelle.jfrog.io/bluzelle/debian-local/pool/${PACKAGE_NAME_DEB};deb.distribution=all;deb.component=${PACKAGE_COMPONENT};deb.architecture=${PACKAGE_ARCHITECTURE}\" -T ${TRAVIS_BUILD_DIR}/build/${PACKAGE_NAME_DEB}\n    fi\n    if [ \"$TRAVIS_BRANCH\" = \"master\" ] ; then\n      git lfs fetch --all\n      git tag ${PROJECT_VERSION}\n      git remote add origin-swarm https://${GITHUB_TOKEN}@github.com/bluzelle/swarmdb.git > /dev/null 2>&1\n      git push --quiet --set-upstream origin-swarm ${TRAVIS_BRANCH} --tags\n    fi\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.10)\n\nproject(bluzelle CXX)\n\n# ensure type is set\nif (NOT CMAKE_BUILD_TYPE)\n    set(CMAKE_BUILD_TYPE Debug)\nendif()\n\ninclude(cmake/swarm_version.cmake)\n\nmessage(\"Build version ${PROJECT_VERSION}\")\n\n# Setup version header\nconfigure_file(${PROJECT_SOURCE_DIR}/cmake/swarm_version.hpp.in ${CMAKE_BINARY_DIR}/swarm_version.hpp.tmp)\nexecute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/swarm_version.hpp.tmp ${CMAKE_BINARY_DIR}/swarm_version.hpp)\nexecute_process(COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_BINARY_DIR}/swarm_version.hpp.tmp)\ninclude_directories(${CMAKE_BINARY_DIR}) # hides path bug!\n\n# use ccache if available...\nfind_program(CCACHE_FOUND ccache)\nif(CCACHE_FOUND)\n    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)\n    set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)\nendif(CCACHE_FOUND)\n\n# output dir\nset(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/output)\n\n# compiler options...\nset(CMAKE_CXX_STANDARD 17)\nadd_compile_options(\"-fdiagnostics-color=auto\")\n\nadd_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)\n\n# todo: remove -Wno-implicit-fallthrough once CI moves past gcc 7.4.0...\nset(warnings \"-Wall -Wextra -Werror -Wpedantic -Wno-implicit-fallthrough\")\nif (APPLE)\n    set(warnings \"${warnings} -Wno-invalid-offsetof\")\nelse()\n    # for beast and gcc release builds...\n    if(\"${CMAKE_BUILD_TYPE}\" STREQUAL \"Release\")\n        set(warnings \"${warnings} -Wno-maybe-uninitialized\")\n    endif()\n\n    # todo: these may no longer be required...\n    if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 9.2)\n        message(STATUS \"GCC ${CMAKE_CXX_COMPILER_VERSION} warning workaround: -Wno-deprecated-copy -Wno-sign-compare (Still needed?)\")\n        set(warnings \"${warnings} -Wno-deprecated-copy -Wno-sign-compare\")\n    endif()\nendif()\n\nset(CMAKE_CXX_FLAGS ${warnings})\n\n# old or new way?\nif(NOT BUILD_DEPEND)\n    add_subdirectory(depend)\nelse()\n    include(cmake/boost.cmake)\n    include(cmake/rocksdb.cmake)\n    include(cmake/jsoncpp.cmake)\n    include(cmake/googletest.cmake)\n    include(cmake/openssl.cmake)\nendif()\n\n# find packages\ninclude(cmake/add_gmock_test.cmake)\n\nset(Protobuf_USE_STATIC_LIBS ON)\ninclude(FindProtobuf)\nfind_package(Protobuf REQUIRED)\n\ninclude_directories(${CMAKE_CURRENT_SOURCE_DIR})\ninclude_directories(SYSTEM ${PROTOBUF_INCLUDE_DIR})\n\nenable_testing()\n\n# coverage?\nif (ENABLE_GCOV)\n    if (NOT APPLE)\n        set(COVERAGE_COMPILER_FLAGS \"-g -O0 --coverage -fprofile-arcs -ftest-coverage\" CACHE INTERNAL \"\")\n        set(CMAKE_C_FLAGS   \"${CMAKE_C_FLAGS}   ${COVERAGE_COMPILER_FLAGS}\")\n        set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}\")\n        message(STATUS \"Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}\")\n    endif()\nendif()\n\nadd_subdirectory(proto)\n\nset(BLUZELLE_STD_INCLUDES ${Boost_INCLUDE_DIRS} ${GTEST_INCLUDE_DIR} ${JSONCPP_INCLUDE_DIRS} ${OPENSSL_INCLUDE_DIR} ${PROTO_INCLUDE_DIRS} ${ROCKSDB_INCLUDE_DIRS})\n\nadd_subdirectory(peers_beacon)\nadd_subdirectory(crud)\nadd_subdirectory(node)\nadd_subdirectory(options)\nadd_subdirectory(pkg)\nadd_subdirectory(status)\nadd_subdirectory(storage)\nadd_subdirectory(swarm)\nadd_subdirectory(utils)\nadd_subdirectory(audit)\nadd_subdirectory(pbft)\nadd_subdirectory(chaos)\nadd_subdirectory(crypto)\nadd_subdirectory(monitor)\nadd_subdirectory(mocks)\nadd_subdirectory(policy)\n\ninclude(cmake/static_analysis.cmake)\n\n# git commit used to build\nadd_custom_command(\n    OUTPUT  swarm_git_commit\n    COMMENT \"Generating swarm_git_commit.hpp\"\n    COMMAND ${CMAKE_COMMAND}\n    -D PROJECT_SOURCE_DIR=${CMAKE_SOURCE_DIR}\n    -D PROJECT_BINARY_DIR=${CMAKE_BINARY_DIR}\n    -P ${CMAKE_SOURCE_DIR}/cmake/git_commit.cmake\n    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}\n)\n\nadd_custom_target(swarm-git-commit ALL DEPENDS swarm_git_commit)\n\n# enable valgrind for CI...\nif(ENABLE_MEMCHECK)\n    # todo: add to CI: ctest --test-action memcheck\n    if(NOT APPLE)\n        set(MEMORYCHECK_SUPPRESSIONS_FILE ${PROJECT_SOURCE_DIR}/valgrind/bluzelle.supp)\n        set(VALGRIND_COMMAND_OPTIONS \"--error-exitcode=1 --leak-check=full --show-reachable=yes --error-limit=no --gen-suppressions=all\")\n        include(CTest)\n    endif()\nendif()\n"
  },
  {
    "path": "CONTRIBUTOR.md",
    "content": "# Contributing to Bluzelle\n\nWelcome to wanting to contribute to Bluzelle! Thank you for taking your time to contribute. \n\nThe following is a set of guidelines for contributing to the Bluzelle ecosystem (this includes swarmDB, the drivers, and more). These are of course mostly just guidelines, not rules. Feel free to use your best judgement, and you can always contribute proposals to change this guide via a pull request!\n\n#### Table Of Contents\n\n[Code of Conduct](#code-of-conduct)\n[The Quick Start Guide](#the-quick-start-guide)\n[Getting Started](#getting-started)\n[How Can I Contribute?](#how-can-icontribute)\n[Coding Style Guide](#coding-style-guide)\n\n## Code of Conduct\n\nThis project and its participants are governed by the [Bluzelle Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project, you are expected to uphold the code. Report unacceptable behaviour to [opensource@bluzelle.com](mailto:opensource@bluzelle.com).\n\nThe general idea here is that you should be **respectful**, **positive** and **considerate**. When asking questions, please be **patient** for a response, **specific** in what you are asking, and always think **collaboratively**. You are reminded that you should not **spam**, post links to sites that violate our Terms of Use, or post third party advertisements. \n\n## The Quick Start Guide\n\nJoin our community resources:\n* [mailing list](https://groups.google.com/forum/#!forum/bluzelle) - this is the Google group where Bluzelle developers discuss development plans. Users are also encourage to ask questions here. You can either subscribe to the list, or read it as a forum.\n* [Gitter](https://gitter.im/bluzelle) - if chat is something you prefer, and you're looking for answers quicker, get to the Bluzelle Gitter community. We have several rooms and you could post to the Lobby or anywhere you feel is appropriate. Remember though that you *may* not get answers immediately, as the Bluzelle project is distributed worldwide, and it might take some time for you to get an answer. Please be patient.\n\n## Getting Started\n\nBluzelle is growing to be a large open source project. There are many repositories on [GitHub](http://github.com/bluzelle) and it is a good idea to familiarise yourself with them.\n\n* [bluzelle/swarmDB](https://github.com/bluzelle/swarmDB) - this is the core Bluzelle decentralised database.\n\nDo pay attention to the branches within swarmDB as there are plenty!\n\n### Client Libraries\n* [pyBluzelle](https://github.com/bluzelle/pyBluzelle) - this is the Python client library for Bluzelle swarmDB.\n* [swarmclient-js](https://github.com/bluzelle/swarmclient-js) - this is the JavaScript client library for Bluzelle swarmDB.\n* [bluzelle-php](https://github.com/bluzelle/bluzelle-php) - this is the PHP client library for Bluzelle swarmDB.\n* [swarmclient-rb](https://github.com/bluzelle/swarmclient-rb) - this is the Ruby client library for Bluzelle swarmDB.\n\n## How Can I Contribute?\n\n### How to report bugs\n\nThe Swarmdb project is tracking issues within github issues. If you find a bug within the software or documentation please open a new [issue](https://github.com/bluzelle/swarmDB/issues). Your bug will be placed on our backlog and addressed based on priotiry.\n\n### How do I suggest enhancements?\n\nEnhancements can be requested in two ways. \n\n1. Like bugs you can open a new [issue](https://github.com/bluzelle/swarmDB/issues)\n2. More proactively you can make the code or documentation change and submit it as a pull request\n\n### Making your first code contribution\n\n### Branching Model\nBasic standards will be in place across all Bluzelle repositories that are based off the [Git Flow model](https://datasift.github.io/gitflow/IntroducingGitFlow.html). Below you will find a description of each branch and it’s intended purpose.\n\n#### Devel\n\n**Branch**: Devel\n\n**Purpose**: The Devel branch the official integration branch. \n\n**Perquisite for commits**: Merges to this branch are by pull request only and must pass the Travis Build and have at least one code review. Any committer can merge a pull request once the above requisites are satisfied. Only squash merges are allowed in this branch.\n\n**Tags**: None\n\n**Build artifacts**: Build automation may push to an “unstable” repository for testing\n\n#### Master\n\n**Branch**: Master\n\n**Purpose**: Master will ***ONLY*** have commits related to official releases (major, minor and patch). \n\n**Prerequisite for commit**: Merges to this branch are by pull request only and must pass the Travis Build and have at least one code review. ONLY official branch owners can merge a pull request. Only merges are allowed on this branch.\n\n**Tags**: `${major}-${minor}-${TRAVIS-BUILD}`\n\n**Build artifacts**: Build automation must push to an official repo either public or the Bluzelle artifactory repositories\n\n\n#### Feature Branch\n\n**Branch**: `/task/${username}/${taskname}`\n\n**Purpose**: This is a feature branch and is meant to last for the duration of feature development. There is no implication of stability in a feature branch and developers have absolute freedom on what happens within these branches. After merging to the devel branch the feature branch is deleted. \n\n**Prerequisite for commit**: None\n\n**Tags**: None\n\n**Build artifacts**: None\n\n#### Commit Messages\nCommit messages must follow the basic structure in the example provided below. An “issuekey” may be either a GitHub Issue or Jira Issue. Commit messages will contain a single line description of the change, followed by a more in depth description of the commit. \n\nExample:\n\n~~~~\n${issuekey} This is a one line commit message\n\nThis is a longer commit paragraph for more detail. It may also contain bullet points:\n\nfeature change 1\nfeature change 2\nside effect 1\n~~~~\n\n\n### Pull requests and signing the Bluzelle Contributor License Agreement (CLA)\nOnce you have submitted a pull request, you will also have to sign the Bluzelle Contributor License Agreement (CLA). This is done automatically, as long as you have a GitHub account, and submit the pull request. Without signing the CLA, your contribution cannot be accepted and there will be no review for the pull request to get it merged. \n\nWe use an automated platform to track digital signatures tied to your GitHub username. \n\n## Coding Style Guide\n\nUse this document as a guideline, if you don't find what you need here please contact a Bluzelle employee with your comments or suggestions. \nAnother great resource is the Google C++ Style guide (https://google.github.io/styleguide/cppguide.html)\n\n### Project Layout\n\n    * CMake is used to generate a build environment. (ie. makefiles, xcode project etc.)\n    * Source and test file naming is based on the class being defined/tested:\n\n        ex. node module\n        node\n        ├── CMakeLists.txt\n        ├── node_base.hpp\n        ├── node.cpp\n        ├── node.hpp\n        ├── session_base.hpp\n        ├── session.cpp\n        ├── session.hpp\n        └── test\n            ├── CMakeLists.txt\n            ├── node_test.cpp\n            └── session_test.cpp\n\n\n### Code style\n\n    * Write your code as though you are writing it for publication. \n    * Your code should compile with no warnings using the C++ 17 flag.\n    * Allman coding style using 4 space characters for indentation. (https://en.wikipedia.org/wiki/Indentation_style#Allman_style)\n    * Try to limit line length to 120 characters. Continuation of code should be the next line with one indentation level.\n    * Header files should use newer \"#pragma once\" instead of traditional #ifdef guard macros.\n    * Source and test file naming is based on the class being defined/tested: \n\n        class this_is_an_example: \n        {\n            ...\n            this_is_an_example.hpp\n            this_is_an_example.cpp\n            this_is_an_example_test.cpp\n\n    * When modifying existing code continue the style that it was created to maintain consistency.\n    * Function/method definitions should have return type on a separate line:\n\n        bool\n        class::method()\n        {\n           ...\n           return true;\n        }\n\n    * Use #include<cstdint> for POD types such as uint32_t, uint64_t etc.\n    * Do not use \"auto\" for POD types\n    * Use auto for types that can not be defined or are rather verbose such as a lambda or an iterator.\n    * Use snake case for class & variable naming:\n\n        class this_is_snake_case\n        { \n            ...\n\n    variables:\n\n         uint32_t widget_count;\n\n    * Class layout should be public, protected & private:\n\n        class foo\n        {\n        public:\n        \n            // initialization list layout example...\n            foo(uint32_t foo_counter, uint32_t max_widgets)\n                : foo_counter(foo_counter)\n                , max_widgets(max_widgets)\n            {\n            }\n\n        private:\n        \n            uint32_t foo_counter = 0; // prefer class initialization of variable if not passed through constructor\n            const uin32_t max_widgets;\n        };\n\n    * Constructor layout should align with the first parameter:\n        \n        foo::foo(unsigned int age,\n                 float weight_in_tonnes,\n                 string name,\n                 string city,\n                 string country)\n               : this->age(age)\n               , this->weight_in_tonnes(weight_in_tonnes)\n               , this->name(name)\n               , this->city(city)\n               , this->country(country)\n        {\n            ...\n        }\n        \n    * Do not use Hungarian notation.\n    * Class and variable names should be descriptive; avoid abbreviation unless using a standard nomenclature such as TCP, UDP, HTTP & CURL.\n    * Code within namespace should be indented\n    * Even single lines of code for conditionals and loops should be enclosed by braces. \n    \n        switch(my_value)\n        {\n            case MY_CONST_GLOBAL:\n            {\n                ...\n            }\n            break;\n            \n            default:\n            {\n                ...\n            }\n            break;\n        }\n                   \n    * When using multiple levels of namespaces use c++17's syntax:\n\n        namespace bzn::utils\n        {\n            class ....\n\n    * Use \"using namespace\" sparingly and only where you should follow the DRY principle.\n    * Use Test Driven Development\n    * Use CI's code coverage reporting to help identify untested code and exception cases\n    * Create a mockable interface class to help test code that would require complex setup or dependencies such as a server\n\n        class foo_base\n        {\n        public:\n            virtual ~foo_base() = default;\n            void function_one() const = 0;\n            ...\n            \n    * Do not use dynamic cast unless there is a very compelling reason\n    * Const casts are not to be used under any circumstances\n    * Reinterpret casts are only to be used in situations where “void” pointers are being upcast\n    * Const should be used in every place it can be used. For example, imagine the following function get_window in some class prototype: \n        \n        const Window* get_window(const Foo* const some_variable_name) const\n    \n    * Derived classes from an interface should be marked as final unless the intent is to use it as a base class.\n    * Use references everywhere applicable for function parameters.\n    * Globals will be declared const within an unnamed namespace\n    \n        namespace\n        {\n            const uint32_t MY_CONST_GLOBAL = 1337;\n        }\n        \n    * As a fundamental principle, there should be no entropy whatsoever in the code.Some common examples of entropy include the use of static initialization where the order of instantiation is often non-deterministic.\n    * Variable names must CLEARLY describe the type and usage\n    * Use std::shared_ptr & std::unique_ptr instead of raw pointers.\n    * Use const where possible (functions & variables)\n    * Do not use typedef, but use \"using xyz_t\" language feature where new types have a suffix of _t:\n\n        using foo_count_t = uint32_t;\n\n    * Use new enum classes and specify size type:\n\n        enum class state : uint8_t\n        {\n             ...\n\n    * Access member variables and functions always using the \"this->\" pointer. Do not mark member variables with a prefix/postfix pattern.\n\n        this->function_one();\n        this->a_member_variable = 0;\n\n    * Use Doxygen style comments for all public methods. Base class should have them and derived classes do not require it. \n    * Comment any code that is not obvious, in terms of what it does.\n    * Reference symbol should be added to the type and not the variable.\n\n        void function(const some_type& my_type);\n\n### Best practices\n\n    * Follow SOLID & DRY principles\n\n        Keep functions small and focused. (https://en.wikipedia.org/wiki/SOLID)\n\n    * Before writing new code to support a feature, follow these steps:\n\n        1. Check the C++ std library algorithms etc.\n        2. If not in std library then look at boost.\n        3. If boost can't help then consult with the Bluzelle team, third party libraries \n        4. If you can't find a third party library then consider implementing your own.\n\n    * #includes should use <path/header_file.hpp> and not \"header_file.hpp\"\n\n        #include <include/boost_asio_beast.hpp>\n        #include <node/node_base.hpp>\n        #include <node/session_base.hpp>\n        #include <options/options_base.hpp>\n\n    * Preferred include ordering:\n\n        1. global project headers\n        2. current lib/code headers\n        3. other project lib headers\n        4. third_party lib headers\n        5. standard headers\n\n    * Use functional style as apposed to raw loops such has std::find_if, std::remove_if etc.\n    * Use exceptions only when the code can not function with out \"something\". Typically this would be during construction of a class.\n    * Long functions are difficult to change and difficult to understand. Each function should attempt to do exactly one thing. You should be able to sum it up in one sentence (and the method name should be a summary of that sentence). If you find a function is getting too long, split it into sensible parts.\n    * Functions taking large numbers of parameters (ie: more than six) are a generally a bad idea and are indicative of either a function trying to do too much or poor class organization. Split the function up into sensible parts.\n    * Conditionals and loops should not be nested more than three deep. Any such code needs to be refactored. Either pull the inner parts of the code into separate methods or pull the complex conditions into functions. A line of code should never exceed approximately seventy characters.\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  Developers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\n  A secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate.  Many developers of free software are heartened and\nencouraged by the resulting cooperation.  However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\n  The GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community.  It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server.  Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\n  An older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals.  This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Remote Network Interaction; Use with the GNU General Public License.\n\n  Notwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software.  This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time.  Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as published\n    by the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source.  For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code.  There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<http://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "README.md",
    "content": "# SwarmDB\n\n[![Build Status](https://travis-ci.org/bluzelle/swarmDB.svg?branch=devel)](https://travis-ci.org/bluzelle/swarmDB) [![Coverage Status](https://coveralls.io/repos/github/bluzelle/swarmDB/badge.svg?branch=devel)](https://coveralls.io/github/bluzelle/swarmDB?branch=devel) [![License](https://img.shields.io/:license-AGPLv3-blue.svg?style=flat-square)](https://github.com/bluzelle/swarmDB/blob/devel/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@bluzelle-blue.svg?style=flat-square)](https://twitter.com/BluzelleHQ) [![Gitter chat](https://img.shields.io/gitter/room/nwjs/nw.js.svg?style=flat-square)](https://gitter.im/bluzelle)\n\n## ABOUT SWARMDB\n\nBluzelle brings together the sharing economy and token economy. Bluzelle enables people to rent out their computer storage space to earn a token while dApp developers pay with a token to have their data stored and managed in the most efficient way.\n\n## Getting started with Docker\n\nIf you want to deploy your swarm immediately you can use our docker-compose quickstart instructions:\n\n### Install Docker\n\n[Docker Installation Guide](https://docs.docker.com/install/)\n\n1. Setup a local docker-compose swarm with the instructions found [here](https://github.com/bluzelle/docker-swarm-deploy)\n2. Run `docker-compose up` in the same directory of your docker-compose.yml. This command will initialize the swarm within your local docker-machine. Full docker-compose documentation can be found [here](https://docs.docker.com/compose/)\n3. Nodes are available on localhost port 51010-51012\n4. [Connect a test websocket client](https://github.com/bluzelle/swarmDB#testing-locally) \n5. Create a node server application using our node.js [library](https://github.com/bluzelle/bluzelle-js)\n6. `CTRL-C` to terminate the docker-compose swarm\n\n## Getting started building from source\n\n### Installation - Ubuntu\n\n**CMake (Ver. 3.10 or greater) etc.**\n\nOn Ubuntu 18.04 and newer, you can simply install via `apt`.\n\n```text\n$ sudo apt-get install cmake \n```\nIf your system packages don't have a new enough version, you can install a\ndifferent CMake into `~/mycmake/` to avoid overwriting your system's `cmake`.\n\n```text\n$ sudo apt-get install curl libcurl4-openssl-dev\n$ mkdir -p ~/mycmake\n$ curl -L http://cmake.org/files/v3.11/cmake-3.11.0-Linux-x86_64.tar.gz | tar -xz -C ~/mycmake --strip-components=1\n```\n\nYou would then use `~/mycmake/bin/cmake ..` instead of `cmake ..` in further\ninstructions.\n\n**Protobuf \\(Ver. 3 or greater\\) etc.**\n\n```text\n$ sudo apt-add-repository ppa:maarten-fonville/protobuf\n$ sudo apt-get update\n$ sudo apt-get install pkg-config protobuf-compiler libprotobuf-dev libsnappy-dev libbz2-dev\n```\n\n**ccache \\(Optional\\)**\n\nIf available, cmake will attempt to use ccache \\([https://ccache.samba.org](https://ccache.samba.org)\\) to _drastically_ speed up compilation.\n\n```text\n$ sudo apt-get install ccache\n```\n\n**Git LFS \\(Optional\\)**\n\nGit LFS is currently being used to speed up builds if available.\n\n```text\n$ sudo apt-get install git-lfs\n$ git lfs install\n```\n\n### Building the Daemon from Command Line Interface \\(CLI\\)\n\n**Note**: Git LFS is used by default. If you do not have it set up, you must\nbuild the dependencies by setting `BUILD_DEPEND=YES` in your `cmake` call, e.g.\n`cmake .. -DBUILD_DEPEND=YES`, and omit the `git lfs` commands.\n\nHere are the steps to build the Daemon and unit test application from the command line:\n\n```text\n$ mkdir build\n$ cd build\n$ cmake ..\n$ git lfs install\n$ git lfs pull\n$ sudo make install\n```\n\n### Deploying the Daemons\n\n#### The Bluzelle Configuration File\n\nThe Bluzelle daemon is configured by setting the properties of a JSON\nconfiguration file provided by the user. This file is usually called\n*bluzelle.json* and resides in the current working directory. To specify a\ndifferent configuration file the daemon can be executed with the -c command\nline argument:\n\n    $ swarm -c peer0.json\n\nThe configuration file is a JSON format file, as seen in the following example:\n\n    {\n        \"listener_address\" : \"127.0.0.1\",\n        \"listener_port\" : 50000,\n        \"bootstrap_file\" : \"/home/isabel/swarmdb/local/nodes/peers.json\",\n        \"debug_logging\" : true,\n        \"log_to_stdout\" : true,\n        \"use_pbft\": true,\n        \"bootstrap_file\": \"./peers.json\",\n        \"stack\" : \"testnet-dev\"\n    }\n\nThe complete documentation of the options available for this file is given by \n\n    $ swarm --help\n\nbut the properties likely useful for a minimal swarm are summarized here:\n\n- \"bootstrap_file\" - path to peers file (see below)\n- \"debug_logging\" - show more log info\n- \"listener_address\" - the ip address that SwarmDB will listen on (this should be \"127.0.0.1\" unless you are doing something fancy)\n- \"listener_port\" - the port that SwarmDB will listen on (each node running on the same host should use a different port)\n- \"log_to_stdout\" (optional) - log to stdout as well as log file\n- \"uuid\" - the universally unique identifier that this instance of SwarmDB will use to uniquely identify itself. This should be specified if and only if node cryptography is disabled (the default) - otherwise, nodes use their private keys as their identifier.\n- \"stack\" - software stack used by swarm\n\n#### The Bluzelle Bootstrap File\n\nThe bootstrap file, identified in the config file by the \"bootstrap_file\"\nparameter, see above, provides a list of nodes in the the swarm that the\nlocal instance of the SwarmDB daemon can communicate with. If the membership\nof the swarm has changed, these nodes will be used to introduce the node to\nthe current swarm and catch it up to the current state, and the bootstrap file\nacts as a \"starting peers list\".\n\nIf you are running a static testnet (i.e., nodes do not join or leave the swarm)\nthen every node should have the same bootstrap_file, and it should include\nan entry for every node. Thus, each node will appear in its own bootstrap file. \nIf a node is not already in the swarm when it starts (i.e., it should dynamically join\nthe swarm) then it should not be in its own bootstrap file.\n\nThe booststrap file format is a JSON array, containing JSON objects describing\nnodes as seen in the following example:\n\n    [\n        {\n            \"host\": \"127.0.0.1\",\n            \"name\": \"peer0\",\n            \"port\": 49152,\n            \"uuid\": \"d6707510-8ac6-43c1-b9a5-160cf54c99f5\"\n        },\n        {\n            \"host\": \"127.0.0.1\",\n            \"name\": \"peer1\",\n            \"port\": 49153,\n            \"uuid\": \"5c63dfdc-e251-4b9c-8c36-404972c9b4ec\"\n        },\n        ...\n        {\n            \"host\": \"127.0.0.1\",\n            \"name\": \"peer1\",\n            \"port\": 49153,\n            \"uuid\": \"ce4bfdc-63c7-5b9d-1c37-567978e9b893a\"\n        }\n    ]\n\nwhere the Peer object parameters are (ALL PARAMETERS MUST MATCH THE PEER CONFIGURATION):\n- \"host\" - the IP address associated with the external node \n- \"name\" - the human readable name that the external node uses\n- \"port\" - the socket address that the external node will listen for protobuf and web socket requests. (listen_port in the config file)\n- \"uuid\" - the universally unique identifier that the external node uses to uniquely identify itself. This is required to be unique per node and consistent between the peerlist and the config.\n\nNote that if node cryptography is enabled (see swarmdb --help), node uuids are their public keys.\n\n\n#### Steps to setup and run Daemon:\n\n1. Create each of the JSON files as described above in swarmDB/build/output/, where the swarm executable resides. \\(bluzelle.json, bluzelle2.json, bluzelle3.json, bluzelle4.json, peers.json\\).\n2. Create an account with Etherscan: [https://etherscan.io/register](https://etherscan.io/register)\n3. Create an Etherscan API KEY by clicking Developers -&gt; API-KEYs.\n4. Add your Etherscan API KEY Token to the configuration files.\n5. Modify the `ethereum` address to be an Ethereum mainnet address that contains tokens or use the sample address provided above.\n6. Ensure that each swarmdb instance is configured to listen on a different port and has a different uuid, and that the peers file contains correct uuids and addresses for all nodes\n7. Deploy your swarm of Daemons. From the swarmDB/build/output/ directory, run:\n\n```text\n$ ./swarm -c bluzelle.json\n$ ./swarm -c bluzelle2.json\n$ ./swarm -c bluzelle3.json\n```\n\n## Integration Tests With Bluzelle's Javascript Client\n\n### Installation - macOSX\n\n#### Homebrew\n\n```text\n$ /usr/bin/ruby -e \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)\"\n```\n\n#### Node\n\n```text\n$ brew install node\n```\n\n#### Yarn\n\n```text\n$ brew install yarn\n```\n\n### Installation - Ubuntu\n\n#### NPM\n\n```text\n$ sudo apt-get install npm\n```\n\n#### Update NPM\n\n```text\n$ sudo npm install npm@latest -g\n```\n\n#### Yarn\n\n```text\n$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -\necho \"deb https://dl.yarnpkg.com/debian/ stable main\" | sudo tee /etc/apt/sources.list.d/yarn.list\n\n$ sudo apt-get update && sudo apt-get install yarn\n```\n\n### Running Integration Tests\n\nScript to clone _bluzelle-js_ repository and copy template configuration files or run tests with your configuration files.\n\n```text\n$ qa/integration-tests setup // Sets up template configuration files\n```\n\n```text\n$ qa/integration-tests // Runs tests with configuration files you've created\n```\n\n## Testing Locally\n\n```text\n$ cd scripts\n\nFollow instructions in readme.md\n```\n\n#### Connectivity Test\n\n```text\n$ ./crud -s <SWARM-ID> -n localhost:49154 status\n\nClient: crud-script-0\nSending:\nswarm_id: \"<SWARM-ID>\"\nsender: \"crud-script-0\"\nstatus_request: \"\"\n\n------------------------------------------------------------\n\nResponse: \n\nswarm_version: \"0.3.1443\"\nswarm_git_commit: \"0.3.1096-41-g91cef89\"\nuptime: \"1 days, 17 hours, 29 minutes\"\nmodule_status_json: ... \npbft_enabled: true\n\nResponse: \n{\n    \"module\" : \n    [\n        {\n            \"name\" : \"pbft\",\n            \"status\" : \n            {\n                \"is_primary\" : false,\n                \"latest_checkpoint\" : \n                {\n                    \"hash\" : \"\",\n                    \"sequence_number\" : 3800\n                },\n                \"latest_stable_checkpoint\" : \n                {\n                    \"hash\" : \"\",\n                    \"sequence_number\" : 3800\n                },\n                \"next_issued_sequence_number\" : 1,\n                \"outstanding_operations_count\" : 98,\n                \"peer_index\" : \n                [\n                    {\n                        \"host\" : \"127.0.0.1\",\n                        \"name\" : \"node_0\",\n                        \"port\" : 50000,\n                        \"uuid\" : \"MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE/HIPqL97zXbPN8CW609Dddu4vSKx/xnS1sle0FTgyzaDil1UmmQkrlTsQQqpU7N/kVMbAY+/la3Rawfw6VjVpA==\"\n                    },\n                    {\n                        \"host\" : \"127.0.0.1\",\n                        \"name\" : \"node_1\",\n                        \"port\" : 50001,\n                        \"uuid\" : \"MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAELUJ3AivScRn6sfBgBsBi3I18mpOC5NZ552ma0QTFSHVdPGj98OBMhxMkyKRI6UhAeuUTDf/mCFM5EqsSRelSQw==\"\n                    },\n                    {\n                        \"host\" : \"127.0.0.1\",\n                        \"name\" : \"node_2\",\n                        \"port\" : 50002,\n                        \"uuid\" : \"MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEg+lS+GZNEOqhftj041jCjLabPrOxkkpTHSWgf6RNjyGKenwlsdYF9Xg1UH1FZCpNVkHhCLi2PZGk6EYMQDXqUg==\"\n                    }\n                ],\n                \"primary\" : \n                {\n                    \"host\" : \"127.0.0.1\",\n                    \"host_port\" : 50001,\n                    \"name\" : \"node_1\",\n                    \"uuid\" : \"MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAELUJ3AivScRn6sfBgBsBi3I18mpOC5NZ552ma0QTFSHVdPGj98OBMhxMkyKRI6UhAeuUTDf/mCFM5EqsSRelSQw==\"\n                },\n                \"unstable_checkpoints_count\" : 0,\n                \"view\" : 1\n            }\n        }\n    ]\n}\n\n------------------------------------------------------------\n```\n\n#### Create database\n```text\n\n./crud -s <SWARM-ID> -n localhost:50000 create-db -u myuuid\n\nClient: crud-script-0\n------------------------------------------------------------\n\nResponse: \nheader {\n  db_uuid: \"myuuid\"\n  nonce: 2998754133578549919\n}\n\n------------------------------------------------------------\n```\n\n#### Create\n\n```text\n$ ./crud -s <SWARM-ID> -n localhost:50000 create -u myuuid -k mykey -v myvalue\n\nClient: crud-script-0\n------------------------------------------------------------\n  \nResponse: \nheader {\n  db_uuid: \"myuuid\"\n  nonce: 9167923913779064632\n}\n  \n------------------------------------------------------------\n```\n\n#### Read\n\n```text\n$ ./crud -s <SWARM-ID> -n localhost:50000 read -u myuuid -k mykey\n\nClient: crud-script-0\n------------------------------------------------------------\n\nResponse: \nheader {\n  db_uuid: \"myuuid\"\n  nonce: 1298794800698891064\n}\nread {\n  key: \"mykey\"\n  value: \"myvalue\"\n}\n\n------------------------------------------------------------\n```\n\n#### Update\n\n```text\n$ ./crud -s <SWARM-ID> -n localhost:50000 update -u myuuid -k mykey -v mynewvalue\n\nClient: crud-script-0\n------------------------------------------------------------\n\nResponse: \nheader {\n  db_uuid: \"myuuid\"\n  nonce: 9006453024945657757\n}\n\n------------------------------------------------------------\n```\n\n#### Delete\n\n```text\n$ ./crud -s <SWARM-ID> -n localhost:50000 delete -u myuuid -k mykey\n\nClient: crud-script-0\n------------------------------------------------------------\n\nResponse: \nheader {\n  db_uuid: \"myuuid\"\n  nonce: 7190311901863172254\n}\n\n------------------------------------------------------------\n```\n\n#### Subscribe\n\n```text\n$ ./crud -s <SWARM-ID> -n localhost:50000 subscribe -u myuuid -k mykey\n\nClient: crud-script-0\n------------------------------------------------------------\n\nResponse: \nheader {\n  db_uuid: \"myuuid\"\n  nonce: 8777225851310409007\n}\n\n------------------------------------------------------------\n\nWaiting....\n\nResponse: \nheader {\n  db_uuid: \"myuuid\"\n  nonce: 8777225851310409007\n}\nsubscription_update {\n  key: \"mykey\"\n  value: \"myvalue\"\n}\n\n------------------------------------------------------------\n\nWaiting....\n```\n\n#### Delete database\n```text\n./crud -s <SWARM-ID> -n localhost:50000 delete-db -u myuuid\n\nClient: crud-script-0\n------------------------------------------------------------\n\nResponse: \nheader {\n  db_uuid: \"myuuid\"\n  nonce: 1540670102065057350\n}\n\n------------------------------------------------------------\n```\n\n#### Adding or Removing A Peer\n\nDynamically adding and removing peers is not supported in this release. This functionality will be available in a subsequent version of swarmDB.\n\n#### Help & Options\n\n```text\n$ ./crud --help\nusage: crud [-h] [-p] [-i ID] -n NODE\n            {status,create-db,delete-db,has-db,writers,add-writer,remove-writer,create,read,update,delete,has,keys,size,subscribe}\n            ...\n\ncrud\n\npositional arguments:\n  {status,create-db,delete-db,has-db,writers,add-writer,remove-writer,create,read,update,delete,has,keys,size,subscribe}\n    status              Status\n    create-db           Create database\n    delete-db           Delete database\n    has-db              Has database\n    writers             Database writers\n    add-writer          Add database writers\n    remove-writer       Remove database writers\n    create              Create k/v\n    read                Read k/v\n    update              Update k/v\n    delete              Delete k/v\n    has                 Determine whether a key exists within a DB by UUID\n    keys                Get all keys for a DB by UUID\n    size                Determine the size of the DB by UUID\n    subscribe           Subscribe and monitor changes for a key\n\noptional arguments:\n  -h, --help            show this help message and exit\n  -i ID, --id ID        Crud script sender id (default 0)\n  -s <SWARM-ID>,        Swarm id\n    --swarm_id <SWARM-ID>  \n\nrequired arguments:\n  -n NODE, --node NODE  node's address (ex. 127.0.0.1:51010)\n"
  },
  {
    "path": "SUMMARY.md",
    "content": "# Table of contents\n\n* [SwarmDB](README.md)\n* [Python CRUD Test App](scripts-1.md)\n\n"
  },
  {
    "path": "audit/CMakeLists.txt",
    "content": "add_library(audit\n        audit_base.hpp\n        audit.hpp\n        audit.cpp\n    ../mocks/mock_pbft_base.hpp)\n\ntarget_link_libraries(audit utils proto)\nadd_dependencies(audit boost jsoncpp)\ntarget_include_directories(audit PRIVATE ${BLUZELLE_STD_INCLUDES})\nadd_subdirectory(test)\n"
  },
  {
    "path": "audit/audit.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <audit/audit.hpp>\n#include <boost/beast/core/detail/base64.hpp>\n#include <boost/asio/ip/udp.hpp>\n#include <boost/format.hpp>\n#include <boost/system/error_code.hpp>\n#include <utils/bytes_to_debug_string.hpp>\n\nusing namespace bzn;\n\naudit::audit(std::shared_ptr<bzn::asio::io_context_base> io_context\n        , std::shared_ptr<bzn::node_base> node\n        , size_t mem_size\n        , std::shared_ptr<bzn::monitor_base> monitor\n)\n\n        : node(std::move(node))\n        , io_context(std::move(io_context))\n        , primary_alive_timer(this->io_context->make_unique_steady_timer())\n        , mem_size(mem_size)\n        , monitor(std::move(monitor))\n{\n}\n\nvoid\naudit::start()\n{\n    std::call_once(this->start_once, [this]()\n    {\n        this->node->register_for_message(bzn_envelope::kAudit,\n            std::bind(&audit::handle, shared_from_this(), std::placeholders::_1, std::placeholders::_2));\n\n        LOG(debug) << \"starting primary alive timer\";\n        this->reset_primary_alive_timer();\n    });\n}\n\nvoid\naudit::reset_primary_alive_timer()\n{\n    this->primary_dead_count = 0;\n\n    this->primary_alive_timer->cancel();\n    this->primary_alive_timer->expires_from_now(this->primary_timeout);\n    this->primary_alive_timer->async_wait(std::bind(&audit::handle_primary_alive_timeout, shared_from_this(), std::placeholders::_1));\n}\n\nvoid\naudit::handle_primary_alive_timeout(const boost::system::error_code& ec)\n{\n    if (ec && ec != boost::system::errc::operation_canceled)\n    {\n        LOG(trace) << \"primary alive timeout canceled \" << ec.message();\n        return;\n    }\n    if (ec == boost::system::errc::operation_canceled)\n    {\n        LOG(trace) << \"primary still alive\";\n        return;\n    }\n\n    this->monitor->send_counter(bzn::statistic::pbft_no_primary);\n\n    this->primary_alive_timer->expires_from_now(this->primary_timeout);\n    this->primary_alive_timer->async_wait(std::bind(&audit::handle_primary_alive_timeout, shared_from_this(), std::placeholders::_1));\n}\n\nvoid\naudit::handle(const bzn_envelope& env, std::shared_ptr<bzn::session_base> /*session*/)\n{\n    audit_message message;\n    if (!message.ParseFromString(env.audit()))\n    {\n        LOG(error) << \"failed to parse audit message from \" << env.sender();\n    }\n\n    LOG(trace) << \"got audit message\" << message.DebugString();\n\n    if (message.has_pbft_commit())\n    {\n        this->handle_pbft_commit(message.pbft_commit());\n    }\n    else if (message.has_primary_status())\n    {\n        this->handle_primary_status(message.primary_status());\n    }\n    else if (message.has_failure_detected())\n    {\n        this->handle_failure_detected(message.failure_detected());\n    }\n    else\n    {\n        LOG(error) << \"got an unknown audit message? \" << message.DebugString();\n    }\n}\n\nvoid audit::handle_primary_status(const primary_status& primary_status)\n{\n    std::lock_guard<std::mutex> lock(this->audit_lock);\n\n    if (this->recorded_primaries.count(primary_status.view()) == 0)\n    {\n        LOG(info) << \"observed primary of view \" << primary_status.view() << \" to be '\" << primary_status.primary() << \"'\";\n        this->monitor->send_counter(bzn::statistic::pbft_primary_alive);\n        this->recorded_primaries[primary_status.view()] = primary_status.primary();\n        this->trim();\n    }\n    else if (this->recorded_primaries[primary_status.view()] != primary_status.primary())\n    {\n        std::string err = str(boost::format(\n                \"Conflicting primary detected! '%1%' is the recorded primary of view %2%, but '%3%' claims to be the primary of the same view.\")\n                              % this->recorded_primaries[primary_status.view()]\n                              % primary_status.view()\n                              % primary_status.primary());\n        this->monitor->send_counter(bzn::statistic::pbft_primary_conflict);\n    }\n\n    this->reset_primary_alive_timer();\n}\n\nvoid\naudit::handle_pbft_commit(const pbft_commit_notification& commit)\n{\n    std::lock_guard<std::mutex> lock(this->audit_lock);\n\n    this->monitor->send_counter(bzn::statistic::pbft_commit);\n\n    if (this->recorded_pbft_commits.count(commit.sequence_number()) == 0)\n    {\n        LOG(debug) << \"observed that message '\" << bytes_to_debug_string(commit.operation()) << \"' is committed at sequence \" << commit.sequence_number();\n        this->recorded_pbft_commits[commit.sequence_number()] = commit.operation();\n        this->trim();\n    }\n    else if (this->recorded_pbft_commits[commit.sequence_number()] != commit.operation())\n    {\n        std::string err = str(boost::format(\n                \"Conflicting commit detected! '%1%' is the recorded entry at sequence %2%, but '%3%' has been committed with the same sequence.\")\n                              % this->recorded_pbft_commits[commit.sequence_number()]\n                              % commit.sequence_number()\n                              % commit.operation());\n        this->monitor->send_counter(bzn::statistic::pbft_commit_conflict);\n    }\n}\n\nvoid\naudit::handle_failure_detected(const failure_detected& /*failure*/)\n{\n    std::lock_guard<std::mutex> lock(this->audit_lock);\n\n    this->monitor->send_counter(bzn::statistic::pbft_failure_detected);\n}\n\nsize_t\naudit::current_memory_size()\n{\n    return this->recorded_pbft_commits.size() + this->recorded_primaries.size();\n}\n\nvoid\naudit::trim()\n{\n    // Here we're removing the lowest term/log index entries, which is sort of like the oldest entries. I'd rather\n    // remove entries at random, but that's not straightforward to do with STL containers without making some onerous\n    // performance compromise.\n\n    while(this->recorded_primaries.size() > this->mem_size)\n    {\n        this->recorded_primaries.erase(this->recorded_primaries.begin());\n    }\n\n    while(this->recorded_pbft_commits.size() > this->mem_size)\n    {\n        this->recorded_pbft_commits.erase(this->recorded_pbft_commits.begin());\n    }\n}\n"
  },
  {
    "path": "audit/audit.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <audit/audit_base.hpp>\n#include <node/node_base.hpp>\n#include <monitor/monitor_base.hpp>\n#include <include/boost_asio_beast.hpp>\n#include <boost/asio/ip/udp.hpp>\n#include <mutex>\n#include <optional>\n\n\n\nnamespace bzn\n{\n\n    class audit : public audit_base, public std::enable_shared_from_this<audit>\n    {\n    public:\n        audit(std::shared_ptr<bzn::asio::io_context_base>\n                , std::shared_ptr<bzn::node_base> node\n\t\t        , size_t mem_size\n                , std::shared_ptr<bzn::monitor_base> monitor\n        );\n\n        void handle(const bzn_envelope& message, std::shared_ptr<bzn::session_base> session) override;\n\n        void handle_pbft_commit(const pbft_commit_notification&) override;\n        void handle_primary_status(const primary_status&) override;\n        void handle_failure_detected(const failure_detected&) override;\n\n        size_t current_memory_size();\n\n        void start() override;\n\n    private:\n        void handle_primary_alive_timeout(const boost::system::error_code& ec);\n        void reset_primary_alive_timer();\n\n        void report_error(const std::string& metric_name, const std::string& error_description);\n        void send_to_monitor(const std::string& stat);\n\n        void handle_leader_data(const leader_status&);\n        void handle_leader_made_progress(const leader_status&);\n\n        void trim();\n\n        std::list<std::string> recorded_errors;\n        const std::shared_ptr<bzn::node_base> node;\n        const std::shared_ptr<bzn::asio::io_context_base> io_context;\n\n        uint primary_dead_count = 0;\n\n        std::map<uint64_t, bzn::uuid_t> recorded_primaries;\n        std::map<uint64_t, std::string> recorded_pbft_commits;\n\n        std::once_flag start_once;\n        std::mutex audit_lock;\n        std::unique_ptr<bzn::asio::steady_timer_base> primary_alive_timer;\n\n        // TODO: Make this configurable\n        std::chrono::milliseconds primary_timeout{std::chrono::milliseconds(30000)};\n\n        size_t forgotten_error_count = 0;\n\n        size_t mem_size;\n\n        std::shared_ptr<bzn::monitor_base> monitor;\n    };\n\n}\n"
  },
  {
    "path": "audit/audit_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <string>\n#include <list>\n#include <memory>\n\n#include <include/bluzelle.hpp>\n#include <node/node_base.hpp>\n#include <node/session_base.hpp>\n#include <proto/audit.pb.h>\n\nnamespace bzn\n{\n    class audit_base\n    {\n    public:\n\n        virtual ~audit_base() = default;\n\n        virtual void start() = 0;\n\n        virtual void handle(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> session) = 0;\n\n        virtual void handle_pbft_commit(const pbft_commit_notification&) = 0;\n\n        virtual void handle_primary_status(const primary_status&) = 0;\n\n        virtual void handle_failure_detected(const failure_detected&) = 0;\n    };\n\n}\n"
  },
  {
    "path": "audit/test/CMakeLists.txt",
    "content": "set(test_srcs audit_test.cpp)\nset(test_libs audit proto  ${Protobuf_LIBRARIES})\n\nadd_gmock_test(audit)\n"
  },
  {
    "path": "audit/test/audit_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the views of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <audit/audit.hpp>\n#include <mocks/mock_node_base.hpp>\n#include <mocks/mock_boost_asio_beast.hpp>\n#include <boost/range/irange.hpp>\n#include <boost/asio/buffer.hpp>\n#include <mocks/mock_monitor.hpp>\n\nusing namespace ::testing;\n\nclass audit_test : public Test\n{\npublic:\n    std::shared_ptr<bzn::asio::mock_io_context_base> mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n    std::shared_ptr<bzn::mock_node_base> mock_node = std::make_shared<NiceMock<bzn::mock_node_base>>();\n\n    std::unique_ptr<bzn::asio::mock_steady_timer_base> primary_alive_timer =\n            std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n\n    bzn::asio::wait_handler primary_alive_timer_callback;\n\n    std::shared_ptr<bzn::mock_monitor> mock_monitor = std::make_shared<StrictMock<bzn::mock_monitor>>();\n\n    std::shared_ptr<bzn::audit> audit;\n\n    size_t mem_size = 1000;\n\n    audit_test()\n    {\n        EXPECT_CALL(*(this->mock_io_context), make_unique_steady_timer())\n                .WillOnce(Invoke(\n                [&](){return std::move(this->primary_alive_timer);}\n        ));\n\n        EXPECT_CALL(*(this->primary_alive_timer), async_wait(_))\n                .WillRepeatedly(Invoke(\n                [&](auto handler){this->primary_alive_timer_callback = handler;}\n        ));\n    }\n\n    void build_audit()\n    {\n        // We cannot construct this during our constructor because doing so invalidates our timer pointers,\n        // which prevents tests from setting expectations on them\n        this->audit = std::make_shared<bzn::audit>(this->mock_io_context, this->mock_node, this->mem_size, this->mock_monitor);\n        this->audit->start();\n    }\n};\n\nTEST_F(audit_test, audit_throws_error_when_primaries_conflict)\n{\n    this->build_audit();\n    primary_status a, b, c;\n\n    a.set_primary(\"fred\");\n    a.set_view(1);\n\n    b.set_primary(\"smith\");\n    b.set_view(2);\n\n    c.set_primary(\"francheskitoria\");\n    c.set_view(1);\n\n    EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_primary_alive, 1)).Times(AnyNumber());\n    EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_primary_conflict, 1));\n\n    this->audit->handle_primary_status(a);\n    this->audit->handle_primary_status(b);\n    this->audit->handle_primary_status(c);\n    this->audit->handle_primary_status(b);\n}\n\nTEST_F(audit_test, audit_throws_error_when_pbft_commits_conflict)\n{\n    this->build_audit();\n\n    pbft_commit_notification a, b, c;\n\n    a.set_operation(\"do something\");\n    a.set_sequence_number(1);\n\n    b.set_operation(\"do a different thing\");\n    b.set_sequence_number(2);\n\n    c.set_operation(\"do something else\");\n    c.set_sequence_number(1);\n\n    EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_commit, 1)).Times(AnyNumber());\n    EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_commit_conflict, 1));\n\n    this->audit->handle_pbft_commit(a);\n    this->audit->handle_pbft_commit(b);\n    this->audit->handle_pbft_commit(c);\n    this->audit->handle_pbft_commit(b);\n}\n\nTEST_F(audit_test, audit_throws_error_when_no_primary_alive)\n{\n    EXPECT_CALL(*(this->primary_alive_timer), expires_from_now(_)).Times(AtLeast(1));\n    this->build_audit();\n\n    EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_no_primary, 1));\n\n    this->primary_alive_timer_callback(boost::system::error_code());\n}\n\nTEST_F(audit_test, audit_resets_primary_alive_on_message)\n{\n    bool reset;\n    EXPECT_CALL(*(this->primary_alive_timer), cancel()).WillRepeatedly(Invoke(\n            [&](){reset = true;}\n    ));\n\n    this->build_audit();\n\n    primary_status ls1;\n    ls1.set_primary(\"fred\");\n\n    reset = false;\n    EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_primary_alive, 1)).Times(AnyNumber());\n    this->audit->handle_primary_status(ls1);\n    EXPECT_TRUE(reset);\n\n    EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_no_primary, 1));\n    this->primary_alive_timer_callback(boost::system::error_code());\n}\n\nTEST_F(audit_test, audit_forgets_old_data)\n{\n    this->mem_size = 10;\n    this->build_audit();\n\n    primary_status ls1;\n    ls1.set_primary(\"joe\");\n\n    primary_status ls2;\n    ls2.set_primary(\"alfred\");\n\n    pbft_commit_notification com;\n    com.set_operation(\"Do some stuff!!\");\n\n    EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_commit, 1)).Times(AnyNumber());\n    EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_primary_alive, 1)).Times(AnyNumber());\n    EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_primary_conflict, 1)).Times(Exactly(100));\n\n    for(auto i : boost::irange(0, 100))\n    {\n        // Trigger an error, a primary elected, and a commit notification every iteration\n        ls1.set_view(i);\n        ls2.set_view(i);\n        com.set_sequence_number(i);\n\n        this->audit->handle_primary_status(ls1);\n        this->audit->handle_primary_status(ls2);\n        this->audit->handle_pbft_commit(com);\n    }\n\n    // It's allowed to have mem size each of commits, primaries, and\n    EXPECT_LE(this->audit->current_memory_size(), 2*this->mem_size);\n}\n\nTEST_F(audit_test, audit_still_detects_new_errors_after_forgetting_old_data)\n{\n    this->mem_size = 10;\n    this->build_audit();\n\n    primary_status ls1;\n    ls1.set_primary(\"joe\");\n\n    pbft_commit_notification com;\n    com.set_operation(\"do exciting things and stuff\");\n\n    EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_commit, 1)).Times(AnyNumber());\n    EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_primary_alive, 1)).Times(AnyNumber());\n\n    for (auto i : boost::irange(0, 100))\n    {\n        ls1.set_view(i);\n        com.set_sequence_number(i);\n\n        this->audit->handle_primary_status(ls1);\n        this->audit->handle_pbft_commit(com);\n    }\n\n    EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_commit_conflict, 1));\n    EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_primary_conflict, 1));\n    ls1.set_primary(\"not joe\");\n    com.set_operation(\"don't do anything\");\n\n    this->audit->handle_primary_status(ls1);\n    this->audit->handle_pbft_commit(com);\n}\n\n\nTEST_F(audit_test, audit_sends_monitor_message_when_primary_conflict)\n{\n    this->build_audit();\n\n    primary_status ls1;\n    ls1.set_primary(\"joe\");\n\n    primary_status ls2 = ls1;\n    ls2.set_primary(\"francine\");\n\n    EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_primary_alive, 1)).Times(AnyNumber());\n    EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_primary_conflict, 1));\n\n    this->audit->handle_primary_status(ls1);\n    this->audit->handle_primary_status(ls2);\n}\n\nTEST_F(audit_test, audit_sends_monitor_message_when_commit_conflict)\n{\n    this->build_audit();\n\n    pbft_commit_notification com1;\n    com1.set_sequence_number(2);\n    com1.set_operation(\"the first thing\");\n\n    pbft_commit_notification com2 = com1;\n    com2.set_operation(\"the second thing\");\n\n    EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_commit, 1)).Times(AnyNumber());\n    EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_commit_conflict, 1));\n\n    this->audit->handle_pbft_commit(com1);\n    this->audit->handle_pbft_commit(com2);\n}\n"
  },
  {
    "path": "chaos/CMakeLists.txt",
    "content": "add_library(chaos\n        chaos.hpp\n        chaos.cpp\n        chaos_base.hpp\n        )\n\ntarget_link_libraries(chaos options)\ntarget_include_directories(chaos PRIVATE ${BLUZELLE_STD_INCLUDES})\nadd_dependencies(chaos boost openssl)\nadd_subdirectory(test)\n"
  },
  {
    "path": "chaos/chaos.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <random>\n#include <boost/format.hpp>\n#include <chaos/chaos.hpp>\n#include <options/simple_options.hpp>\n#include <include/boost_asio_beast.hpp>\n#include <include/bluzelle.hpp>\n\nusing namespace bzn;\nusing namespace bzn::option_names;\n\nchaos::chaos(std::shared_ptr<bzn::asio::io_context_base> io_context, std::shared_ptr<bzn::options_base> options)\n        : io_context(std::move(io_context))\n        , options(std::move(options))\n        , crash_timer(this->io_context->make_unique_steady_timer())\n{\n    // We don't need cryptographically secure randomness here, but it does need to be of reasonable quality and differ across processes\n    std::random_device rd;\n    this->random.seed(rd());\n}\n\nvoid\nchaos::start()\n{\n    if (this->enabled())\n    {\n        std::call_once(\n                this->start_once,\n                [this]()\n                {\n                    this->start_crash_timer();\n                }\n        );\n    }\n}\n\n\nvoid\nchaos::start_crash_timer()\n{\n    std::weibull_distribution<double> distribution(\n        this->options->get_simple_options().get<double>(CHAOS_NODE_FAILURE_SHAPE),\n        this->options->get_simple_options().get<double>(CHAOS_NODE_FAILURE_SCALE));\n\n    double hours_until_crash = distribution(this->random);\n    LOG(info) << boost::format(\"Chaos module will trigger this node crashing in %1$.2f hours\") % hours_until_crash;\n\n    auto time_until_crash = std::chrono::duration<double, std::chrono::hours::period>(hours_until_crash);\n\n    this->crash_timer->expires_from_now(std::chrono::duration_cast<std::chrono::milliseconds>(time_until_crash));\n\n    // Doing this with this timer means that crashes will only occur at times where boost schedules\n    // a new callback to take place, rather than truly at random.\n    this->crash_timer->async_wait(std::bind(&chaos::handle_crash_timer, shared_from_this(), std::placeholders::_1));\n}\n\nvoid\nchaos::handle_crash_timer(const boost::system::error_code& /*ec*/)\n{\n    LOG(fatal) << \"Chaos module triggering node crash\";\n\n    // Intentionally crashing abruptly\n    std::abort();\n}\n\nbool\nchaos::enabled()\n{\n    return this->options->get_simple_options().get<bool>(CHAOS_ENABLED);\n}\n\nbool\nchaos::is_message_delayed()\n{\n    const bool result = this->enabled() &&\n           this->options->get_simple_options().get<double>(CHAOS_MESSAGE_DELAY_CHANCE) > this->random_float(this->random);\n\n    if (result)\n    {\n        LOG(debug) << \"Chaos module delaying message\";\n    }\n\n    return result;\n}\n\nbool\nchaos::is_message_dropped()\n{\n    bool result = this->enabled() &&\n           this->options->get_simple_options().get<double>(CHAOS_MESSAGE_DROP_CHANCE) > this->random_float(this->random);\n\n    if (result)\n    {\n        LOG(debug) << \"Chaos module dropping message\";\n    }\n\n    return result;\n}\n\nvoid\nchaos::reschedule_message(chaos_delay_callback callback) const\n{\n    std::shared_ptr<bzn::asio::steady_timer_base> timer = this->io_context->make_unique_steady_timer();\n    auto delay = std::chrono::milliseconds(this->options->get_simple_options().get<uint>(CHAOS_MESSAGE_DELAY_TIME));\n\n    timer->expires_from_now(delay);\n    timer->async_wait(\n            [timer, callback](auto /*error*/)\n            {\n                LOG(debug) << \"Chaos module retrying delayed message\";\n                callback();\n            });\n}"
  },
  {
    "path": "chaos/chaos.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <mutex>\n#include <options/options_base.hpp>\n#include <include/boost_asio_beast.hpp>\n#include <chaos/chaos_base.hpp>\n#include <random>\n\nnamespace bzn\n{\n    class chaos : public chaos_base, public std::enable_shared_from_this<chaos>\n    {\n    public:\n        chaos(std::shared_ptr<bzn::asio::io_context_base> io_context, std::shared_ptr<bzn::options_base> options);\n\n        void start() override;\n\n        bool is_message_dropped() override;\n        bool is_message_delayed() override;\n\n        void reschedule_message(chaos_delay_callback callback) const override;\n\n\n    private:\n        void start_crash_timer();\n        void handle_crash_timer(const boost::system::error_code&);\n\n        bool enabled();\n\n        std::once_flag start_once;\n\n        const std::shared_ptr<bzn::asio::io_context_base> io_context;\n        const std::shared_ptr<bzn::options_base> options;\n\n        std::unique_ptr<bzn::asio::steady_timer_base> crash_timer;\n\n        std::mt19937 random;\n\n        std::uniform_real_distribution<> random_float{0.0, 1.0};\n    };\n}\n"
  },
  {
    "path": "chaos/chaos_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n#include <functional>\n\nnamespace bzn\n{\n    class chaos_base\n    {\n    public:\n        /*\n         * start the node death timer (if enabled)\n         */\n        virtual void start() = 0;\n\n        /*\n         * Randomly determine if a message should be dropped, according to settings\n         */\n        virtual bool is_message_dropped() = 0;\n\n        /*\n         * Randomly determine if a message should be delayed, according to settings\n         */\n        virtual bool is_message_delayed() = 0;\n\n        using chaos_delay_callback = std::function<void()>;\n        /*\n         * Schedule a delayed callback according to settings\n         * @param callback      callback for sending message when delay expires\n         */\n        virtual void reschedule_message(chaos_delay_callback callback) const = 0;\n\n        virtual ~chaos_base() = default;\n    };\n}\n"
  },
  {
    "path": "chaos/test/CMakeLists.txt",
    "content": "set(test_srcs chaos_test.cpp)\nset(test_libs chaos options)\n\nadd_gmock_test(chaos)\n"
  },
  {
    "path": "chaos/test/chaos_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <chaos/chaos.hpp>\n#include <mocks/mock_boost_asio_beast.hpp>\n#include <gtest/gtest.h>\n#include <options/options.hpp>\n\nusing namespace ::testing;\n\nclass chaos_test : public Test\n{\npublic:\n    std::shared_ptr<bzn::options> options;\n    std::shared_ptr<bzn::asio::mock_io_context_base> mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    std::unique_ptr<bzn::asio::mock_steady_timer_base> node_crash_timer =\n            std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n    std::unique_ptr<bzn::asio::mock_steady_timer_base> second_timer =\n            std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n\n    bzn::asio::wait_handler node_crash_handler;\n    bzn::asio::wait_handler second_timer_handler;\n\n    std::shared_ptr<bzn::chaos> chaos;\n\n    size_t timer_waited = 0;\n\n    // This pattern copied from audit test\n    chaos_test()\n    {\n        EXPECT_CALL(*(this->mock_io_context), make_unique_steady_timer())\n                .Times(AnyNumber())\n                .WillOnce(Invoke(\n                        [&](){return std::move(this->node_crash_timer);}\n                )).WillOnce(Invoke(\n                        [&](){return std::move(this->second_timer);}\n                ));\n\n        EXPECT_CALL(*(this->node_crash_timer), async_wait(_))\n                .Times(AnyNumber())\n                .WillRepeatedly(Invoke(\n                        [&](auto handler)\n                        {\n                            this->node_crash_handler = handler;\n                            this->timer_waited++;\n                        }\n                ));\n\n        EXPECT_CALL(*(this->second_timer), async_wait(_))\n                .Times(AnyNumber())\n                .WillRepeatedly(Invoke(\n                        [&](auto handler)\n                        {\n                            this->second_timer_handler = handler;\n                        }\n                ));\n\n        this->options = std::make_shared<bzn::options>();\n\n        this->options->get_mutable_simple_options().set(bzn::option_names::CHAOS_ENABLED, \"true\");\n        this->options->get_mutable_simple_options().set(bzn::option_names::CHAOS_MESSAGE_DELAY_CHANCE, \"0.5\");\n        this->options->get_mutable_simple_options().set(bzn::option_names::CHAOS_MESSAGE_DROP_CHANCE, \"0.5\");\n    }\n\n    void build_chaos()\n    {\n        this->chaos = std::make_shared<bzn::chaos>(this->mock_io_context, this->options);\n        this->chaos->start();\n    }\n\n};\n\n\nusing chaos_test_DeathTest = chaos_test; // https://github.com/google/googletest/blob/master/googletest/docs/advanced.md#death-test-naming\nTEST_F(chaos_test_DeathTest, test_crash_scheduled_and_executed)\n{\n    this->build_chaos();\n    EXPECT_EQ(this->timer_waited, 1u);\n\n    ASSERT_DEATH(this->node_crash_handler(boost::system::error_code()), \"\");\n\n}\n\nTEST_F(chaos_test, test_messages_never_dropped_or_delayed_when_disabled)\n{\n    this->build_chaos();\n    this->options->get_mutable_simple_options().set(bzn::option_names::CHAOS_ENABLED, \"false\");\n\n    for (int i=0; i<10000; i++)\n    {\n        ASSERT_FALSE(this->chaos->is_message_dropped());\n        ASSERT_FALSE(this->chaos->is_message_delayed());\n    }\n}\n\nTEST_F(chaos_test, test_messages_sometimes_dropped_or_delayed_sometimes_not)\n{\n    this->build_chaos();\n    uint dropped_count = 0;\n    uint delayed_count = 0;\n    uint not_dropped_count = 0;\n    uint not_delayed_count = 0;\n\n    for (int i=0; i<10000; i++)\n    {\n        if (this->chaos->is_message_dropped())\n        {\n            dropped_count ++;\n        }\n        else\n        {\n            not_dropped_count ++;\n        }\n\n        if (this->chaos->is_message_delayed())\n        {\n            delayed_count++;\n        }\n        else\n        {\n            not_delayed_count++;\n        }\n\n        if (dropped_count>0 && not_dropped_count>0 && delayed_count>0 && not_delayed_count>0)\n        {\n            return;\n        }\n    }\n\n    FAIL();\n}\n\nTEST_F(chaos_test, reschedule_retries_message)\n{\n    this->build_chaos();\n    bool called = false;\n    this->chaos->reschedule_message([&](){called = true;});\n\n    this->second_timer_handler(boost::system::error_code());\n\n    ASSERT_TRUE(called);\n}\n"
  },
  {
    "path": "cmake/add_gmock_test.cmake",
    "content": "# Copyright (C) 2018 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\ninclude(GoogleTest)\n\nfunction(add_gmock_test target)\n    set(target ${target}_tests)\n    add_executable(${target} ${test_srcs})\n    add_dependencies(${target} boost googletest jsoncpp ${test_deps})\n    target_link_libraries(${target} ${test_libs} ${OPENSSL_LIBRARIES} ${GMOCK_BOTH_LIBRARIES} ${Boost_LIBRARIES} ${JSONCPP_LIBRARIES} ${test_link} pthread)\n    target_include_directories(${target} PRIVATE ${BLUZELLE_STD_INCLUDES})\n    gtest_discover_tests(${target})\n    unset(test_srcs)\n    unset(test_libs)\n    unset(test_deps)\n    unset(test_link)\nendfunction()\n"
  },
  {
    "path": "cmake/boost.cmake",
    "content": "# Copyright (C) 2018 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\ninclude(ExternalProject)\ninclude(ProcessorCount)\n\nset(REQUIRED_BOOST \"1.70.0\")\nset(BOOST_URL_HASH \"882b48708d211a5f48e60b0124cf5863c1534cd544ecd0664bb534a4b5d506e9\")\n\nmessage(STATUS \"Boost: ${REQUIRED_BOOST}\")\n\nset(BOOST_TARBALL \"boost_${REQUIRED_BOOST}\")\nstring(REPLACE \".\" \"_\" BOOST_TARBALL ${BOOST_TARBALL})\nstring(APPEND BOOST_TARBALL \".tar.gz\")\n\nset(BOOST_LIBS \"chrono,program_options,random,regex,system,thread,log,serialization\")\n\n# Prevent travis gcc crashes...\nif (DEFINED ENV{TRAVIS})\n    set(BUILD_FLAGS -j8)\nelse()\n    ProcessorCount(N)\n    if(NOT N EQUAL 0)\n        set(BUILD_FLAGS -j${N})\n    endif()\nendif()\n\nExternalProject_Add(boost\n    PREFIX \"${CMAKE_CURRENT_BINARY_DIR}/boost\"\n    URL \"https://dl.bintray.com/boostorg/release/${REQUIRED_BOOST}/source/${BOOST_TARBALL}\"\n    URL_HASH SHA256=${BOOST_URL_HASH}\n    TIMEOUT 120\n    INSTALL_COMMAND \"\"\n    CONFIGURE_COMMAND \"${CMAKE_CURRENT_BINARY_DIR}/boost/src/boost/bootstrap.sh\" \"--with-libraries=${BOOST_LIBS}\"\n    BUILD_COMMAND \"${CMAKE_CURRENT_BINARY_DIR}/boost/src/boost/b2\" link=static visibility=global \"${BUILD_FLAGS} \"\n    BUILD_IN_SOURCE true\n    DOWNLOAD_NO_PROGRESS true\n    )\n\nset_property(DIRECTORY PROPERTY CLEAN_NO_CUSTOM ${CMAKE_CURRENT_BINARY_DIR}/boost)\n\nExternalProject_Get_Property(boost source_dir)\nset(Boost_INCLUDE_DIRS ${source_dir})\n\nset(Boost_LIBRARIES\n    ${source_dir}/stage/lib/libboost_log.a\n    ${source_dir}/stage/lib/libboost_program_options.a\n    ${source_dir}/stage/lib/libboost_system.a\n    ${source_dir}/stage/lib/libboost_thread.a\n    pthread\n    ${source_dir}/stage/lib/libboost_serialization.a\n    ${source_dir}/stage/lib/libboost_date_time.a\n    ${source_dir}/stage/lib/libboost_log_setup.a\n    ${source_dir}/stage/lib/libboost_filesystem.a\n    ${source_dir}/stage/lib/libboost_regex.a\n    ${source_dir}/stage/lib/libboost_chrono.a\n    ${source_dir}/stage/lib/libboost_atomic.a\n)\n"
  },
  {
    "path": "cmake/git_commit.cmake",
    "content": "# Copyright (C) 2018 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\nset(SWARM_GIT_COMMIT \"unknown\")\n\nfind_program(GIT_EXECUTABLE NAMES git)\n\nif (GIT_EXECUTABLE)\n    execute_process(COMMAND git describe --always --tags --dirty OUTPUT_VARIABLE SWARM_GIT_COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})\nendif()\n\nconfigure_file(${CMAKE_CURRENT_LIST_DIR}/swarm_git_commit.hpp.in ${PROJECT_BINARY_DIR}/swarm_git_commit.hpp.tmp)\n\nexecute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PROJECT_BINARY_DIR}/swarm_git_commit.hpp.tmp ${PROJECT_BINARY_DIR}/swarm_git_commit.hpp)\nexecute_process(COMMAND ${CMAKE_COMMAND} -E remove ${PROJECT_BINARY_DIR}/swarm_git_commit.hpp.tmp)\n"
  },
  {
    "path": "cmake/googletest.cmake",
    "content": "# Copyright (C) 2018 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\ninclude(ExternalProject)\n\nExternalProject_Add(googletest\n    PREFIX \"${CMAKE_CURRENT_BINARY_DIR}/googletest\"\n    URL https://github.com/google/googletest/archive/release-1.8.0.tar.gz\n    URL_HASH SHA256=58a6f4277ca2bc8565222b3bbd58a177609e9c488e8a72649359ba51450db7d8\n    TIMEOUT 30\n    INSTALL_COMMAND \"\"\n    DOWNLOAD_NO_PROGRESS true\n    )\n\nset_property(DIRECTORY PROPERTY CLEAN_NO_CUSTOM\n    \"${CMAKE_CURRENT_BINARY_DIR}/googletest\")\n\nExternalProject_Get_Property(googletest source_dir)\ninclude_directories(${source_dir}/googlemock/include ${source_dir}/googletest/include)\n\nExternalProject_Get_Property(googletest binary_dir)\nlink_directories(${binary_dir}/googlemock)\n\nset(GMOCK_BOTH_LIBRARIES gmock_main gmock)\n"
  },
  {
    "path": "cmake/jsoncpp.cmake",
    "content": "# Copyright (C) 2018 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\ninclude(ExternalProject)\n\nExternalProject_Add(jsoncpp\n    PREFIX \"${CMAKE_CURRENT_BINARY_DIR}/jsoncpp\"\n    URL https://github.com/open-source-parsers/jsoncpp/archive/1.8.4.tar.gz\n    URL_HASH SHA256=c49deac9e0933bcb7044f08516861a2d560988540b23de2ac1ad443b219afdb6\n    TIMEOUT 30\n    INSTALL_COMMAND \"\"\n    CMAKE_ARGS -DJSONCPP_WITH_PKGCONFIG_SUPPORT=OFF -DJSONCPP_WITH_POST_BUILD_UNITTEST=OFF -DJSONCPP_WITH_TESTS=OFF -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}\n    DOWNLOAD_NO_PROGRESS true\n    )\n\nset_property(DIRECTORY PROPERTY CLEAN_NO_CUSTOM\n    \"${CMAKE_CURRENT_BINARY_DIR}/jsoncpp\")\n\nExternalProject_Get_Property(jsoncpp source_dir)\nset(JSONCPP_INCLUDE_DIRS ${source_dir}/include)\ninclude_directories(${JSONCPP_INCLUDE_DIRS})\n\nExternalProject_Get_Property(jsoncpp binary_dir)\nlink_directories(${binary_dir}/src/lib_json/)\n\nset(JSONCPP_LIBRARIES ${binary_dir}/src/lib_json/libjsoncpp.a)\n"
  },
  {
    "path": "cmake/openssl.cmake",
    "content": "# Copyright (C) 2018 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\ninclude(ExternalProject)\ninclude(ProcessorCount)\n\n# Prevent travis gcc crashes...\nif (DEFINED ENV{TRAVIS})\n    set(BUILD_FLAGS -j8)\nelse()\n    ProcessorCount(N)\n    if(NOT N EQUAL 0)\n        set(BUILD_FLAGS -j${N})\n    endif()\nendif()\n\n# platform detection\nif (APPLE)\n    set(OPENSSL_BUILD_PLATFORM darwin64-x86_64-cc)\nelse()\n    set(OPENSSL_BUILD_PLATFORM linux-x86_64)\nendif()\n\nExternalProject_Add(openssl\n    PREFIX \"${CMAKE_CURRENT_BINARY_DIR}/openssl\"\n    URL https://www.openssl.org/source/openssl-1.1.1.tar.gz\n    URL_HASH SHA256=2836875a0f89c03d0fdf483941512613a50cfb421d6fd94b9f41d7279d586a3d\n    TIMEOUT 30\n    INSTALL_COMMAND \"\"\n    DOWNLOAD_NO_PROGRESS true\n    CONFIGURE_COMMAND \"${CMAKE_CURRENT_BINARY_DIR}/openssl/src/openssl/Configure\" ${OPENSSL_BUILD_PLATFORM}\n    BUILD_COMMAND make ${BUILD_FLAGS}\n    )\n\nset_property(DIRECTORY PROPERTY CLEAN_NO_CUSTOM\n    \"${CMAKE_CURRENT_BINARY_DIR}/openssl\")\n\nExternalProject_Get_Property(openssl source_dir)\nExternalProject_Get_Property(openssl binary_dir)\n\nset(OPENSSL_INCLUDE_DIR ${source_dir}/include ${binary_dir}/include)\nset(OPENSSL_LIBRARIES ${binary_dir}/libcrypto.a ${binary_dir}/libssl.a dl pthread)\n"
  },
  {
    "path": "cmake/rocksdb.cmake",
    "content": "# Copyright (C) 2018 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\ninclude(ExternalProject)\ninclude(ProcessorCount)\ninclude(FindZLIB)\n\n# find snappy...\nfind_path(SNAPPY_INCLUDE_DIR\n    NAMES snappy.h\n    HINTS ${SNAPPY_ROOT_DIR}/include)\n\nfind_library(SNAPPY_LIBRARIES\n    NAMES snappy\n    HINTS ${SNAPPY_ROOT_DIR}/lib)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Snappy DEFAULT_MSG\n    SNAPPY_LIBRARIES\n    SNAPPY_INCLUDE_DIR)\n\nmark_as_advanced(\n    SNAPPY_ROOT_DIR\n    SNAPPY_LIBRARIES\n    SNAPPY_INCLUDE_DIR)\n\n# find bzip2...\nfind_path(BZIP2_INCLUDE_DIR\n    NAMES bzlib.h\n    HINTS ${BZIP2_ROOT_DIR}/include)\n\nfind_library(BZIP2_LIBRARIES\n    NAMES bz2\n    HINTS ${BZIP2_ROOT_DIR}/lib)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Bzip2 DEFAULT_MSG\n    BZIP2_LIBRARIES\n    BZIP2_INCLUDE_DIR)\n\nmark_as_advanced(\n    BZIP2_ROOT_DIR\n    BZIP2_LIBRARIES\n    BZIP2_INCLUDE_DIR)\n\n# Prevent travis gcc crashes...\nif (DEFINED ENV{TRAVIS})\n    set(BUILD_FLAGS -j8)\nelse()\n    ProcessorCount(N)\n    if(NOT N EQUAL 0)\n        set(BUILD_FLAGS -j${N})\n    endif()\nendif()\n\nExternalProject_Add(rocksdb\n    PREFIX \"${CMAKE_CURRENT_BINARY_DIR}/rocksdb\"\n    URL https://github.com/facebook/rocksdb/archive/v5.14.3.tar.gz\n    URL_HASH SHA256=c7019a645fc23df0adfe97ef08e793a36149bff2f57ef3b6174cbb0c8c9867b1\n    TIMEOUT 30\n    INSTALL_COMMAND \"\"\n    CONFIGURE_COMMAND \"\"\n    BUILD_COMMAND PORTABLE=1 make -e DISABLE_JEMALLOC=1 static_lib ${BUILD_FLAGS}\n    BUILD_IN_SOURCE true\n    DOWNLOAD_NO_PROGRESS true\n    )\n\nset_property(DIRECTORY PROPERTY CLEAN_NO_CUSTOM\n    \"${CMAKE_CURRENT_BINARY_DIR}/rocksdb\")\n\nExternalProject_Get_Property(rocksdb source_dir)\nset(ROCKSDB_INCLUDE_DIRS ${source_dir}/include)\n\nExternalProject_Get_Property(rocksdb binary_dir)\nlink_directories(${binary_dir}/)\n\nset(ROCKSDB_LIBRARIES ${binary_dir}/librocksdb.a ${SNAPPY_LIBRARIES} ${ZLIB_LIBRARIES} ${BZIP2_LIBRARIES})\n\nif (APPLE)\n    find_library(LZ4_LIBRARY NAMES liblz4.a)\n    message(STATUS ${LZ4_LIBRARY})\n    list(APPEND ROCKSDB_LIBRARIES ${LZ4_LIBRARY})\n\n    # rocksdb may of found these libraries...\n    find_library(ZSTD_LIBRARY NAMES libzstd.a)\n    if (ZSTD_LIBRARY)\n        message(STATUS ${ZSTD_LIBRARY})\n       list(APPEND ROCKSDB_LIBRARIES ${ZSTD_LIBRARY})\n    endif()\n\n    find_library(TBB_LIBRARY NAMES libtbb.a)\n    if (TBB_LIBRARY)\n        message(STATUS ${TBB_LIBRARY})\n        list(APPEND ROCKSDB_LIBRARIES ${TBB_LIBRARY})\n    endif()\nendif()\n"
  },
  {
    "path": "cmake/static_analysis.cmake",
    "content": "# Copyright (C) 2018 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\nadd_custom_target(static_analysis)\n\n# copy paste detection...\nif (NOT DEFINED \"PMD_EXE\")\n    find_program(PMD_EXE NAMES pmd run.sh)\nendif()\nmessage(STATUS \"pmd: ${PMD_EXE}\")\n\nif (PMD_EXE)\n    add_custom_target(cpd COMMAND ${CMAKE_SOURCE_DIR}/cmake/static_analysis.sh cpd ${PMD_EXE} ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR})\n    add_dependencies(static_analysis cpd)\nendif()\n\n# complexity analysis...\nfind_program(PMCCABE_EXE NAMES pmccabe)\nmessage(STATUS \"pmccabe: ${PMCCABE_EXE}\")\n\nif (PMCCABE_EXE)\n    add_custom_target(pmccabe COMMAND ${CMAKE_SOURCE_DIR}/cmake/static_analysis.sh pmccabe ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR})\n    add_dependencies(static_analysis pmccabe)\nendif()\n"
  },
  {
    "path": "cmake/static_analysis.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright (C) 2018 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n# set -x\n\nTEMP_FILE=$(mktemp)\n\ncase \"$1\" in\n    cpd)\n        find \"$3\" -not \\( -path \"$4\" -prune \\) -name \"*.cpp\" -not -name \"*_test.cpp\" -o -name \"*.hpp\" > $TEMP_FILE\n        $2 cpd --minimum-tokens 115 --language cpp --filelist $TEMP_FILE\n    ;;\n    pmccabe)\n        echo \"Modified McCabe Cyclomatic Complexity\"\n        echo \"|   Traditional McCabe Cyclomatic Complexity\"\n        echo \"|       |    # Statements in function\"\n        echo \"|       |        |   First line of function\"\n        echo \"|       |        |       |   # lines in function\"\n        echo \"|       |        |       |       |  filename(definition line number):function\"\n        echo \"|       |        |       |       |           |\"\n        pmccabe $(find \"$2\" -not \\( -path \"$3\" -prune \\) -name \"*.cpp\" -not -name \"*_test.cpp\" -o -name \"*.hpp\") 2> $TEMP_FILE | sort -nr\n        echo \"-----------------------------------------------------------------------------\"\n        echo Parse errors:\n        echo\n        cat $TEMP_FILE\n    ;;\nesac\n\nrm $TEMP_FILE\n"
  },
  {
    "path": "cmake/swarm_git_commit.hpp.in",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#define SWARM_GIT_COMMIT    \"@SWARM_GIT_COMMIT@\"\n"
  },
  {
    "path": "cmake/swarm_version.cmake",
    "content": "# Copyright (C) 2018 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n# version for swarm\nset(PROJECT_VERSION_MAJOR 0 CACHE STRING \"Set the project major version\")\nset(PROJECT_VERSION_MINOR 0 CACHE STRING \"Set the project minor version\")\nset(PROJECT_VERSION_PATCH \"0-desk\" CACHE STRING \"Set the project patch version\")\nset(PROJECT_VERSION \"${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}\" CACHE STRING \"\")\n"
  },
  {
    "path": "cmake/swarm_version.hpp.in",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#define SWARM_VERSION     \"@PROJECT_VERSION@\""
  },
  {
    "path": "crud/CMakeLists.txt",
    "content": "add_library(crud STATIC\n    crud_base.hpp\n    subscription_manager.cpp\n    subscription_manager.hpp\n    subscription_manager_base.hpp\n    crud.cpp\n    crud.hpp\n    )\n\ntarget_link_libraries(crud proto policy)\nadd_dependencies(crud boost jsoncpp openssl)\ntarget_include_directories(crud PRIVATE ${BLUZELLE_STD_INCLUDES})\nadd_subdirectory(test)\n"
  },
  {
    "path": "crud/crud.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <crud/crud.hpp>\n#include <policy/random.hpp>\n#include <policy/volatile_ttl.hpp>\n#include <utils/make_endpoint.hpp>\n#include <functional>\n#include <boost/algorithm/string/trim_all.hpp>\n#include <boost/lexical_cast.hpp>\n#include <boost/random/uniform_int_distribution.hpp>\n#include <boost/random/mersenne_twister.hpp>\n\nusing namespace bzn;\nusing namespace std::placeholders;\n\n\nnamespace\n{\n    const std::string PERMISSION_UUID{\"PERMS\"};\n    const std::string OWNER_KEY{\"OWNER\"};\n    const std::string WRITERS_KEY{\"WRITERS\"};\n    const std::string MAX_SIZE_KEY{\"MAX_SIZE\"};\n    const std::string EVICTION_POLICY_KEY{\"EVICTION_POLICY\"};\n\n    const std::string TTL_UUID{\"TTL\"};\n    const std::chrono::seconds TTL_TICK{5}; // not too aggressive\n\n    inline bzn::key_t generate_expire_key(const bzn::uuid_t& uuid, const bzn::key_t& key)\n    {\n        Json::Value value;\n\n        value[\"uuid\"] = uuid;\n        value[\"key\"] = key;\n\n        return value.toStyledString();\n    }\n\n    inline std::pair<bzn::uuid_t, bzn::key_t> extract_uuid_key(const bzn::key_t& key)\n    {\n        Json::CharReaderBuilder rbuilder;\n        std::unique_ptr<Json::CharReader> const reader(rbuilder.newCharReader());\n        std::string parse_errors;\n\n        Json::Value json;\n\n        if (!reader->parse(key.c_str(), key.c_str() + key.size(), &json, &parse_errors))\n        {\n            throw std::runtime_error(\"Failed to parse database json ttl data: \" + parse_errors);\n        }\n\n        return std::make_pair(json[\"uuid\"].asString(), json[\"key\"].asString());\n    }\n}\n\n\ncrud::crud(std::shared_ptr<bzn::asio::io_context_base> io_context,\n           std::shared_ptr<bzn::storage_base> storage,\n           std::shared_ptr<bzn::subscription_manager_base> subscription_manager,\n           std::shared_ptr<bzn::node_base> node, bzn::key_t owner_public_key)\n           : storage(std::move(storage))\n           , subscription_manager(std::move(subscription_manager))\n           , node(std::move(node))\n           , expire_timer(io_context->make_unique_steady_timer())\n           , message_handlers{\n                 {database_msg::kCreate,        std::bind(&crud::handle_create,         this, _1, _2, _3)},\n                 {database_msg::kRead,          std::bind(&crud::handle_read,           this, _1, _2, _3)},\n                 {database_msg::kUpdate,        std::bind(&crud::handle_update,         this, _1, _2, _3)},\n                 {database_msg::kDelete,        std::bind(&crud::handle_delete,         this, _1, _2, _3)},\n                 {database_msg::kHas,           std::bind(&crud::handle_has,            this, _1, _2, _3)},\n                 {database_msg::kKeys,          std::bind(&crud::handle_keys,           this, _1, _2, _3)},\n                 {database_msg::kSize,          std::bind(&crud::handle_size,           this, _1, _2, _3)},\n                 {database_msg::kSubscribe,     std::bind(&crud::handle_subscribe,      this, _1, _2, _3)},\n                 {database_msg::kUnsubscribe,   std::bind(&crud::handle_unsubscribe,    this, _1, _2, _3)},\n                 {database_msg::kCreateDb,      std::bind(&crud::handle_create_db,      this, _1, _2, _3)},\n                 {database_msg::kUpdateDb,      std::bind(&crud::handle_update_db,      this, _1, _2, _3)},\n                 {database_msg::kDeleteDb,      std::bind(&crud::handle_delete_db,      this, _1, _2, _3)},\n                 {database_msg::kHasDb,         std::bind(&crud::handle_has_db,         this, _1, _2, _3)},\n                 {database_msg::kWriters,       std::bind(&crud::handle_writers,        this, _1, _2, _3)},\n                 {database_msg::kAddWriters,    std::bind(&crud::handle_add_writers,    this, _1, _2, _3)},\n                 {database_msg::kRemoveWriters, std::bind(&crud::handle_remove_writers, this, _1, _2, _3)},\n                 {database_msg::kQuickRead,     std::bind(&crud::handle_read,           this, _1, _2, _3)},\n                 {database_msg::kTtl,           std::bind(&crud::handle_ttl,            this, _1, _2, _3)},\n                 {database_msg::kPersist,       std::bind(&crud::handle_persist,        this, _1, _2, _3)},\n                 {database_msg::kExpire,        std::bind(&crud::handle_expire,         this, _1, _2, _3)}}\n           , owner_public_key(std::move(owner_public_key))\n{\n}\n\n\nvoid\ncrud::start(std::shared_ptr<bzn::pbft_base> pbft, const size_t max_swarm_storage)\n{\n    std::call_once(this->start_once,\n        [this, pbft, max_swarm_storage]()\n        {\n            this->pbft = std::move(pbft);\n\n            this->max_swarm_storage = max_swarm_storage;\n\n            this->subscription_manager->start();\n\n            this->expire_timer->expires_from_now(TTL_TICK);\n            this->expire_timer->async_wait(std::bind(&crud::check_key_expiration, shared_from_this(), std::placeholders::_1));\n        });\n}\n\n\nvoid\ncrud::handle_request(const bzn::caller_id_t& caller_id, const database_msg& request, const std::shared_ptr<bzn::session_base> session)\n{\n    if (auto it = this->message_handlers.find(request.msg_case()); it != this->message_handlers.end())\n    {\n        LOG(debug) << \"processing message: \" << uint32_t(request.msg_case());\n\n        it->second(caller_id, request, session);\n\n        return;\n    }\n\n    LOG(error) << \"unknown request: \" << uint32_t(request.msg_case());\n}\n\n\nvoid\ncrud::send_response(const database_msg& request, const bzn::storage_result result,\n    database_response&& response, std::shared_ptr<bzn::session_base>& session)\n{\n    *response.mutable_header() = request.header();\n\n    if (result != bzn::storage_result::ok)\n    {\n        if (bzn::storage_result_msg.count(result))\n        {\n\t\t\t// special response error case...\n\t\t\tif (request.msg_case() == database_msg::kQuickRead)\n\t\t\t{\n\t\t\t\tresponse.mutable_quick_read()->set_error(bzn::storage_result_msg.at(result));\n\t\t\t}\n        \telse\n\t\t\t{\n\t\t\t\tresponse.mutable_error()->set_message(bzn::storage_result_msg.at(result));\n\t\t\t}\n        }\n        else\n        {\n            LOG(error) << \"unknown error code: \" << uint32_t(result);\n        }\n    }\n\n    bzn_envelope env;\n    env.set_database_response(response.SerializeAsString());\n\n    if (session)\n    {\n        // special response case that does not require signing...\n        if (request.msg_case() == database_msg::kQuickRead)\n        {\n            session->send_message(std::make_shared<bzn::encoded_message >(env.SerializeAsString()));\n        }\n        else\n        {\n            LOG(trace) << \"Sending response via session\";\n            session->send_signed_message(std::make_shared<bzn_envelope>(env));\n        }\n    }\n    else\n    {\n        LOG(warning) << \"session not set - response for the \" << uint32_t(request.msg_case()) << \" operation not sent via session\";\n    }\n\n    if (this->node && !response.header().point_of_contact().empty())\n    {\n        LOG(trace) << \"Sending response via PoC: \" << response.header().point_of_contact();\n        try\n        {\n            this->node->send_signed_message(response.header().point_of_contact(), std::make_shared<bzn_envelope>(env));\n        }\n        catch(const std::runtime_error& err)\n        {\n            LOG(error) << err.what();\n        }\n    }\n    else\n    {\n        LOG(warning) << \"Unable to send response for the \" << uint32_t(request.msg_case()) << \" operation to point of contact - node not set in crud module\";\n    }\n}\n\n\nvoid\ncrud::handle_create(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session)\n{\n    bzn::storage_result result{bzn::storage_result::db_not_found};\n\n    std::lock_guard<std::shared_mutex> lock(this->crud_lock); // lock for write access\n\n    auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid());\n\n    if (db_exists)\n    {\n        if (!this->is_caller_a_writer(caller_id, perms))\n        {\n            result = bzn::storage_result::access_denied;\n        }\n        else\n        {\n            // bail on key value pairs that are too large right away!\n            if (this->max_database_size(perms) && request.create().key().length() + request.create().value().length() > this->max_database_size(perms))\n            {\n                this->send_response(request, bzn::storage_result::value_too_large, database_response(), session);\n\n                return;\n            }\n\n            if (this->expired(request.header().db_uuid(), request.create().key()))\n            {\n                this->send_response(request, bzn::storage_result::delete_pending, database_response(), session);\n\n                return;\n            }\n\n            if (this->operation_exceeds_available_space(request, perms))\n            {\n                if (!this->do_eviction(request, this->max_database_size(perms)))\n                {\n                    this->send_response(request, bzn::storage_result::db_full, database_response(), session);\n\n                    return;\n                }\n            }\n\n            result = this->storage->create(request.header().db_uuid(), request.create().key(), request.create().value());\n\n            if (result == bzn::storage_result::ok)\n            {\n                this->update_expiration_entry(generate_expire_key(request.header().db_uuid(), request.create().key()),\n                        request.create().expire());\n\n                this->subscription_manager->inspect_commit(request);\n            }\n        }\n    }\n\n    this->send_response(request, result, database_response(), session);\n}\n\n\nvoid\ncrud::handle_read(const bzn::caller_id_t& /*caller_id*/, const database_msg& request, std::shared_ptr<bzn::session_base> session)\n{\n    std::shared_lock<std::shared_mutex> lock(this->crud_lock); // lock for read access\n\n    if (!this->storage->has(PERMISSION_UUID, request.header().db_uuid()))\n    {\n        this->send_response(request, bzn::storage_result::db_not_found, database_response(), session);\n\n        return;\n    }\n\n    const bzn::key_t key = (request.msg_case() == database_msg::kRead) ? request.read().key() : request.quick_read().key();\n\n    // expired?\n    if (this->expired(request.header().db_uuid(), key))\n    {\n        this->send_response(request, bzn::storage_result::delete_pending, database_response(), session);\n\n        return;\n    }\n\n    const auto result = this->storage->read(request.header().db_uuid(), key);\n\n    database_response response;\n\n    if (result)\n    {\n        if (request.msg_case() == database_msg::kRead)\n        {\n            response.mutable_read()->set_key(key);\n            response.mutable_read()->set_value(*result);\n        }\n        else\n        {\n            response.mutable_quick_read()->set_key(key);\n            response.mutable_quick_read()->set_value(*result);\n        }\n    }\n\n    this->send_response(request, (result) ? bzn::storage_result::ok : bzn::storage_result::not_found, std::move(response), session);\n}\n\n\nvoid\ncrud::handle_update(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session)\n{\n    bzn::storage_result result{bzn::storage_result::db_not_found};\n\n    std::lock_guard<std::shared_mutex> lock(this->crud_lock); // lock for write access\n\n    const auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid());\n\n    if (db_exists)\n    {\n        if (!this->is_caller_a_writer(caller_id, perms))\n        {\n            result = bzn::storage_result::access_denied;\n        }\n        else\n        {\n            // bail on key value pairs that are too large right away!\n            if (this->max_database_size(perms) && request.create().key().length() + request.create().value().length() > this->max_database_size(perms))\n            {\n                this->send_response(request, bzn::storage_result::value_too_large, database_response(), session);\n\n                return;\n            }\n\n            // expired?\n            if (this->expired(request.header().db_uuid(), request.update().key()))\n            {\n                this->send_response(request, bzn::storage_result::delete_pending, database_response(), session);\n\n                return;\n            }\n\n            if (this->operation_exceeds_available_space(request, perms))\n            {\n                // let's try evicting some key/value pairs\n                if (!this->do_eviction(request, this->max_database_size(perms)))\n                {\n                    this->send_response(request, bzn::storage_result::db_full, database_response(), session);\n\n                    return;\n                }\n            }\n\n            result = this->storage->update(request.header().db_uuid(), request.update().key(), request.update().value());\n\n            if (result == bzn::storage_result::ok)\n            {\n                this->update_expiration_entry(generate_expire_key(request.header().db_uuid(), request.update().key()), request.update().expire());\n\n                this->subscription_manager->inspect_commit(request);\n            }\n        }\n    }\n\n    this->send_response(request, result, database_response(), session);\n}\n\n\nvoid\ncrud::handle_delete(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session)\n{\n    bzn::storage_result result{bzn::storage_result::db_not_found};\n\n    std::lock_guard<std::shared_mutex> lock(this->crud_lock); // lock for write access\n\n    const auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid());\n\n    if (db_exists)\n    {\n        if (!this->is_caller_a_writer(caller_id, perms))\n        {\n            result = bzn::storage_result::access_denied;\n        }\n        else\n        {\n            result = this->storage->remove(request.header().db_uuid(), request.delete_().key());\n\n            if (result == bzn::storage_result::ok)\n            {\n                this->subscription_manager->inspect_commit(request);\n\n                this->remove_expiration_entry(generate_expire_key(request.header().db_uuid(), request.delete_().key()));\n            }\n        }\n    }\n\n    this->send_response(request, result, database_response(), session);\n}\n\n\nvoid\ncrud::handle_ttl(const bzn::caller_id_t& /*caller_id*/, const database_msg& request, std::shared_ptr<bzn::session_base> session)\n{\n    std::shared_lock<std::shared_mutex> lock(this->crud_lock); // lock for read access\n\n    bool has = this->storage->has(request.header().db_uuid(), request.ttl().key());\n\n    // exists and expired?\n    if (has && this->expired(request.header().db_uuid(), request.ttl().key()))\n    {\n        this->send_response(request, bzn::storage_result::delete_pending, database_response(), session);\n\n        return;\n    }\n\n    database_response response;\n\n    if (has)\n    {\n        const auto ttl = this->get_ttl(request.header().db_uuid(), request.ttl().key());\n\n        if (ttl)\n        {\n            response.mutable_ttl()->set_key(request.ttl().key());\n            response.mutable_ttl()->set_ttl(*ttl);\n        }\n        else\n        {\n            has = false; // we don't have a ttl value for this key\n        }\n    }\n\n    this->send_response(request, (has) ? bzn::storage_result::ok : bzn::storage_result::ttl_not_found, std::move(response), session);\n}\n\n\nvoid\ncrud::handle_persist(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session)\n{\n    bzn::storage_result result{bzn::storage_result::db_not_found};\n\n    std::lock_guard<std::shared_mutex> lock(this->crud_lock); // lock for write access\n\n    const auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid());\n\n    if (db_exists)\n    {\n        if (!this->is_caller_a_writer(caller_id, perms))\n        {\n            result = bzn::storage_result::access_denied;\n        }\n        else\n        {\n            const auto generated_key = generate_expire_key(request.header().db_uuid(), request.persist().key());\n\n            const bool has = this->storage->has(TTL_UUID, generated_key);\n\n            // expired?\n            if (has && this->expired(request.header().db_uuid(), request.persist().key()))\n            {\n                this->send_response(request, bzn::storage_result::delete_pending, database_response(), session);\n\n                return;\n            }\n\n            if (has)\n            {\n                this->remove_expiration_entry(generated_key);\n\n                result = bzn::storage_result::ok;\n            }\n            else\n            {\n                result = bzn::storage_result::ttl_not_found;\n            }\n        }\n    }\n\n    this->send_response(request, result, database_response(), session);\n}\n\n\nvoid\ncrud::handle_expire(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session)\n{\n    bzn::storage_result result{bzn::storage_result::db_not_found};\n\n    std::lock_guard<std::shared_mutex> lock(this->crud_lock); // lock for write access\n\n    const auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid());\n\n    if (db_exists)\n    {\n        if (!this->is_caller_a_writer(caller_id, perms))\n        {\n            result = bzn::storage_result::access_denied;\n        }\n        else\n        {\n            const auto generated_key = generate_expire_key(request.header().db_uuid(), request.expire().key());\n\n            const bool has = this->storage->has(TTL_UUID, generated_key);\n\n            // expired?\n            if (has && this->expired(request.header().db_uuid(), request.expire().key()))\n            {\n                this->send_response(request, bzn::storage_result::delete_pending, database_response(), session);\n\n                return;\n            }\n\n            // do not allow zero expires...\n            if (request.expire().expire() == 0)\n            {\n                result = bzn::storage_result::invalid_argument;\n            }\n            else\n            {\n                result = bzn::storage_result::not_found;\n\n                // assume if ttl entry exists so does the db entry...\n                if (has)\n                {\n                    this->remove_expiration_entry(generated_key);\n\n                    result = bzn::storage_result::ok;\n\n                    this->update_expiration_entry(generated_key, request.expire().expire());\n                }\n                else\n                {\n                    if (this->storage->has(request.header().db_uuid(), request.expire().key()))\n                    {\n                        result = bzn::storage_result::ok;\n\n                        this->update_expiration_entry(generated_key, request.expire().expire());\n                    }\n                    else\n                    {\n                        result = bzn::storage_result::not_found;\n                    }\n                }\n            }\n        }\n    }\n\n    this->send_response(request, result, database_response(), session);\n}\n\n\nvoid\ncrud::handle_has(const bzn::caller_id_t& /*caller_id*/, const database_msg& request, std::shared_ptr<bzn::session_base> session)\n{\n    bzn::storage_result result{bzn::storage_result::ok};\n\n    std::shared_lock<std::shared_mutex> lock(this->crud_lock); // lock for read access\n\n    database_response response;\n\n    response.mutable_has()->set_key(request.has().key());\n\n    if (this->expired(request.header().db_uuid(), request.has().key()))\n    {\n        response.mutable_has()->set_has(false);\n    }\n    else\n    {\n        if (this->storage->has(PERMISSION_UUID, request.header().db_uuid()))\n        {\n            response.mutable_has()->set_has(this->storage->has(request.header().db_uuid(), request.has().key()));\n        }\n        else\n        {\n            result = bzn::storage_result::db_not_found;\n        }\n    }\n\n    this->send_response(request, result, std::move(response), session);\n}\n\n\nvoid\ncrud::handle_keys(const bzn::caller_id_t& /*caller_id*/, const database_msg& request, std::shared_ptr<bzn::session_base> session)\n{\n    bzn::storage_result result{bzn::storage_result::ok};\n\n    std::shared_lock<std::shared_mutex> lock(this->crud_lock); // lock for read access\n\n    database_response response;\n\n    if (this->storage->has(PERMISSION_UUID, request.header().db_uuid()))\n    {\n        const auto keys = this->storage->get_keys(request.header().db_uuid());\n\n        response.mutable_keys();\n\n        for (const auto& key : keys)\n        {\n            if (!this->expired(request.header().db_uuid(), key))\n            {\n                response.mutable_keys()->add_keys(key);\n            }\n        }\n    }\n    else\n    {\n        result = bzn::storage_result::db_not_found;\n    }\n\n    this->send_response(request, result, std::move(response), session);\n}\n\n\nvoid\ncrud::handle_size(const bzn::caller_id_t& /*caller_id*/, const database_msg& request, std::shared_ptr<bzn::session_base> session)\n{\n    std::shared_lock<std::shared_mutex> lock(this->crud_lock); // lock for read access\n\n    const auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid());\n\n    if (!db_exists)\n    {\n        this->send_response(request, bzn::storage_result::db_not_found, database_response(), session);\n\n        return;\n    }\n\n    const auto [keys, size] = this->storage->get_size(request.header().db_uuid());\n\n    database_response response;\n\n    response.mutable_size()->set_keys(keys);\n    response.mutable_size()->set_bytes(size);\n\n    if (const auto max_size = this->max_database_size(perms); max_size)\n    {\n        response.mutable_size()->set_remaining_bytes((size < max_size) ? (max_size - size) : (0));\n        response.mutable_size()->set_max_size(max_size);\n    }\n\n    this->send_response(request, bzn::storage_result::ok, std::move(response), session);\n}\n\n\nvoid\ncrud::handle_subscribe(const bzn::caller_id_t& /*caller_id*/, const database_msg& request, std::shared_ptr<bzn::session_base> session)\n{\n    if (session)\n    {\n        database_response response;\n\n        this->subscription_manager->subscribe(request.header().db_uuid(), request.subscribe().key(),\n            request.header().nonce(), response, session);\n\n        this->send_response(request, bzn::storage_result::ok, std::move(response), session);\n\n        return;\n    }\n\n    LOG(warning) << \"session no longer available. SUBSCRIBE not executed.\";\n}\n\n\nvoid\ncrud::handle_unsubscribe(const bzn::caller_id_t& /*caller_id*/, const database_msg& request, std::shared_ptr<bzn::session_base> session)\n{\n    if (session)\n    {\n        database_response response;\n\n        this->subscription_manager->unsubscribe(request.header().db_uuid(), request.unsubscribe().key(),\n            request.unsubscribe().nonce(), response, session);\n\n        this->send_response(request, bzn::storage_result::ok, std::move(response), session);\n\n        return;\n    }\n\n    // subscription manager will cleanup stale sessions...\n    LOG(warning) << \"session no longer available. UNSUBSCRIBE not executed.\";\n}\n\n\nvoid\ncrud::handle_create_db(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session)\n{\n    bzn::storage_result result{bzn::storage_result::ok};\n\n    std::lock_guard<std::shared_mutex> lock(this->crud_lock); // lock for write access\n\n    if (!this->owner_public_key.empty() && (this->owner_public_key != caller_id))\n    {\n        result = bzn::storage_result::access_denied;\n    }\n    else if (this->storage->has(PERMISSION_UUID, request.header().db_uuid()))\n    {\n        result = bzn::storage_result::db_exists;\n    }\n    else\n    {\n        const Json::Value perms = this->create_permission_data(caller_id, request.create_db());\n\n        // Check max_database_size and if requested database is set to unlimited!\n        if ((request.create_db().max_size() == 0) && this->max_swarm_storage)\n        {\n            LOG(debug) << \"attempting to create a database with no limits (max_swarm_storage = \" << this->max_swarm_storage << \")\";\n\n            result = bzn::storage_result::invalid_size;\n        }\n        else\n        {\n            if (!this->operation_exceeds_available_space(request, perms))\n            {\n                result = this->storage->create(PERMISSION_UUID, request.header().db_uuid(), perms.toStyledString());\n            }\n            else\n            {\n                result = bzn::storage_result::db_full;\n            }\n        }\n    }\n\n    this->send_response(request, result, database_response(), session);\n}\n\n\nvoid\ncrud::handle_update_db(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session)\n{\n    bzn::storage_result result{bzn::storage_result::db_not_found};\n\n    std::lock_guard<std::shared_mutex> lock(this->crud_lock); // lock for write access\n\n    auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid());\n\n    if (db_exists)\n    {\n        if (!this->is_caller_owner(caller_id, perms))\n        {\n            result = bzn::storage_result::access_denied;\n        }\n        else\n        {\n            // Check max_database_size and if requested database is set to unlimited!\n            if ((request.update_db().max_size() == 0) && this->max_swarm_storage)\n            {\n                LOG(debug) << \"attempting to update a database with no limits (max_swarm_storage = \" << this->max_swarm_storage << \")\";\n\n                result = bzn::storage_result::invalid_size;\n            }\n            else\n            {\n                // only check if max size has grown...\n                if (request.update_db().max_size() > perms[MAX_SIZE_KEY].asUInt64())\n                {\n                    auto new_perms = perms;\n\n                    new_perms[MAX_SIZE_KEY] = request.update_db().max_size();\n\n                    if (this->operation_exceeds_available_space(request, new_perms))\n                    {\n                        this->send_response(request, bzn::storage_result::db_full, database_response(), session);\n\n                        return;\n                    }\n                }\n\n                result = this->storage->update(PERMISSION_UUID, request.header().db_uuid(),\n                    this->update_permission_data(perms, request.update_db()));\n            }\n        }\n    }\n\n    this->send_response(request, result, database_response(), session);\n}\n\n\nvoid\ncrud::handle_delete_db(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session)\n{\n    bzn::storage_result result{bzn::storage_result::db_not_found};\n\n    std::lock_guard<std::shared_mutex> lock(this->crud_lock); // lock for write access\n\n    const auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid());\n\n    if (!this->owner_public_key.empty() && (this->owner_public_key != caller_id))\n    {\n        result = bzn::storage_result::access_denied;\n    }\n    else if (db_exists)\n    {\n        if (!this->is_caller_owner(caller_id, perms))\n        {\n            result = bzn::storage_result::access_denied;\n        }\n        else\n        {\n            result = this->storage->remove(PERMISSION_UUID, request.header().db_uuid());\n\n            this->storage->remove(request.header().db_uuid());\n\n            this->flush_expiration_entries(request.header().db_uuid());\n        }\n    }\n\n    this->send_response(request, result, database_response(), session);\n}\n\n\nvoid\ncrud::handle_has_db(const bzn::caller_id_t& /*caller_id*/, const database_msg& request, std::shared_ptr<bzn::session_base> session)\n{\n    std::shared_lock<std::shared_mutex> lock(this->crud_lock); // lock for read access\n\n    database_response response;\n\n    response.mutable_has_db()->set_uuid(request.header().db_uuid());\n    response.mutable_has_db()->set_has(this->storage->has(PERMISSION_UUID, request.header().db_uuid()));\n\n    this->send_response(request, bzn::storage_result::ok, std::move(response), session);\n}\n\n\nvoid\ncrud::handle_writers(const bzn::caller_id_t& /*caller_id*/, const database_msg& request, std::shared_ptr<bzn::session_base> session)\n{\n     bzn::storage_result result{bzn::storage_result::not_found};\n     std::shared_lock<std::shared_mutex> lock(this->crud_lock); // lock for read access\n\n     const auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid());\n\n     if (db_exists)\n     {\n         database_response resp;\n\n         resp.mutable_writers()->set_owner(perms[OWNER_KEY].asString());\n\n         for(const auto& writer : perms[WRITERS_KEY])\n         {\n             resp.mutable_writers()->add_writers(writer.asString());\n         }\n\n         this->send_response(request, bzn::storage_result::ok, std::move(resp), session);\n\n         return;\n     }\n     else\n     {\n         this->send_response(request, result, database_response(), session);\n     }\n}\n\n\nvoid\ncrud::handle_add_writers(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session)\n{\n    bzn::storage_result result{bzn::storage_result::db_not_found};\n\n    std::lock_guard<std::shared_mutex> lock(this->crud_lock); // lock for write access\n\n    auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid());\n\n    if (db_exists)\n    {\n        if (!this->is_caller_owner(caller_id, perms))\n        {\n            result = bzn::storage_result::access_denied;\n        }\n        else\n        {\n            this->add_writers(request, perms);\n\n            LOG(debug) << \"updating db perms: \" << perms.toStyledString().substr(0, MAX_MESSAGE_SIZE) << \"...\";\n\n            if (result = this->storage->update(PERMISSION_UUID, request.header().db_uuid(), perms.toStyledString()); result != bzn::storage_result::ok)\n            {\n                throw std::runtime_error(\"Failed to update database permissions: \" + bzn::storage_result_msg.at(result));\n            }\n        }\n    }\n\n    this->send_response(request, result, database_response(), session);\n}\n\n\nvoid\ncrud::handle_remove_writers(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session)\n{\n    bzn::storage_result result{bzn::storage_result::db_not_found};\n\n    std::lock_guard<std::shared_mutex> lock(this->crud_lock); // lock for write access\n\n    auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid());\n\n    if (db_exists)\n    {\n        if (!this->is_caller_owner(caller_id, perms))\n        {\n            result = bzn::storage_result::access_denied;\n        }\n        else\n        {\n            this->remove_writers(request, perms);\n\n            LOG(debug) << \"updating db perms: \" << perms.toStyledString().substr(0, MAX_MESSAGE_SIZE) << \"...\";\n\n            if (result = this->storage->update(PERMISSION_UUID, request.header().db_uuid(), perms.toStyledString()); result != bzn::storage_result::ok)\n            {\n                throw std::runtime_error(\"Failed to update database permissions: \" + bzn::storage_result_msg.at(result));\n            }\n        }\n    }\n\n    this->send_response(request, result, database_response(), session);\n}\n\n\nstd::pair<bool, Json::Value>\ncrud::get_database_permissions(const bzn::uuid_t& uuid) const\n{\n    // does the db exist?\n    if (this->storage->has(PERMISSION_UUID, uuid))\n    {\n        auto perms_data = this->storage->read(PERMISSION_UUID, uuid);\n\n        if (!perms_data)\n        {\n            throw std::runtime_error(\"Failed to read database permission data!\");\n        }\n\n        Json::CharReaderBuilder rbuilder;\n        std::unique_ptr<Json::CharReader> const reader(rbuilder.newCharReader());\n        std::string parse_errors;\n\n        Json::Value json;\n\n        if (!reader->parse((*perms_data).c_str(), (*perms_data).c_str() + (*perms_data).size(), &json, &parse_errors))\n        {\n            throw std::runtime_error(\"Failed to parse database json permission data: \" + parse_errors);\n        }\n\n        return {true, json};\n    }\n\n    return {false, Json::Value()};\n}\n\n\nJson::Value\ncrud::create_permission_data(const bzn::caller_id_t& caller_id, const database_create_db& request) const\n{\n    Json::Value json;\n\n    json[OWNER_KEY] = boost::trim_copy(caller_id);\n    json[WRITERS_KEY] = Json::Value(Json::arrayValue);\n    json[MAX_SIZE_KEY] = request.max_size();\n    json[EVICTION_POLICY_KEY] = uint16_t(request.eviction_policy());\n\n    LOG(debug) << \"created db perms: \" << json.toStyledString();\n\n    return json;\n}\n\n\nbzn::value_t\ncrud::update_permission_data(Json::Value& perms, const database_create_db& request) const\n{\n    perms[MAX_SIZE_KEY] = request.max_size();\n    perms[EVICTION_POLICY_KEY] = uint16_t(request.eviction_policy());\n\n    LOG(debug) << \"update db perms: \" << perms.toStyledString();\n\n    return perms.toStyledString();\n}\n\n\nbool\ncrud::is_caller_owner(const bzn::caller_id_t& caller_id, const Json::Value& perms) const\n{\n    return perms[OWNER_KEY] == boost::trim_copy(caller_id);\n}\n\n\nbool\ncrud::is_caller_a_writer(const bzn::caller_id_t& caller_id, const Json::Value& perms) const\n{\n    for (const auto& writer_id : perms[WRITERS_KEY])\n    {\n        if (writer_id == boost::trim_copy(caller_id))\n        {\n            return true;\n        }\n    }\n\n    // A node may be issuing an operation such as delete for key expiration...\n    // TODO: this may need to compare against all recent peers, not just current ones\n    for (const auto& peer_uuid : *this->pbft->peers()->current())\n    {\n        if (peer_uuid.uuid == boost::trim_copy(caller_id))\n        {\n            return true;\n        }\n    }\n\n    return this->is_caller_owner(caller_id, perms);\n}\n\n\nstd::shared_ptr<policy::eviction_base>\ncrud::get_eviction_policy(const Json::Value& perms)\n{\n    // TODO: As we add more policies we may want to turn this into the strategy pattern and use\n    // a registry based approach here\n    if (perms[EVICTION_POLICY_KEY] == database_create_db::RANDOM)\n    {\n        return std::make_shared<policy::random>(this->storage);\n    }\n    else if (perms[EVICTION_POLICY_KEY] == database_create_db::VOLATILE_TTL)\n    {\n        return std::make_shared<policy::volatile_ttl>(this->storage);\n    }\n\n    return nullptr;\n}\n\n\nuint64_t\ncrud::max_database_size(const Json::Value& perms) const\n{\n    return boost::lexical_cast<uint64_t>(perms[MAX_SIZE_KEY]);\n}\n\n\nvoid\ncrud::add_writers(const database_msg& request, Json::Value& perms)\n{\n    const std::string owner = perms[OWNER_KEY].asString();\n\n    std::set<std::string> current_writers;\n\n    for (const auto& writer : perms[WRITERS_KEY])\n    {\n        current_writers.emplace(writer.asString());\n    }\n\n    for (const auto& writer : request.add_writers().writers())\n    {\n        // owner never should be in the writers list...\n        if (writer != owner)\n        {\n            current_writers.insert(writer);\n        }\n    }\n\n    perms[WRITERS_KEY].clear();\n\n    for (auto&& writer : current_writers)\n    {\n        perms[WRITERS_KEY].append(std::move(writer));\n    }\n}\n\n\nvoid\ncrud::remove_writers(const database_msg& request, Json::Value& perms)\n{\n    std::set<std::string> current_writers;\n\n    for (auto& writer : perms[WRITERS_KEY])\n    {\n        current_writers.emplace(writer.asString());\n    }\n\n    for (const auto& writer : request.remove_writers().writers())\n    {\n        current_writers.erase(writer);\n    }\n\n    perms[WRITERS_KEY].clear();\n\n    for (auto&& writer : current_writers)\n    {\n        perms[WRITERS_KEY].append(std::move(writer));\n    }\n}\n\n\nbool\ncrud::save_state()\n{\n    std::lock_guard<std::shared_mutex> lock(this->crud_lock); // lock for write access\n\n    return this->storage->create_snapshot();\n}\n\n\nstd::shared_ptr<std::string>\ncrud::get_saved_state()\n{\n    std::shared_lock<std::shared_mutex> lock(this->crud_lock); // lock for read access\n\n    return this->storage->get_snapshot();\n}\n\n\nbool\ncrud::load_state(const std::string& state)\n{\n    std::lock_guard<std::shared_mutex> lock(this->crud_lock); // lock for write access\n\n    return this->storage->load_snapshot(state);\n}\n\n\nvoid\ncrud::update_expiration_entry(const bzn::key_t& generated_key, uint64_t expire)\n{\n    if (expire)\n    {\n        // now + expire seconds...\n        const auto expires = boost::lexical_cast<std::string>(\n            std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch()).count() + expire);\n\n        auto result = this->storage->create(TTL_UUID, generated_key, expires);\n\n        if (result == bzn::storage_result::ok)\n        {\n            LOG(debug) << \"created ttl entry [\" << expires << \"] for: \" << generated_key;\n\n            return;\n        }\n\n        result = this->storage->update(TTL_UUID, generated_key, expires);\n\n        if (result != bzn::storage_result::ok)\n        {\n            throw std::runtime_error(\"Failed to update ttl entry for: \" + generated_key);\n        }\n\n        return;\n    }\n\n    LOG(debug) << \"removing old entry for: \" << generated_key;\n\n    this->remove_expiration_entry(generated_key);\n}\n\n\nvoid\ncrud::remove_expiration_entry(const bzn::key_t& generated_key)\n{\n    this->storage->remove(TTL_UUID, generated_key);\n}\n\n\nbool\ncrud::expired(const bzn::uuid_t& uuid, const bzn::key_t& key)\n{\n    auto result = this->storage->read(TTL_UUID, generate_expire_key(uuid, key));\n\n    if (result)\n    {\n        const uint64_t now = uint64_t(std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch()).count());\n        const uint64_t expire = boost::lexical_cast<uint64_t>(*result);\n\n        return (expire <= now);\n    }\n\n    return false;\n}\n\n\nstd::optional<uint64_t>\ncrud::get_ttl(const bzn::uuid_t& uuid, const bzn::key_t& key) const\n{\n    const auto result = this->storage->read(TTL_UUID, generate_expire_key(uuid, key));\n\n    if (result)\n    {\n        const uint64_t now = uint64_t(std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch()).count());\n        const uint64_t expire = boost::lexical_cast<uint64_t>(*result);\n\n        if (expire > now)\n        {\n            return {boost::lexical_cast<uint64_t>(*result) -\n                std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch()).count()};\n        }\n\n        return {0};\n    }\n\n    return {};\n}\n\n\nvoid\ncrud::check_key_expiration(const boost::system::error_code& ec)\n{\n    if (!ec)\n    {\n        std::lock_guard<std::shared_mutex> lock(this->crud_lock); // lock for write access\n\n        const uint64_t now = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch()).count();\n\n        for (const auto& generated_key : this->storage->get_keys(TTL_UUID))\n        {\n            auto result = this->storage->read(TTL_UUID, generated_key);\n\n            if (result)\n            {\n                const auto [uuid, key] = extract_uuid_key(generated_key);\n\n                // has entry expired?\n                if (now >= boost::lexical_cast<uint64_t>(*result))\n                {\n                    LOG(debug) << \"removing expired ttl entry and key for: \" << uuid << \":\" << key;\n\n                    // Issue delete using pbft...\n                    database_msg request;\n                    request.mutable_header()->set_db_uuid(uuid);\n                    request.mutable_delete_()->set_key(key);\n\n                    bzn_envelope msg;\n                    msg.set_sender(this->pbft->get_uuid());\n                    msg.set_database_msg(request.SerializeAsString());\n\n                    this->pbft->handle_database_message(msg, nullptr);\n                }\n                else\n                {\n                    // if key no longer exists, then remove the entry...\n                    if (!this->storage->has(uuid, key))\n                    {\n                        LOG(debug) << \"removing stale ttl entry for: \" << uuid << \":\" << key;\n\n                        this->storage->remove(TTL_UUID, generated_key);\n                    }\n                }\n            }\n            else\n            {\n                std::runtime_error(\"Failed to read TTL value for: \" + generated_key);\n            }\n        }\n\n        this->expire_timer->expires_from_now(TTL_TICK);\n        this->expire_timer->async_wait(std::bind(&crud::check_key_expiration, shared_from_this(), std::placeholders::_1));\n    }\n}\n\n\nvoid\ncrud::flush_expiration_entries(const bzn::uuid_t& uuid)\n{\n    for (const auto& generated_key : this->storage->get_keys(TTL_UUID))\n    {\n        const auto [db_uuid, key] = extract_uuid_key(generated_key);\n\n        if (db_uuid == uuid)\n        {\n            this->storage->remove(TTL_UUID, generated_key);\n\n            LOG(debug) << \"removing ttl entry for: \" << db_uuid << \":\" << key;\n        }\n    }\n}\n\n\nbool\ncrud::operation_exceeds_available_space(const database_msg& request, const Json::Value& perms)\n{\n    const auto request_type = request.msg_case();\n    const auto max_size = this->max_database_size(perms);\n\n    if (request_type == database_msg::kCreateDb || request_type == database_msg::kUpdateDb)\n    {\n        if (!this->max_swarm_storage)\n        {\n            LOG(debug) << \"max storage zero, ignoring: \" << request.msg_case();\n\n            return false;\n        }\n\n        if (request_type == database_msg::kCreateDb)\n        {\n            return (this->get_swarm_storage_usage() + max_size > this->max_swarm_storage);\n        }\n\n        if (request_type == database_msg::kUpdateDb)\n        {\n            Json::Value prev_perms;\n            std::tie(std::ignore, prev_perms) = this->get_database_permissions(request.header().db_uuid());\n\n            return (this->get_swarm_storage_usage() - this->max_database_size(prev_perms) + max_size > this->max_swarm_storage);\n        }\n    }\n\n    // any max size set?\n    if (max_size)\n    {\n        uint64_t size;\n        std::tie(std::ignore, size) = this->storage->get_size(request.header().db_uuid());\n\n        // test create\n        if (request_type == database_msg::kCreate)\n        {\n            return (size + request.create().key().size() + request.create().value().size() > max_size);\n        }\n\n        // test update\n        if (request_type == database_msg::kUpdate)\n        {\n            const auto prev_kv_size = this->storage->get_key_size(request.header().db_uuid(),\n                request.update().key());\n\n            if (prev_kv_size)\n            {\n                return (size - *prev_kv_size + request.update().key().size() + request.update().value().size() > max_size);\n            }\n        }\n    }\n\n    return false;\n}\n\n\nsize_t\ncrud::get_swarm_storage_usage()\n{\n    const auto databases = this->storage->get_keys(PERMISSION_UUID);\n\n    size_t current_database_max_sizes{};\n\n    for(const auto& database : databases)\n    {\n        auto const result = this->storage->read(PERMISSION_UUID, database);\n\n        if (result)\n        {\n            Json::CharReaderBuilder rbuilder;\n            std::unique_ptr<Json::CharReader> const reader(rbuilder.newCharReader());\n            std::string parse_errors;\n\n            Json::Value json;\n\n            if (!reader->parse(result.value().c_str(), result.value().c_str() + result.value().size(), &json, &parse_errors))\n            {\n                throw std::runtime_error(\"Failed to parse database json uuid data: \" + parse_errors);\n            }\n\n            const auto max_size = this->max_database_size(json);\n\n            LOG(debug) << \"database: \" << database << \" \" << result.value();\n\n            current_database_max_sizes += max_size;\n        }\n    }\n\n    return current_database_max_sizes;\n}\n\n\nbool\ncrud::do_eviction(const database_msg& request, size_t max_size)\n{\n    const auto PERMS{this->get_database_permissions(request.header().db_uuid()).second};\n    if (auto eviction_policy = this->get_eviction_policy(PERMS))\n    {\n        auto keys_to_evict {eviction_policy->keys_to_evict(request, max_size)};\n        if (keys_to_evict.empty())\n        {\n            return false;\n        }\n\n        std::for_each( keys_to_evict.begin(), keys_to_evict.end(),\n            [&](const auto& key)\n            {\n                this->storage->remove(request.header().db_uuid(), key);\n            });\n\n        return true;\n    }\n\n    return false;\n}\n\n\nstd::string\ncrud::get_name()\n{\n    return \"crud\";\n}\n\n\nbzn::json_message\ncrud::get_status()\n{\n    bzn::json_message status;\n\n    std::shared_lock<std::shared_mutex> lock(this->crud_lock); // lock for read access\n\n    status[\"max_swarm_storage\"] = uint64_t(this->max_swarm_storage);\n    status[\"swarm_storage_usage\"] = uint64_t(this->get_swarm_storage_usage());\n\n    return status;\n}\n"
  },
  {
    "path": "crud/crud.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <crud/crud_base.hpp>\n#include <crud/subscription_manager_base.hpp>\n#include <include/bluzelle.hpp>\n#include <include/boost_asio_beast.hpp>\n#include <node/node_base.hpp>\n#include <options/options_base.hpp>\n#include <pbft/pbft_base.hpp>\n#include <policy/eviction_base.hpp>\n#include <status/status_provider_base.hpp>\n#include <storage/storage_base.hpp>\n#include <shared_mutex>\n#include <gtest/gtest_prod.h>\n\nnamespace bzn\n{\n    class crud final : public bzn::crud_base, public bzn::status_provider_base, public std::enable_shared_from_this<crud>\n    {\n    public:\n        crud(std::shared_ptr<bzn::asio::io_context_base> io_context, std::shared_ptr<bzn::storage_base> storage\n                , std::shared_ptr<bzn::subscription_manager_base> subscription_manager\n                , std::shared_ptr<bzn::node_base> node, bzn::key_t owner_public_key = \"\");\n\n        void handle_request(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session) override;\n\n        void start(std::shared_ptr<bzn::pbft_base> pbft, size_t max_storage = 0) override;\n\n        bool save_state() override;\n\n        std::shared_ptr<std::string> get_saved_state() override;\n\n        bool load_state(const std::string& state) override;\n\n        bzn::json_message get_status() override;\n\n        std::string get_name() override;\n\n    private:\n\n        void handle_create_db(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);\n        void handle_update_db(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);\n        void handle_delete_db(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);\n        void handle_has_db(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);\n        void handle_create(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);\n        void handle_read(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);\n        void handle_update(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);\n        void handle_delete(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);\n        void handle_ttl(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);\n        void handle_persist(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);\n        void handle_expire(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);\n        void handle_has(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);\n        void handle_keys(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);\n        void handle_size(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);\n        void handle_subscribe(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);\n        void handle_unsubscribe(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);\n        void handle_writers(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);\n        void handle_add_writers(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);\n        void handle_remove_writers(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);\n\n        void send_response(const database_msg& request, bzn::storage_result result, database_response&& response, std::shared_ptr<bzn::session_base>& session);\n\n        // permission...\n        std::pair<bool, Json::Value> get_database_permissions(const bzn::uuid_t& uuid) const;\n        Json::Value create_permission_data(const bzn::caller_id_t& caller_id, const database_create_db& request) const;\n        bzn::value_t update_permission_data(Json::Value& perms, const database_create_db& request) const;\n        size_t get_swarm_storage_usage();\n        bool is_caller_owner(const bzn::caller_id_t& caller_id, const Json::Value& perms) const;\n        bool is_caller_a_writer(const bzn::caller_id_t& caller_id, const Json::Value& perms) const;\n        void add_writers(const database_msg& request, Json::Value& perms);\n        void remove_writers(const database_msg& request, Json::Value& perms);\n        uint64_t max_database_size(const Json::Value& perms) const;\n        bool operation_exceeds_available_space(const database_msg& request, const Json::Value& perms);\n\n        // expiration...\n        void check_key_expiration(const boost::system::error_code& ec);\n        bool expired(const bzn::uuid_t& uuid, const bzn::key_t& key);\n        void update_expiration_entry(const bzn::uuid_t& generated_key, uint64_t expire);\n        void remove_expiration_entry(const bzn::key_t& generated_key);\n        void flush_expiration_entries(const bzn::uuid_t& uuid);\n        std::optional<uint64_t> get_ttl(const bzn::uuid_t& uuid, const bzn::key_t& key) const;\n\n        // cache replacement policy\n        std::shared_ptr<policy::eviction_base> get_eviction_policy(const Json::Value& perms);\n        bool do_eviction(const database_msg& request, size_t max_size);\n\n        std::shared_ptr<bzn::storage_base> storage;\n        std::shared_ptr<bzn::subscription_manager_base> subscription_manager;\n        std::shared_ptr<bzn::node_base> node;\n        std::shared_ptr<bzn::pbft_base> pbft; // required for expiration\n        std::unique_ptr<bzn::asio::steady_timer_base> expire_timer;\n\n        using message_handler_t = std::function<void(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session)>;\n        std::unordered_map<database_msg::MsgCase, message_handler_t> message_handlers;\n\n        std::once_flag start_once;\n        std::shared_mutex crud_lock; // for multi-reader and single writer access\n        const bzn::key_t  owner_public_key;\n        size_t max_swarm_storage{}; // maximum size of swarm database (unlimited when zero)\n    };\n\n} // namespace bzn\n"
  },
  {
    "path": "crud/crud_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <include/bluzelle.hpp>\n#include <node/session_base.hpp>\n#include <proto/database.pb.h>\n\nnamespace bzn\n{\n    class pbft_base;\n\n    class crud_base\n    {\n    public:\n        virtual ~crud_base() = default;\n\n        virtual void handle_request(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session) = 0;\n\n        virtual void start(std::shared_ptr<bzn::pbft_base> pbft, size_t max_storage) = 0;\n\n        virtual bool save_state() = 0;\n\n        virtual std::shared_ptr<std::string> get_saved_state() = 0;\n\n        virtual bool load_state(const std::string& state) = 0;\n    };\n\n} // namespace bzn\n"
  },
  {
    "path": "crud/subscription_manager.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <crud/subscription_manager.hpp>\n#include <algorithm>\n\nusing namespace bzn;\n\nnamespace\n{\n    const std::chrono::seconds DEFAULT_DEAD_SESSION_CHECK{15};\n}\n\n\nsubscription_manager::subscription_manager(std::shared_ptr<bzn::asio::io_context_base> io_context)\n    : purge_timer(io_context->make_unique_steady_timer())\n{\n}\n\n\nvoid\nsubscription_manager::start()\n{\n    std::call_once(this->start_once,\n        [this]()\n        {\n            this->purge_timer->expires_from_now(DEFAULT_DEAD_SESSION_CHECK);\n            this->purge_timer->async_wait(std::bind(&subscription_manager::purge_closed_sessions, shared_from_this(), std::placeholders::_1));\n        });\n\n}\n\n\nvoid\nsubscription_manager::subscribe(const bzn::uuid_t& uuid, const bzn::key_t& key, uint64_t transaction_id, database_response& response, std::shared_ptr<bzn::session_base> session)\n{\n    LOG(debug) << \"session [\" << session->get_session_id() << \"] subscription request: \" << uuid << \":\" << transaction_id << \":\" << key;\n\n    std::lock_guard<std::mutex> lock(this->subscribers_lock);\n\n    if (auto database_it = this->subscribers.find(uuid); database_it != this->subscribers.end())\n    {\n        if (auto key_it = database_it->second.find(key); key_it == database_it->second.end())\n        {\n            // add new key and subscriber...\n            database_it->second[key][session->get_session_id()][transaction_id] = std::move(session);\n\n            this->key_seq_number[uuid][key] = 0;\n            return;\n        }\n        else\n        {\n            // find existing session...\n            auto session_it = database_it->second[key].find(session->get_session_id());\n\n            if (session_it == database_it->second[key].end() || session_it->second.find(transaction_id) == session_it->second.end())\n            {\n                // add new key and subscriber...\n                database_it->second[key][session->get_session_id()][transaction_id] = std::move(session);\n\n                return;\n            }\n        }\n\n        // session already subscribed to this key...\n        response.mutable_error()->set_message(MSG_DUPLICATE_SUB);\n\n        LOG(debug) << \"session [\" << session->get_session_id() << \"] has already subscribed to: \" << uuid << \":\" << transaction_id << \":\" << key;\n\n        return;\n    }\n\n    // create a new entry...\n    this->subscribers[uuid][key][session->get_session_id()][transaction_id] = std::move(session);\n}\n\n\nvoid\nsubscription_manager::unsubscribe(const bzn::uuid_t& uuid, const bzn::key_t& key, uint64_t transaction_id, database_response& response, std::shared_ptr<bzn::session_base> session)\n{\n    LOG(debug) << \"session [\" << session->get_session_id() << \"] unsubscribe request: \" << uuid << \":\" << key << \":\" << transaction_id;\n\n    std::lock_guard<std::mutex> lock(this->subscribers_lock);\n\n    auto database_it = this->subscribers.find(uuid);\n\n    if (database_it == this->subscribers.end())\n    {\n        response.mutable_error()->set_message(MSG_INVALID_UUID);\n\n        LOG(debug) << \"session [\" << session->get_session_id() << \"] unknown database & key: \" << uuid << \":\" << key << \":\" << transaction_id;\n\n        return;\n    }\n\n    auto key_it = database_it->second.find(key);\n\n    if (key_it == database_it->second.end())\n    {\n        response.mutable_error()->set_message(MSG_INVALID_KEY);\n\n        LOG(debug) << \"session [\" << session->get_session_id() << \"] unknown key: \" << uuid << \":\" << key << \":\" << transaction_id;\n\n        return;\n    }\n\n    // check to see if session is already in the list...\n    if (auto session_it = database_it->second[key].find(session->get_session_id()); session_it == key_it->second.end())\n    {\n        response.mutable_error()->set_message(MSG_INVALID_SUB);\n\n        LOG(debug) << \"session [\" << session->get_session_id() << \"] not subscribed to: \" << uuid << \":\" << key << \":\" <<  transaction_id;\n\n        return;\n    }\n    else\n    {\n        // remove subscription...\n        if (auto sub_it = session_it->second.find(transaction_id); sub_it != session_it->second.end())\n        {\n            session_it->second.erase(sub_it);\n\n            return;\n        }\n\n        response.mutable_error()->set_message(MSG_INVALID_SUB);\n        LOG(debug) << \"session [\" << session->get_session_id() << \"] not subscribed to: \" << uuid << \":\" << key << \":\" <<  transaction_id;\n    }\n}\n\n\nvoid\nsubscription_manager::notify_sessions(const bzn::uuid_t& uuid, const bool update, const bzn::key_t& key, const std::string& value)\n{\n    std::lock_guard<std::mutex> lock(this->subscribers_lock);\n\n    if (auto database_it = this->subscribers.find(uuid); database_it != this->subscribers.end())\n    {\n        if (auto key_it = database_it->second.find(key); key_it != database_it->second.end())\n        {\n            std::once_flag once;\n\n            for (const auto& sessions : key_it->second)\n            {\n                std::call_once(once, [&]{++this->key_seq_number[uuid][key];});\n\n                for (const auto& subscription : sessions.second)\n                {\n                    if (auto session_shared_ptr = subscription.second.lock())\n                    {\n                        database_response resp;\n\n                        resp.mutable_header()->set_db_uuid(uuid);\n                        resp.mutable_header()->set_nonce(subscription.first);\n                        resp.mutable_subscription_update()->set_key(key);\n                        resp.mutable_subscription_update()->set_seq(this->key_seq_number[uuid][key]);\n\n                        if (!value.empty())\n                        {\n                            resp.mutable_subscription_update()->set_value(value);\n                        }\n\n                        if (update)\n                        {\n                            resp.mutable_subscription_update()->set_operation(database_subscription_update::UPDATE);\n                        }\n                        else\n                        {\n                            resp.mutable_subscription_update()->set_operation(database_subscription_update::DELETE);\n                        }\n\n                        LOG(debug) << \"notifying session [\" << session_shared_ptr->get_session_id() << \"] : \" << uuid\n                                   << \":\" << key << \":\" << subscription.first << \":\" << this->key_seq_number[uuid][key] << \":\"\n                                   << value.substr(0, MAX_MESSAGE_SIZE);\n\n                        session_shared_ptr->send_message(std::make_shared<std::string>(resp.SerializeAsString()));\n                    }\n                }\n            }\n        }\n    }\n}\n\n\nvoid\nsubscription_manager::inspect_commit(const database_msg& msg)\n{\n    switch (msg.msg_case())\n    {\n        case database_msg::kCreate:\n            this->notify_sessions(msg.header().db_uuid(), true, msg.create().key(), msg.create().value());\n            break;\n\n        case database_msg::kUpdate:\n            this->notify_sessions(msg.header().db_uuid(), true, msg.update().key(), msg.update().value());\n            break;\n\n        case database_msg::kDelete:\n            this->notify_sessions(msg.header().db_uuid(), false, msg.delete_().key(), \"\");\n            break;\n\n        default:\n            // nothing to do...\n            break;\n    }\n}\n\n\nvoid\nsubscription_manager::purge_closed_sessions(const boost::system::error_code& ec)\n{\n    if (!ec)\n    {\n        std::lock_guard<std::mutex> lock(this->subscribers_lock);\n\n        auto database_it = this->subscribers.begin();\n\n        while (database_it != this->subscribers.end())\n        {\n            size_t purged{};\n\n            auto key_it = database_it->second.begin();\n\n            while (key_it != database_it->second.end())\n            {\n                auto session_it = key_it->second.begin();\n\n                while (session_it != key_it->second.end())\n                {\n                    auto subscribers_it = session_it->second.begin();\n\n                    while (subscribers_it != session_it->second.end())\n                    {\n                        if (auto session_shared_ptr = subscribers_it->second.lock())\n                        {\n                            ++subscribers_it;\n                            continue;\n                        }\n\n                        LOG(debug) << \"purged closed session [\" << session_it->first << \"] for: \" << database_it->first;\n\n                        ++purged;\n\n                        subscribers_it = session_it->second.erase(subscribers_it);\n                    }\n\n                    if (session_it->second.empty())\n                    {\n                        session_it = key_it->second.erase(session_it);\n                        continue;\n                    }\n\n                    ++session_it;\n                }\n\n                if (key_it->second.empty())\n                {\n                    key_it = database_it->second.erase(key_it);\n                    continue;\n                }\n\n                ++key_it;\n            }\n\n            if (purged)\n            {\n                LOG(info) << \"purged \" << purged << \" closed sessions for database: \" << database_it->first;\n            }\n\n            if (database_it->second.empty())\n            {\n                database_it = this->subscribers.erase(database_it);\n                continue;\n            }\n\n            ++database_it;\n        }\n\n        // reschedule...\n        this->purge_timer->expires_from_now(DEFAULT_DEAD_SESSION_CHECK);\n        this->purge_timer->async_wait(std::bind(&subscription_manager::purge_closed_sessions, shared_from_this(), std::placeholders::_1));\n    }\n}\n"
  },
  {
    "path": "crud/subscription_manager.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <crud/subscription_manager_base.hpp>\n#include <include/boost_asio_beast.hpp>\n#include <unordered_map>\n#include <mutex>\n#include <list>\n\n\nnamespace bzn\n{\n    class subscription_manager final : public bzn::subscription_manager_base, public std::enable_shared_from_this<subscription_manager>\n    {\n    public:\n        subscription_manager(std::shared_ptr<bzn::asio::io_context_base> io_context);\n\n        void start() override;\n\n        void   subscribe(const bzn::uuid_t& uuid, const bzn::key_t& key, uint64_t transaction_id, database_response& response, std::shared_ptr<bzn::session_base> session) override;\n\n        void unsubscribe(const bzn::uuid_t& uuid, const bzn::key_t& key, uint64_t transaction_id, database_response& response, std::shared_ptr<bzn::session_base> session) override;\n\n        void inspect_commit(const database_msg& msg) override;\n\n    private:\n\n        void purge_closed_sessions(const boost::system::error_code& ec);\n\n        void notify_sessions(const bzn::uuid_t& uuid, bool update, const bzn::key_t& key, const std::string& value);\n\n        std::unordered_map<bzn::uuid_t, std::unordered_map<bzn::key_t, std::unordered_map<bzn::session_id, std::unordered_map<uint64_t, std::weak_ptr<bzn::session_base>>>>> subscribers;\n        std::unordered_map<bzn::uuid_t, std::unordered_map<bzn::key_t, uint64_t>> key_seq_number;\n\n        std::mutex subscribers_lock;\n\n        std::unique_ptr<bzn::asio::steady_timer_base> purge_timer;\n\n        std::once_flag start_once;\n    };\n\n} // namespace bzn\n"
  },
  {
    "path": "crud/subscription_manager_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <include/bluzelle.hpp>\n#include <node/session_base.hpp>\n#include <proto/database.pb.h>\n\n\nnamespace bzn\n{\n    const std::string MSG_INVALID_UUID  = \"INVALID_UUID\";\n    const std::string MSG_INVALID_KEY   = \"INVALID_KEY\";\n    const std::string MSG_INVALID_SUB   = \"INVALID_SUB\";\n    const std::string MSG_DUPLICATE_SUB = \"DUPLICATE_SUB\";\n\n    class subscription_manager_base\n    {\n    public:\n        virtual ~subscription_manager_base() = default;\n\n        virtual void start() = 0;\n\n        virtual void   subscribe(const bzn::uuid_t& uuid, const bzn::key_t& key, uint64_t transaction_id, database_response& response, std::shared_ptr<bzn::session_base> session) = 0;\n\n        virtual void unsubscribe(const bzn::uuid_t& uuid, const bzn::key_t& key, uint64_t transaction_id, database_response& response, std::shared_ptr<bzn::session_base> session) = 0;\n\n        virtual void inspect_commit(const database_msg& msg) = 0;\n\n    };\n\n} // namespace bzn\n"
  },
  {
    "path": "crud/test/CMakeLists.txt",
    "content": "set(test_srcs crud_test.cpp subscription_manager_test.cpp)\nset(test_libs crud pbft pbft_operations node storage peers_beacon proto smart_mocks ${Protobuf_LIBRARIES})\n\nadd_gmock_test(crud)\n"
  },
  {
    "path": "crud/test/crud_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <crud/crud.hpp>\n#include <storage/mem_storage.hpp>\n#include <mocks/mock_session_base.hpp>\n#include <mocks/mock_subscription_manager_base.hpp>\n#include <mocks/mock_node_base.hpp>\n#include <mocks/mock_pbft_base.hpp>\n#include <mocks/mock_boost_asio_beast.hpp>\n#include <algorithm>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int_distribution.hpp>\n#include <boost/format.hpp>\n#include <boost/uuid/uuid.hpp>\n#include <boost/uuid/uuid_generators.hpp>\n#include <boost/uuid/uuid_io.hpp>\n#include <boost/lexical_cast.hpp>\n#include <mocks/smart_mock_peers_beacon.hpp>\n\nusing namespace ::testing;\n\n\nnamespace\n{\n    const std::string TTL_UUID{\"TTL\"};\n\n    bool\n    parse_env_to_db_resp(database_response& target, const std::string& source)\n    {\n        bzn_envelope intermediate;\n        return intermediate.ParseFromString(source) && target.ParseFromString(intermediate.database_response());\n    }\n\n    void expect_signed_response(const std::shared_ptr<bzn::mock_session_base>& session,\n            std::optional<bzn::uuid_t> db_uuid = std::nullopt,\n            std::optional<uint64_t> nonce = std::nullopt,\n            std::optional<database_response::ResponseCase> response_case = std::nullopt,\n            std::optional<std::string> error_msg = std::nullopt,\n            std::function<void(const database_response&)> additional_checks = [](auto){})\n    {\n        EXPECT_CALL(*session, send_signed_message(_)).WillOnce(Invoke(\n            [=](std::shared_ptr<bzn_envelope> env)\n            {\n                EXPECT_EQ(env->payload_case(), bzn_envelope::kDatabaseResponse);\n                database_response resp;\n                resp.ParseFromString(env->database_response());\n\n                if (db_uuid)\n                {\n                    EXPECT_EQ(resp.header().db_uuid(), *db_uuid);\n                }\n\n                if (nonce)\n                {\n                    EXPECT_EQ(resp.header().nonce(), *nonce);\n                }\n\n                if (response_case)\n                {\n                    EXPECT_EQ(resp.response_case(), *response_case);\n                }\n\n                if (error_msg)\n                {\n                    EXPECT_EQ(resp.error().message(), *error_msg);\n                }\n\n                additional_checks(resp);\n            }));\n    }\n\n    void expect_response(const std::shared_ptr<bzn::mock_session_base>& session,\n        std::optional<bzn::uuid_t> db_uuid = std::nullopt,\n        std::optional<uint64_t> nonce = std::nullopt,\n        std::optional<database_response::ResponseCase> response_case = std::nullopt,\n        std::optional<std::string> error_msg = std::nullopt,\n        std::function<void(const database_response&)> additional_checks = [](auto){})\n    {\n        EXPECT_CALL(*session, send_message(_)).WillOnce(Invoke(\n            [=](std::shared_ptr<std::string> msg)\n            {\n                bzn_envelope env;\n                env.ParseFromString(*msg);\n\n                EXPECT_EQ(env.payload_case(), bzn_envelope::kDatabaseResponse);\n                database_response resp;\n                resp.ParseFromString(env.database_response());\n\n                if (db_uuid)\n                {\n                    EXPECT_EQ(resp.header().db_uuid(), *db_uuid);\n                }\n\n                if (nonce)\n                {\n                    EXPECT_EQ(resp.header().nonce(), *nonce);\n                }\n\n                if (response_case)\n                {\n                    EXPECT_EQ(resp.response_case(), *response_case);\n                }\n\n                if (error_msg)\n                {\n                    EXPECT_EQ(resp.error().message(), *error_msg);\n                }\n\n                additional_checks(resp);\n            }));\n    }\n\n    std::shared_ptr<bzn::crud>\n    initialize_crud(\n            std::shared_ptr<bzn::mock_session_base>& session\n            , std::shared_ptr<bzn::mock_node_base>& mock_node\n            , bzn::uuid_t caller_id)\n    {\n        mock_node = std::make_shared<bzn::mock_node_base>();\n        auto mock_subscription_manager = std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>();\n        auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n        session = std::make_shared<bzn::mock_session_base>();\n\n        EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n                [&]()\n                {\n                    return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n                }));\n\n        auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(), mock_subscription_manager, mock_node, caller_id);\n\n        auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n        EXPECT_CALL(*mock_pbft,\n                    peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n        crud->start(mock_pbft);\n        return crud;\n    }\n\n    std::string\n    generate_random_hash()\n    {\n        boost::uuids::random_generator gen;\n        return boost::lexical_cast<std::string>(boost::uuids::to_string(gen()));\n    }\n\n    database_msg\n    build_header_msg(const bzn::uuid_t &caller_uuid, const bzn::uuid_t &db_uuid, uint64_t nonce, const std::string& request_hash)\n    {\n        database_msg msg;\n        msg.mutable_header()->set_point_of_contact(caller_uuid);\n        msg.mutable_header()->set_db_uuid(db_uuid);\n        msg.mutable_header()->set_nonce(nonce);\n        msg.mutable_header()->set_request_hash(request_hash);\n        return msg;\n    }\n\n    database_msg\n    build_create_msg(const bzn::uuid_t &caller_uuid, const bzn::uuid_t &db_uuid, uint64_t nonce, const std::string& request_hash, const bzn::key_t &key, const bzn::value_t &value, uint64_t expire = 0)\n    {\n        database_msg msg {build_header_msg(caller_uuid, db_uuid, nonce, request_hash)};\n        msg.mutable_create()->set_key(key);\n        msg.mutable_create()->set_value(value);\n        if (expire)\n        {\n            msg.mutable_create()->set_expire(expire);\n        }\n\n        return msg;\n    }\n\n    database_msg\n    build_update_msg(const bzn::uuid_t &caller_uuid, const bzn::uuid_t &db_uuid, uint64_t nonce, const std::string& request_hash, const bzn::key_t &key, const bzn::value_t &value, uint64_t expire = 0)\n    {\n        database_msg msg {build_header_msg(caller_uuid, db_uuid, nonce, request_hash)};\n        msg.mutable_header()->set_nonce(nonce);\n        msg.mutable_update()->set_key(key);\n        msg.mutable_update()->set_value(value);\n        if (expire)\n        {\n            msg.mutable_update()->set_expire(expire);\n        }\n\n        return msg;\n    }\n\n    database_msg\n    build_create_db_msg(const bzn::uuid_t &caller_uuid, const bzn::uuid_t &db_uuid, uint64_t nonce, size_t max_size, database_create_db_eviction_policy_type eviction_policy)\n    {\n        database_msg msg {build_header_msg(caller_uuid, db_uuid, nonce, generate_random_hash())};\n        msg.mutable_create_db()->set_max_size(max_size);\n        msg.mutable_create_db()->set_eviction_policy(eviction_policy);\n        return msg;\n    }\n\n    database_msg\n    build_update_db_msg(const bzn::uuid_t &caller_uuid, const bzn::uuid_t &db_uuid, uint64_t nonce, size_t max_size, database_create_db_eviction_policy_type eviction_policy)\n    {\n        database_msg msg {build_header_msg(caller_uuid, db_uuid, nonce, generate_random_hash())};\n        msg.mutable_update_db()->set_max_size(max_size);\n        msg.mutable_update_db()->set_eviction_policy(eviction_policy);\n        return msg;\n    }\n\n    database_msg\n    build_quick_read_msg(const bzn::uuid_t &caller_uuid, const bzn::uuid_t &db_uuid, uint64_t nonce, const bzn::key_t &key)\n    {\n        database_msg msg {build_header_msg(caller_uuid, db_uuid, nonce, generate_random_hash())};\n        msg.mutable_quick_read()->set_key(key);\n        return msg;\n    }\n\n    void\n    create_test_database(\n            const std::shared_ptr<bzn::crud>& crud\n            , const std::shared_ptr<bzn::mock_session_base>& session\n            , const std::shared_ptr<bzn::mock_node_base>& mock_node\n            , const bzn::uuid_t& caller_uuid\n            , const bzn::uuid_t& db_uuid\n            , uint64_t max_size = 0\n            , database_create_db_eviction_policy_type eviction_policy = database_create_db_eviction_policy_type_NONE)\n    {\n        database_msg msg{build_create_db_msg(caller_uuid, db_uuid, 0, max_size, eviction_policy)};\n\n        // We are not testing create database, so we can suppress the send_signed_message calls.\n        EXPECT_CALL(*session, send_signed_message(_));\n        EXPECT_CALL(*mock_node, send_signed_message(A<const std::string&>(),_));\n\n        crud->handle_request(caller_uuid, msg, session);\n    }\n\n    void\n    remove_test_database(\n            const std::shared_ptr<bzn::crud>& crud\n            , const std::shared_ptr<bzn::mock_session_base>& session\n            , const std::shared_ptr<bzn::mock_node_base>& mock_node\n            , const bzn::uuid_t& caller_uuid\n            , const bzn::uuid_t& db_uuid)\n    {\n        database_msg msg{build_header_msg(caller_uuid, db_uuid, 0, generate_random_hash())};\n        msg.mutable_delete_db();\n\n        // We are not testing remove database, so hide these messsages.\n        EXPECT_CALL(*mock_node, send_signed_message(A<const std::string&>(),_));\n        EXPECT_CALL(*session, send_signed_message(_));\n\n        crud->handle_request(caller_uuid, msg, session);\n    }\n\n    void\n    create_key_value(\n            const std::shared_ptr<bzn::crud>& crud\n            , const std::shared_ptr<bzn::mock_session_base>& session\n            , const std::shared_ptr<bzn::mock_node_base>& mock_node\n            , const bzn::uuid_t& caller\n            , const std::string& request_hash\n            , const bzn::uuid_t& db\n            , const std::string& key\n            , const std::string& value\n            , uint64_t expire = 0)\n    {\n        database_msg msg{build_create_msg(caller, db, 123, request_hash, key, value, expire)};\n\n        // We are not testing create, so we can suppress the send_signed_message calls.\n        EXPECT_CALL(*session, send_signed_message(_));\n        EXPECT_CALL(*mock_node, send_signed_message(A<const std::string&>(),_));\n\n        crud->handle_request(caller, msg, session);\n    }\n\n    void\n    update_key_value(\n            const std::shared_ptr<bzn::crud>& crud\n            , const std::shared_ptr<bzn::mock_session_base>& session\n            , const std::shared_ptr<bzn::mock_node_base>& mock_node\n            , const bzn::uuid_t& caller\n            , const std::string& request_hash\n            , const bzn::uuid_t& db\n            , const std::string& key\n            , const std::string& value\n            , uint64_t expire = 0)\n    {\n        database_msg msg{build_update_msg(caller, db, 123, request_hash, key, value, expire)};\n\n        // We are not testing update, so we can suppress the send_signed_message calls.\n        EXPECT_CALL(*session, send_signed_message(_));\n        EXPECT_CALL(*mock_node, send_signed_message(A<const std::string&>(),_));\n\n        crud->handle_request(caller, msg, session);\n    }\n\n    std::pair<std::size_t, std::size_t>\n    get_database_size(\n            const std::shared_ptr<bzn::crud>& crud\n            , const std::shared_ptr<bzn::mock_session_base>& session\n            , const std::shared_ptr<bzn::mock_node_base>& mock_node\n            , const bzn::uuid_t& caller, const bzn::uuid_t& db)\n    {\n        std::promise<std::pair<std::size_t, std::size_t>> db_size_promise;\n        database_msg msg{build_header_msg(caller, db, 123, generate_random_hash())};\n        msg.mutable_size();\n\n        EXPECT_CALL(*session, send_signed_message(_)).WillOnce(Invoke(\n                [&](const std::shared_ptr<bzn_envelope>& env)\n                {\n                    database_response resp;\n                    resp.ParseFromString(env->database_response());\n                    db_size_promise.set_value(std::pair<std::size_t, std::size_t>{resp.size().keys(), resp.size().bytes()});\n                }));\n\n        // We are not testing get database size, so we can suppress the mock_node send_signed_message call.\n        EXPECT_CALL(*mock_node, send_signed_message(A<const std::string&>(),_));\n\n        std::future<std::pair<std::size_t, std::size_t>> future = db_size_promise.get_future();\n        crud->handle_request(caller, msg, session);\n\n        return future.get();\n    }\n\n\n    std::set<std::string>\n    get_database_keys(\n            const std::shared_ptr<bzn::crud>& crud\n            , const std::shared_ptr<bzn::mock_session_base>& session\n            , const std::shared_ptr<bzn::mock_node_base>& mock_node\n            , const bzn::uuid_t& caller_id\n            , const bzn::uuid_t& db_uuid)\n    {\n        std::promise<std::set<std::string>> keys_promise;\n        database_msg msg{build_header_msg(caller_id, db_uuid, 123, generate_random_hash())};\n        msg.mutable_keys();\n\n        expect_signed_response(session, db_uuid, uint64_t(123), database_response::kKeys, std::nullopt,\n                               [&](const auto& resp)\n                               {\n                                   std::set<std::string> tmp_set(resp.keys().keys().begin(), resp.keys().keys().end());\n                                   keys_promise.set_value(tmp_set);\n                               });\n\n        // We are not testing get database keys, so we can suppress the mock_node send_signed_message call.\n        EXPECT_CALL(*mock_node, send_signed_message(A<const std::string&>(),_));\n\n        std::future<std::set<std::string>> future = keys_promise.get_future();\n        crud->handle_request(db_uuid, msg, session);\n        return future.get();\n    }\n\n    std::string\n    do_quickread(const std::shared_ptr<bzn::crud>& crud\n            , const std::shared_ptr<bzn::mock_session_base>& session\n            , const std::shared_ptr<bzn::mock_node_base>& mock_node\n            , const bzn::uuid_t& caller_id\n            , const bzn::uuid_t& db_uuid\n            , const bzn::key_t& key)\n    {\n        const uint64_t NONCE{123};\n        std::promise<std::string> value_promise;\n        database_msg msg{build_quick_read_msg(caller_id, db_uuid, NONCE, key)};\n\n        expect_response(session, db_uuid, NONCE, database_response::kQuickRead, std::nullopt,\n                               [&](const auto& msg)\n                               {\n                                    value_promise.set_value( msg.quick_read().value());\n                               });\n\n        // We are not testing quickread, so we can suppress the mock_node send_signed_message call.\n        EXPECT_CALL(*mock_node, send_signed_message(A<const std::string&>(),_));\n\n        std::future<std::string> future = value_promise.get_future();\n        crud->handle_request(db_uuid, msg, session);\n        return future.get();\n    }\n\n    std::string\n    make_key(size_t index)\n    {\n        return str(boost::format(\"key%04d\") % index);\n    }\n\n    std::string\n    make_value(size_t size)\n    {\n        return std::string(size,'X');\n    }\n\n    size_t\n    fill_database(\n            const std::shared_ptr<bzn::crud>& crud\n            , const std::shared_ptr<bzn::mock_session_base>& session\n            , const std::shared_ptr<bzn::mock_node_base>& mock_node\n            , const bzn::uuid_t& caller_id\n            , const std::string request_hash\n            , const bzn::uuid_t& db_uuid\n            , size_t value_size\n            , size_t max_size,\n            bool expires = false)\n    {\n        // We have a cache with random eviction and max size MAX_SIZE bytes, fill up the database to just under the\n        // limit\n        const size_t ITEMS{max_size / (make_key(0).length() + value_size)};\n        const bzn::value_t VALUE{make_value(value_size)};\n        for (size_t index{0} ; index < ITEMS; ++index)\n        {\n            create_key_value(\n                    crud, session, mock_node, caller_id\n                    , request_hash.empty() ? generate_random_hash() : request_hash\n                    , db_uuid, make_key(index), VALUE\n                    , expires ? index * 1024 + 1024 : 0\n                    );\n        }\n\n        return ITEMS;\n    }\n}\n\n\nTEST(crud, test_that_create_sends_proper_response)\n{\n    auto mock_subscription_manager = std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        mock_subscription_manager, nullptr);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create()->set_key(\"key\");\n    msg.mutable_create()->set_value(\"value\");\n\n    // add key...\n    auto session = std::make_shared<bzn::mock_session_base>();\n\n    expect_signed_response(session, \"uuid\", 123, std::nullopt,\n        bzn::storage_result_msg.at(bzn::storage_result::db_not_found));\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // now create the db...\n    msg.mutable_create_db();\n\n    expect_signed_response(session, \"uuid\", 123, database_response::RESPONSE_NOT_SET);\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // now test creates...\n    msg.mutable_create()->set_key(\"key\");\n    msg.mutable_create()->set_value(\"value\");\n    msg.mutable_create()->set_expire(2);\n\n    EXPECT_CALL(*mock_subscription_manager, inspect_commit(_));\n\n    expect_signed_response(session, \"uuid\", 123, database_response::RESPONSE_NOT_SET);\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // fail to create same key...\n    expect_signed_response(session, \"uuid\", 123, database_response::kError,\n        bzn::storage_result_msg.at(bzn::storage_result::exists));\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // fail because key is too big...\n    msg.mutable_create()->set_key(std::string(bzn::MAX_KEY_SIZE + 1, '*'));\n    expect_signed_response(session, \"uuid\", 123, database_response::kError,\n        bzn::storage_result_msg.at(bzn::storage_result::key_too_large));\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // fail because value is too big...\n    msg.mutable_create()->set_value(std::string(bzn::MAX_VALUE_SIZE + 1, '*'));\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kError,\n        bzn::storage_result_msg.at(bzn::storage_result::value_too_large));\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // get ttl for new key\n    msg.mutable_ttl()->set_key(\"key\");\n\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kTtl, std::nullopt,\n        [](const database_response& resp)\n        {\n            EXPECT_EQ(resp.ttl().key(), \"key\");\n            EXPECT_GE(resp.ttl().ttl(), uint64_t(1));\n        });\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // expire key...\n    sleep(2);\n\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kError,\n        bzn::storage_result_msg.at(bzn::storage_result::delete_pending));\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // calling create should return delete pending...\n    msg.mutable_create()->set_key(\"key\");\n    msg.mutable_create()->set_value(\"value\");\n    msg.mutable_create()->set_expire(2);\n\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kError,\n        bzn::storage_result_msg.at(bzn::storage_result::delete_pending));\n\n    crud->handle_request(\"caller_id\", msg, session);\n}\n\n\nTEST(crud, test_that_point_of_contact_create_sends_proper_response)\n{\n    auto mock_node = std::make_shared<bzn::mock_node_base>();\n    auto mock_subscription_manager = std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        mock_subscription_manager, mock_node);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n\n    msg.mutable_header()->set_point_of_contact(\"point_of_contact\");\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n\n    msg.mutable_create()->set_key(\"key\");\n    msg.mutable_create()->set_value(\"value\");\n\n    // add key...\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\",_)).WillOnce(Invoke(\n        [&](const bzn::uuid_t& , auto msg)\n        {\n            database_response resp;\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.header().nonce(), uint64_t(123));\n            ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::db_not_found));\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // now create the db...\n    msg.mutable_create_db();\n\n    // virtual void send_signed_message(const bzn::uuid_t& , std::shared_ptr<bzn_envelope> msg, bool close_session) = 0;\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", _)).WillOnce(Invoke(\n        [&](const auto& , auto msg)\n        {\n            database_response resp;\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.header().nonce(), uint64_t(123));\n            ASSERT_EQ(resp.response_case(), database_response::RESPONSE_NOT_SET);\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // now test creates...\n    msg.mutable_create()->set_key(\"key\");\n    msg.mutable_create()->set_value(\"value\");\n\n    EXPECT_CALL(*mock_subscription_manager, inspect_commit(_));\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", _)).WillOnce(Invoke(\n        [&](const auto& , auto msg)\n        {\n            database_response resp;\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n\n            ASSERT_EQ(resp.header().nonce(), uint64_t(123));\n            ASSERT_EQ(resp.response_case(), database_response::RESPONSE_NOT_SET);\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // ttl should fail since default is zero...\n    msg.mutable_ttl()->set_key(\"key\");\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", _)).WillOnce(Invoke(\n        [&](const auto&, auto msg)\n        {\n            database_response resp;\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::ttl_not_found));\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // fail to create same key...\n    msg.mutable_create()->set_key(\"key\");\n    msg.mutable_create()->set_value(\"value\");\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", _)).WillOnce(Invoke(\n        [&](const auto&, auto msg)\n        {\n            database_response resp;\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.header().nonce(), uint64_t(123));\n            ASSERT_EQ(resp.response_case(), database_response::kError);\n            ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::exists));\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // fail because key is too big...\n    msg.mutable_create()->set_key(std::string(bzn::MAX_KEY_SIZE+1,'*'));\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", _)).WillOnce(Invoke(\n        [&](const auto&, auto msg)\n        {\n            database_response resp;\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.header().nonce(), uint64_t(123));\n            ASSERT_EQ(resp.response_case(), database_response::kError);\n            ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::key_too_large));\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // fail because value is too big...\n    msg.mutable_create()->set_value(std::string(bzn::MAX_VALUE_SIZE+1,'*'));\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", _)).WillOnce(Invoke(\n        [&](const auto&, auto msg)\n        {\n            database_response resp;\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.header().nonce(), uint64_t(123));\n            ASSERT_EQ(resp.response_case(), database_response::kError);\n            ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::value_too_large));\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n}\n\n\nTEST(crud, test_that_read_sends_proper_response)\n{\n    auto mock_subscription_manager = std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        mock_subscription_manager, nullptr);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create_db();\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // test reads...\n    msg.mutable_create()->set_key(\"key\");\n    msg.mutable_create()->set_value(\"value\");\n    msg.mutable_create()->set_expire(2);\n\n    // add key...\n    auto session = std::make_shared<bzn::mock_session_base>();\n\n    EXPECT_CALL(*mock_subscription_manager, inspect_commit(_));\n\n    expect_signed_response(session);\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // clear msg...\n    msg.mutable_create()->release_key();\n    msg.mutable_create()->release_value();\n\n    // read key...\n    msg.mutable_read()->set_key(\"key\");\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kRead, std::nullopt,\n        [](const auto& resp)\n        {\n            ASSERT_EQ(resp.read().key(), \"key\");\n            ASSERT_EQ(resp.read().value(), \"value\");\n        });\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // quick read key...\n    msg.mutable_quick_read()->set_key(\"key\");\n    expect_response(session, \"uuid\", uint64_t(123), database_response::kQuickRead, std::nullopt,\n            [](const auto& resp)\n            {\n                ASSERT_EQ(resp.quick_read().key(), \"key\");\n                ASSERT_EQ(resp.quick_read().value(), \"value\");\n            });\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // invalid db...\n    msg.mutable_header()->set_db_uuid(\"invalid\");\n    msg.mutable_read()->set_key(\"key\");\n    expect_signed_response(session, \"invalid\", uint64_t(123), database_response::kError,\n        bzn::storage_result_msg.at(bzn::storage_result::db_not_found));\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    msg.mutable_quick_read()->set_key(\"key\");\n    expect_response(session, \"invalid\", uint64_t(123), database_response::kQuickRead, std::nullopt,\n        [](const auto& resp)\n        {\n            ASSERT_EQ(resp.quick_read().error(), bzn::storage_result_msg.at(bzn::storage_result::db_not_found));\n        });\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // read invalid key...\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_read()->set_key(\"invalid-key\");\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kError,\n        bzn::storage_result_msg.at(bzn::storage_result::not_found));\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // quick read invalid key...\n    msg.mutable_quick_read()->set_key(\"invalid-key\");\n    expect_response(session, \"uuid\", uint64_t(123), database_response::kQuickRead, std::nullopt,\n        [](const auto& resp)\n        {\n            ASSERT_EQ(resp.quick_read().error(), bzn::storage_result_msg.at(bzn::storage_result::not_found));\n        });\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // null session nothing should happen...\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // expired key should return delete_pending\n    msg.mutable_read()->set_key(\"key\");\n\n    sleep(2);\n\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kError,\n        bzn::storage_result_msg.at(bzn::storage_result::delete_pending));\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n}\n\n\nTEST(crud, test_that_point_of_contact_read_sends_proper_response)\n{\n    auto mock_subscription_manager = std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>();\n    auto mock_node = std::make_shared<bzn::mock_node_base>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        mock_subscription_manager, mock_node);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n\n    msg.mutable_header()->set_point_of_contact(\"point_of_contact\");\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n\n    msg.mutable_create_db();\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>()));\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // test reads...\n    msg.mutable_create()->set_key(\"key\");\n    msg.mutable_create()->set_value(\"value\");\n\n    // add key...\n    EXPECT_CALL(*mock_subscription_manager, inspect_commit(_));\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>()));\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // clear msg...\n    msg.mutable_create()->release_key();\n    msg.mutable_create()->release_value();\n\n    // read key...\n    msg.mutable_read()->set_key(\"key\");\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [&](const auto&, auto msg)\n        {\n            database_response resp;\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.header().nonce(), uint64_t(123));\n            ASSERT_EQ(resp.response_case(), database_response::kRead);\n            ASSERT_EQ(resp.read().key(), \"key\");\n            ASSERT_EQ(resp.read().value(), \"value\");\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // quick read key...\n    msg.mutable_quick_read()->set_key(\"key\");\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", _)).WillOnce(Invoke(\n        [&](const auto&, auto msg)\n        {\n            database_response resp;\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.header().nonce(), uint64_t(123));\n            ASSERT_EQ(resp.response_case(), database_response::kQuickRead);\n            ASSERT_EQ(resp.quick_read().key(), \"key\");\n            ASSERT_EQ(resp.quick_read().value(), \"value\");\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // read invalid key...\n    msg.mutable_read()->set_key(\"invalid-key\");\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [&](const auto&, auto msg)\n        {\n            database_response resp;\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.header().nonce(), uint64_t(123));\n            ASSERT_EQ(resp.response_case(), database_response::kError);\n            ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::not_found));\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // quick read invalid key...\n    msg.mutable_quick_read()->set_key(\"invalid-key\");\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [&](const auto&, auto msg)\n        {\n            database_response resp;\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.header().nonce(), uint64_t(123));\n            ASSERT_EQ(resp.response_case(), database_response::kQuickRead);\n\t\t\tASSERT_EQ(resp.quick_read().error(), bzn::storage_result_msg.at(bzn::storage_result::not_found));\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // null point_of_contact, nothing should happen...\n    msg.mutable_header()->clear_point_of_contact();\n    crud->handle_request(\"caller_id\", msg, nullptr);\n}\n\n\nTEST(crud, test_that_update_sends_proper_response)\n{\n    auto mock_subscription_manager = std::make_shared<bzn::mock_subscription_manager_base>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        mock_subscription_manager, nullptr);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    EXPECT_CALL(*mock_subscription_manager, start());\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create_db();\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // test updates...\n    msg.mutable_create()->set_key(\"key\");\n    msg.mutable_create()->set_value(\"value\");\n\n    // add key...\n    auto session = std::make_shared<bzn::mock_session_base>();\n\n    EXPECT_CALL(*mock_subscription_manager, inspect_commit(_));\n\n    expect_signed_response(session);\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // clear msg...\n    msg.mutable_create()->release_key();\n    msg.mutable_create()->release_value();\n\n    // update key...\n    EXPECT_CALL(*mock_subscription_manager, inspect_commit(_));\n\n    msg.mutable_update()->set_key(\"key\");\n    msg.mutable_update()->set_value(\"updated\");\n    msg.mutable_update()->set_expire(2);\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::RESPONSE_NOT_SET);\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // clear msg...\n    msg.mutable_update()->release_key();\n    msg.mutable_update()->release_value();\n\n    // read updated key...\n    msg.mutable_read()->set_key(\"key\");\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kRead, std::nullopt,\n        [](const auto& resp)\n        {\n            ASSERT_EQ(resp.read().key(), \"key\");\n            ASSERT_EQ(resp.read().value(), \"updated\");\n        });\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // expired key should return delete_pending\n    msg.mutable_update()->set_key(\"key\");\n    msg.mutable_update()->set_value(\"updated\");\n\n    sleep(2);\n\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kError,\n        bzn::storage_result_msg.at(bzn::storage_result::delete_pending));\n\n    crud->handle_request(\"caller_id\", msg, session);\n}\n\n\nTEST(crud, test_that_point_of_contact_update_sends_proper_response)\n{\n    auto mock_subscription_manager = std::make_shared<bzn::mock_subscription_manager_base>();\n    auto mock_node = std::make_shared<bzn::mock_node_base>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        mock_subscription_manager, mock_node);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    EXPECT_CALL(*mock_subscription_manager, start());\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n\n    msg.mutable_header()->set_point_of_contact(\"point_of_contact\");\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n\n    msg.mutable_create_db();\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>()));\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // test updates...\n    msg.mutable_create()->set_key(\"key\");\n    msg.mutable_create()->set_value(\"value\");\n\n    // add key...\n    EXPECT_CALL(*mock_subscription_manager, inspect_commit(_));\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>()));\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // clear msg...\n    msg.mutable_create()->release_key();\n    msg.mutable_create()->release_value();\n\n    // update key...\n    EXPECT_CALL(*mock_subscription_manager, inspect_commit(_));\n\n    msg.mutable_update()->set_key(\"key\");\n    msg.mutable_update()->set_value(\"updated\");\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [&](const auto&, auto msg)\n        {\n            database_response resp;\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.header().nonce(), uint64_t(123));\n            ASSERT_EQ(resp.response_case(), database_response::RESPONSE_NOT_SET);\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // clear msg...\n    msg.mutable_update()->release_key();\n    msg.mutable_update()->release_value();\n\n    // read updated key...\n    msg.mutable_read()->set_key(\"key\");\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [&](const auto&, auto msg)\n        {\n            database_response resp;\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.header().nonce(), uint64_t(123));\n            ASSERT_EQ(resp.response_case(), database_response::kRead);\n            ASSERT_EQ(resp.read().key(), \"key\");\n            ASSERT_EQ(resp.read().value(), \"updated\");\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n}\n\n\nTEST(crud, test_that_delete_sends_proper_response)\n{\n    auto mock_subscription_manager = std::make_shared<bzn::mock_subscription_manager_base>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        mock_subscription_manager, nullptr);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    EXPECT_CALL(*mock_subscription_manager, start());\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create_db();\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // test deletes...\n    msg.mutable_create()->set_key(\"key\");\n    msg.mutable_create()->set_value(\"value\");\n\n    // add key...\n    auto session = std::make_shared<bzn::mock_session_base>();\n\n    EXPECT_CALL(*mock_subscription_manager, inspect_commit(_));\n\n    expect_signed_response(session);\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // clear msg...\n    msg.mutable_create()->release_key();\n    msg.mutable_create()->release_value();\n\n    // delete key...\n    msg.mutable_delete_()->set_key(\"key\");\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::RESPONSE_NOT_SET);\n\n    EXPECT_CALL(*mock_subscription_manager, inspect_commit(_));\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // delete invalid key...\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::not_found));\n\n    crud->handle_request(\"caller_id\", msg, session);\n}\n\n\nTEST(crud, test_that_point_of_contact_delete_sends_proper_response)\n{\n    auto mock_node = std::make_shared<bzn::mock_node_base>();\n    auto mock_subscription_manager = std::make_shared<bzn::mock_subscription_manager_base>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        mock_subscription_manager, mock_node);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    EXPECT_CALL(*mock_subscription_manager, start());\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n\n    msg.mutable_header()->set_point_of_contact(\"point_of_contact\");\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create_db();\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>()));\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // test deletes...\n    msg.mutable_create()->set_key(\"key\");\n    msg.mutable_create()->set_value(\"value\");\n\n    // add key...\n    EXPECT_CALL(*mock_subscription_manager, inspect_commit(_));\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>()));\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // clear msg...\n    msg.mutable_create()->release_key();\n    msg.mutable_create()->release_value();\n\n    // delete key...\n    msg.mutable_delete_()->set_key(\"key\");\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [&](const auto&, auto msg)\n        {\n            database_response resp;\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.header().nonce(), uint64_t(123));\n            ASSERT_EQ(resp.response_case(), database_response::RESPONSE_NOT_SET);\n        }));\n\n    EXPECT_CALL(*mock_subscription_manager, inspect_commit(_));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // delete invalid key...\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [&](const auto&, auto msg)\n        {\n            database_response resp;\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.header().nonce(), uint64_t(123));\n            ASSERT_EQ(resp.response_case(), database_response::kError);\n            ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::not_found));\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n}\n\n\nTEST(crud, test_that_has_sends_proper_response)\n{\n    auto mock_node = std::make_shared<bzn::mock_node_base>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), nullptr);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create_db();\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // test has...\n    msg.mutable_create()->set_key(\"key\");\n    msg.mutable_create()->set_value(\"value\");\n\n    // add key...\n    auto session = std::make_shared<bzn::mock_session_base>();\n\n    expect_signed_response(session);\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // clear msg...\n    msg.mutable_create()->release_key();\n    msg.mutable_create()->release_value();\n\n    // valid key...\n    msg.mutable_has()->set_key(\"key\");\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kHas, std::nullopt,\n        [](const auto& resp)\n        {\n            ASSERT_EQ(resp.has().key(), \"key\");\n            ASSERT_TRUE(resp.has().has());\n        });\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // invalid key...\n    msg.mutable_has()->set_key(\"invalid-key\");\n    expect_signed_response(session, \"uuid\", 123, database_response::kHas, std::nullopt,\n        [](const auto& resp)\n        {\n            ASSERT_EQ(resp.has().key(), \"invalid-key\");\n            ASSERT_FALSE(resp.has().has());\n        });\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // invalid database\n    msg.mutable_header()->set_db_uuid(\"invalid-uuid\");\n    msg.mutable_has()->set_key(\"key\");\n    expect_signed_response(session, \"invalid-uuid\", 123, database_response::kError, std::nullopt,\n        [](const auto& resp)\n        {\n            ASSERT_EQ(resp.header().db_uuid(), \"invalid-uuid\");\n            ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::db_not_found));\n        });\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // null session nothing should happen...\n    crud->handle_request(\"caller_id\", msg, nullptr);\n}\n\n\nTEST(crud, test_that_point_of_contact_has_sends_proper_response)\n{\n    auto mock_node = std::make_shared<bzn::mock_node_base>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), mock_node);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n\n    msg.mutable_header()->set_point_of_contact(\"point_of_contact\");\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create_db();\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>()));\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // test has...\n    msg.mutable_create()->set_key(\"key\");\n    msg.mutable_create()->set_value(\"value\");\n\n    // add key...\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>()));\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // clear msg...\n    msg.mutable_create()->release_key();\n    msg.mutable_create()->release_value();\n\n    // valid key...\n    msg.mutable_has()->set_key(\"key\");\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [&](const auto&, auto msg)\n        {\n            database_response resp;\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.header().nonce(), uint64_t(123));\n            ASSERT_EQ(resp.response_case(), database_response::kHas);\n            ASSERT_EQ(resp.has().key(), \"key\");\n            ASSERT_TRUE(resp.has().has());\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // invalid key...\n    msg.mutable_has()->set_key(\"invalid-key\");\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [&](const auto&, auto msg)\n        {\n            database_response resp;\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.header().nonce(), uint64_t(123));\n            ASSERT_EQ(resp.response_case(), database_response::kHas);\n            ASSERT_EQ(resp.has().key(), \"invalid-key\");\n            ASSERT_FALSE(resp.has().has());\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // null session nothing should happen...\n    msg.mutable_header()->clear_point_of_contact();\n    crud->handle_request(\"caller_id\", msg, nullptr);\n}\n\n\nTEST(crud, test_that_keys_sends_proper_response)\n{\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), nullptr);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create_db();\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // test keys...\n    msg.mutable_create()->set_key(\"key1\");\n    msg.mutable_create()->set_value(\"value\");\n\n    // add key...\n    auto session = std::make_shared<bzn::mock_session_base>();\n\n    EXPECT_CALL(*session, send_signed_message(_)).Times(2);\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // add another...\n    msg.mutable_create()->set_key(\"key2\");\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // clear msg...\n    msg.mutable_create()->release_key();\n    msg.mutable_create()->release_value();\n\n    // get keys...\n    msg.mutable_keys();\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kKeys, std::nullopt,\n        [](auto resp)\n        {\n            ASSERT_EQ(resp.keys().keys().size(), int(2));\n            // keys are not returned in order created...\n            auto keys = resp.keys().keys();\n            std::sort(keys.begin(), keys.end());\n            ASSERT_EQ(keys[0], \"key1\");\n            ASSERT_EQ(keys[1], \"key2\");\n        });\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // invalid uuid returns empty message...\n    msg.mutable_header()->set_db_uuid(\"invalid-uuid\");\n    expect_signed_response(session, \"invalid-uuid\", uint64_t(123), database_response::kError, std::nullopt,\n        [](const auto& resp)\n        {\n            ASSERT_EQ(resp.header().db_uuid(), \"invalid-uuid\");\n            ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::db_not_found));\n        });\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // null session nothing should happen...\n    crud->handle_request(\"caller_id\", msg, nullptr);\n}\n\n\nTEST(crud, test_that_point_of_contact_keys_sends_proper_response)\n{\n    auto mock_node = std::make_shared<bzn::mock_node_base>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), mock_node);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n\n    msg.mutable_header()->set_point_of_contact(\"point_of_contact\");\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create_db();\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>()));\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // test keys...\n    msg.mutable_create()->set_key(\"key1\");\n    msg.mutable_create()->set_value(\"value\");\n\n    // add key...\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>()));\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // add another...\n    msg.mutable_create()->set_key(\"key2\");\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>()));\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // clear msg...\n    msg.mutable_create()->release_key();\n    msg.mutable_create()->release_value();\n\n    // get keys...\n    msg.mutable_keys();\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [&](const auto&, auto msg)\n        {\n            database_response resp;\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.header().nonce(), uint64_t(123));\n            ASSERT_EQ(resp.response_case(), database_response::kKeys);\n            ASSERT_EQ(resp.keys().keys().size(), int(2));\n            // keys are not returned in order created...\n            auto keys = resp.keys().keys();\n            std::sort(keys.begin(), keys.end());\n            ASSERT_EQ(keys[0], \"key1\");\n            ASSERT_EQ(keys[1], \"key2\");\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // invalid uuid returns empty message...\n    msg.mutable_header()->set_db_uuid(\"invalid-uuid\");\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [&](const auto&, auto msg)\n        {\n            database_response resp;\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"invalid-uuid\");\n            ASSERT_EQ(resp.header().nonce(), uint64_t(123));\n            ASSERT_EQ(resp.response_case(), database_response::kError);\n            ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::db_not_found));\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // null session nothing should happen...\n    msg.mutable_header()->clear_point_of_contact();\n    crud->handle_request(\"caller_id\", msg, nullptr);\n}\n\n\nTEST(crud, test_that_size_sends_proper_response)\n{\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), nullptr);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create_db();\n    msg.mutable_create_db()->set_max_size(1234);\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // test size...\n    msg.mutable_create()->set_key(\"key\");\n    msg.mutable_create()->set_value(\"value\");\n\n    // add key...\n    auto session = std::make_shared<bzn::mock_session_base>();\n\n    expect_signed_response(session);\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // clear msg...\n    msg.mutable_create()->release_key();\n    msg.mutable_create()->release_value();\n\n    // get size...\n    msg.mutable_size();\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kSize, std::nullopt,\n        [](auto resp)\n        {\n            ASSERT_EQ(resp.size().bytes(), uint64_t(8));\n            ASSERT_EQ(resp.size().keys(), uint32_t(1));\n            ASSERT_EQ(resp.size().max_size(), uint64_t(1234));\n        });\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // invalid uuid returns zero...\n    msg.mutable_header()->set_db_uuid(\"invalid-uuid\");\n    expect_signed_response(session, \"invalid-uuid\", uint64_t(123), database_response::kError);\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // null session nothing should happen...\n    crud->handle_request(\"caller_id\", msg, nullptr);\n}\n\n\nTEST(crud, test_that_point_of_contact_size_sends_proper_response)\n{\n    auto mock_node = std::make_shared<bzn::mock_node_base>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), mock_node);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n\n    msg.mutable_header()->set_point_of_contact(\"point_of_contact\");\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create_db();\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>()));\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // test size...\n    msg.mutable_create()->set_key(\"key\");\n    msg.mutable_create()->set_value(\"value\");\n\n    // add key...\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>()));\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // clear msg...\n    msg.mutable_create()->release_key();\n    msg.mutable_create()->release_value();\n\n    // get size...\n    msg.mutable_size();\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [&](const auto&, auto msg)\n        {\n            database_response resp;\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.header().nonce(), uint64_t(123));\n            ASSERT_EQ(resp.response_case(), database_response::kSize);\n            ASSERT_EQ(resp.size().bytes(), uint64_t(8));\n            ASSERT_EQ(resp.size().keys(), uint32_t(1));\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // invalid uuid returns zero...\n    msg.mutable_header()->set_db_uuid(\"invalid-uuid\");\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [&](const auto&, auto msg)\n        {\n            database_response resp;\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"invalid-uuid\");\n            ASSERT_EQ(resp.header().nonce(), uint64_t(123));\n            ASSERT_EQ(resp.response_case(), database_response::kError);\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // null session nothing should happen...\n    msg.mutable_header()->clear_point_of_contact();\n    crud->handle_request(\"caller_id\", msg, nullptr);\n}\n\n\nTEST(crud, test_that_subscribe_request_calls_subscription_manager)\n{\n    auto mock_subscription_manager = std::make_shared<bzn::mock_subscription_manager_base>();\n\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(), mock_subscription_manager, nullptr);\n\n    EXPECT_CALL(*mock_subscription_manager, start());\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    // subscribe...\n    database_msg msg;\n\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_subscribe()->set_key(\"key\");\n\n    // nothing should happen...\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // try again with a valid session...\n    auto mock_session = std::make_shared<bzn::mock_session_base>();\n\n    EXPECT_CALL(*mock_subscription_manager, subscribe(msg.header().db_uuid(), msg.subscribe().key(),\n        msg.header().nonce(), _, _));\n\n    expect_signed_response(mock_session);\n\n    crud->handle_request(\"caller_id\", msg, mock_session);\n}\n\n\nTEST(crud, test_that_unsubscribe_request_calls_subscription_manager)\n{\n    auto mock_subscription_manager = std::make_shared<bzn::mock_subscription_manager_base>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(), mock_subscription_manager, nullptr);\n\n    EXPECT_CALL(*mock_subscription_manager, start());\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    // unsubscribe...\n    database_msg msg;\n\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_unsubscribe()->set_key(\"key\");\n    msg.mutable_unsubscribe()->set_nonce(321);\n\n    // nothing should happen...\n    crud->handle_request(\"caller_id\", msg, nullptr);\n    \n    auto mock_session = std::make_shared<bzn::mock_session_base>();\n\n    EXPECT_CALL(*mock_subscription_manager, unsubscribe(msg.header().db_uuid(), msg.unsubscribe().key(),\n        msg.unsubscribe().nonce(), _, _));\n\n    expect_signed_response(mock_session);\n\n    crud->handle_request(\"caller_id\", msg, mock_session);\n}\n\n\nTEST(crud, test_that_create_db_request_sends_proper_response)\n{\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), nullptr);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    // create database...\n    database_msg msg;\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create_db();\n\n    auto mock_session = std::make_shared<bzn::mock_session_base>();\n\n    expect_signed_response(mock_session, \"uuid\", std::nullopt, database_response::RESPONSE_NOT_SET);\n\n    crud->handle_request(\"caller_id\", msg, mock_session);\n\n    expect_signed_response(mock_session, \"uuid\", std::nullopt, std::nullopt, bzn::storage_result_msg.at(bzn::storage_result::db_exists));\n\n    // try to create it again...\n    crud->handle_request(\"caller_id\", msg, mock_session);\n}\n\n\nTEST(crud, test_that_point_of_contact_create_db_request_sends_proper_response)\n{\n    auto mock_node = std::make_shared<bzn::mock_node_base>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), mock_node);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    // create database...\n    database_msg msg;\n\n    msg.mutable_header()->set_point_of_contact(\"point_of_contact\");\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n\n    msg.mutable_create_db();\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [](const auto&, auto msg)\n        {\n            database_response resp;\n\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.response_case(), database_response::RESPONSE_NOT_SET);\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [](const auto&, auto msg)\n        {\n            database_response resp;\n\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::db_exists));\n        }));\n\n    // try to create it again...\n    crud->handle_request(\"caller_id\", msg, nullptr);\n}\n\n\nTEST(crud, test_that_has_db_request_sends_proper_response)\n{\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), nullptr);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n\n    // create db...\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create_db();\n\n    // nothing should happen...\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    auto mock_session = std::make_shared<bzn::mock_session_base>();\n\n    // request has db..\n    msg.mutable_has_db();\n\n    expect_signed_response(mock_session, \"uuid\", std::nullopt, database_response::kHasDb, std::nullopt,\n        [](auto resp)\n        {\n            ASSERT_TRUE(resp.has_db().has());\n        });\n\n    crud->handle_request(\"caller_id\", msg, mock_session);\n\n    // request invalid db...\n    msg.mutable_header()->set_db_uuid(\"invalid-uuid\");\n\n    expect_signed_response(mock_session, std::nullopt, std::nullopt, database_response::kHasDb, std::nullopt,\n        [](auto resp)\n        {\n            ASSERT_FALSE(resp.has_db().has());\n            ASSERT_EQ(resp.has_db().uuid(), \"invalid-uuid\");\n        });\n\n    crud->handle_request(\"caller_id\", msg, mock_session);\n}\n\n\nTEST(crud, test_that_point_of_contact_has_db_request_sends_proper_response)\n{\n    auto mock_node = std::make_shared<bzn::mock_node_base>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), mock_node);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n\n    // create db...\n    msg.mutable_header()->set_point_of_contact(\"point_of_contact\");\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create_db();\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>()));\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // request has db..\n    msg.mutable_has_db();\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [](const auto&, auto msg)\n        {\n            database_response resp;\n\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.response_case(), database_response::kHasDb);\n            ASSERT_EQ(resp.has_db().uuid(), \"uuid\");\n            ASSERT_TRUE(resp.has_db().has());\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // request invalid db...\n    msg.mutable_header()->set_db_uuid(\"invalid-uuid\");\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [](const auto&, auto msg)\n        {\n            database_response resp;\n\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.response_case(), database_response::kHasDb);\n            ASSERT_EQ(resp.has_db().uuid(), \"invalid-uuid\");\n            ASSERT_FALSE(resp.has_db().has());\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n}\n\n\nTEST(crud, test_that_delete_db_sends_proper_response)\n{\n    auto storage = std::make_shared<bzn::mem_storage>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), nullptr);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    // delete database...\n    database_msg msg;\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_delete_db();\n\n    auto mock_session = std::make_shared<bzn::mock_session_base>();\n\n    expect_signed_response(mock_session, \"uuid\", std::nullopt, std::nullopt, bzn::storage_result_msg.at(bzn::storage_result::db_not_found));\n\n    crud->handle_request(\"caller_id\", msg, mock_session);\n\n    // create a database...\n    msg.mutable_create_db();\n\n    expect_signed_response(mock_session);\n\n    crud->handle_request(\"caller_id\", msg, mock_session);\n\n    // add a key with a ttl\n    msg.mutable_create()->set_key(\"key1\");\n    msg.mutable_create()->set_value(\"value\");\n    msg.mutable_create()->set_expire(123);\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // delete database...\n    msg.mutable_delete_db();\n\n    expect_signed_response(mock_session, \"uuid\", std::nullopt, std::nullopt, bzn::storage_result_msg.at(bzn::storage_result::access_denied));\n\n    // non-owner caller...\n    crud->handle_request(\"bad_caller_id\", msg, mock_session);\n\n    expect_signed_response(mock_session, \"uuid\", std::nullopt, database_response::RESPONSE_NOT_SET);\n\n    crud->handle_request(\"caller_id\", msg, mock_session);\n\n    // test storage for ttl entry\n    Json::Value ttl_key;\n    ttl_key[\"uuid\"] = \"uuid\";\n    ttl_key[\"key\"] = \"key1\";\n\n    ASSERT_FALSE(storage->has(TTL_UUID, ttl_key.toStyledString()));\n}\n\n\nTEST(crud, test_that_point_of_contact_delete_db_sends_proper_response)\n{\n    auto mock_node = std::make_shared<bzn::mock_node_base>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), mock_node);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    // delete database...\n    database_msg msg;\n\n    msg.mutable_header()->set_point_of_contact(\"point_of_contact\");\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_delete_db();\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [](const auto&, auto msg)\n        {\n            database_response resp;\n\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::db_not_found));\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // create a database...\n    msg.mutable_create_db();\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>()));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    // delete database...\n    msg.mutable_delete_db();\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [](const auto&, auto msg)\n        {\n            database_response resp;\n\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::access_denied));\n        }));\n\n    // non-owner caller...\n    crud->handle_request(\"bad_caller_id\", msg, nullptr);\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [](const auto&, auto msg)\n        {\n            database_response resp;\n\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.response_case(), database_response::RESPONSE_NOT_SET);\n        }));\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n}\n\n\nTEST(crud, test_that_state_can_be_saved_and_retrieved)\n{\n    bzn::crud crud(std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>(), std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), nullptr);\n\n    ASSERT_TRUE(crud.save_state());\n\n    auto state = crud.get_saved_state();\n\n    ASSERT_TRUE(state);\n\n    ASSERT_TRUE(crud.load_state(*state));\n}\n\n\nTEST(crud, test_that_writers_sends_proper_response)\n{\n    bzn::crud crud(std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>(), std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), nullptr);\n\n    // create database...\n    database_msg msg;\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create_db();\n\n    auto mock_session = std::make_shared<bzn::mock_session_base>();\n\n    expect_signed_response(mock_session);\n\n    crud.handle_request(\"caller_id\", msg, mock_session);\n\n    // request writers...\n    msg.mutable_writers();\n\n    // only the owner should be set at this stage...\n    expect_signed_response(mock_session, \"uuid\", std::nullopt, database_response::kWriters, std::nullopt,\n        [](auto resp)\n        {\n            ASSERT_EQ(resp.writers().owner(), \"caller_id\");\n            ASSERT_EQ(resp.writers().writers().size(), 0);\n        });\n\n    crud.handle_request(\"caller_id\", msg, mock_session);\n}\n\n\nTEST(crud, test_that_point_of_contact_writers_sends_proper_response)\n{\n    auto mock_node = std::make_shared<bzn::mock_node_base>();\n\n    bzn::crud crud(std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>(), std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), mock_node);\n\n    // create database...\n    database_msg msg;\n    msg.mutable_header()->set_point_of_contact(\"point_of_contact\");\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create_db();\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>()));\n\n    crud.handle_request(\"caller_id\", msg, nullptr);\n\n    // request writers...\n    msg.mutable_writers();\n\n    // only the owner should be set at this stage...\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [](const auto&, auto msg)\n        {\n            database_response resp;\n\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.response_case(), database_response::kWriters);\n            ASSERT_EQ(resp.writers().owner(), \"caller_id\");\n            ASSERT_EQ(resp.writers().writers().size(), 0);\n        }));\n\n    crud.handle_request(\"caller_id\", msg, nullptr);\n}\n\n\nTEST(crud, test_that_add_writers_sends_proper_response)\n{\n    bzn::crud crud(std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>(), std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), nullptr);\n\n    // create database...\n    database_msg msg;\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create_db();\n\n    auto mock_session = std::make_shared<bzn::mock_session_base>();\n\n    expect_signed_response(mock_session);\n\n    crud.handle_request(\"caller_id\", msg, mock_session);\n\n    // request writers...\n\n    // should not be added to writers as this is the owner\n    msg.mutable_add_writers()->add_writers(\"caller_id\");\n    msg.mutable_add_writers()->add_writers(\"client_1_key\");\n    msg.mutable_add_writers()->add_writers(\"client_2_key\");\n\n    expect_signed_response(mock_session, \"uuid\", std::nullopt, database_response::RESPONSE_NOT_SET);\n\n    crud.handle_request(\"caller_id\", msg, mock_session);\n\n    // access test\n    expect_signed_response(mock_session, \"uuid\", std::nullopt, std::nullopt, bzn::storage_result_msg.at(bzn::storage_result::access_denied));\n\n    crud.handle_request(\"other_caller_id\", msg, mock_session);\n\n    // request writers...\n    msg.mutable_writers();\n\n    // only the owner should be set at this stage...\n    expect_signed_response(mock_session, \"uuid\", std::nullopt, database_response::kWriters, std::nullopt,\n        [](auto resp)\n        {\n            ASSERT_EQ(resp.writers().owner(), \"caller_id\");\n            ASSERT_EQ(resp.writers().writers().size(), 2);\n            ASSERT_EQ(resp.writers().writers()[0], \"client_1_key\");\n            ASSERT_EQ(resp.writers().writers()[1], \"client_2_key\");\n        });\n\n    crud.handle_request(\"caller_id\", msg, mock_session);\n}\n\n\nTEST(crud, test_that_point_of_contact_add_writers_sends_proper_response)\n{\n    auto mock_node = std::make_shared<bzn::mock_node_base>();\n\n    bzn::crud crud(std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>(), std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), mock_node);\n\n    // create database...\n    database_msg msg;\n    msg.mutable_header()->set_point_of_contact(\"point_of_contact\");\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create_db();\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>()));\n\n    crud.handle_request(\"caller_id\", msg, nullptr);\n\n    // request writers...\n\n    // should not be added to writers as this is the owner\n    msg.mutable_add_writers()->add_writers(\"caller_id\");\n\n    msg.mutable_add_writers()->add_writers(\"client_1_key\");\n    msg.mutable_add_writers()->add_writers(\"client_2_key\");\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [](const auto&, auto msg)\n        {\n            database_response resp;\n\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.response_case(), database_response::RESPONSE_NOT_SET);\n        }));\n\n    crud.handle_request(\"caller_id\", msg, nullptr);\n\n    // access test\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [](const auto&, auto msg)\n        {\n            database_response resp;\n\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::access_denied));\n        }));\n\n    crud.handle_request(\"other_caller_id\", msg, nullptr);\n\n    // request writers...\n    msg.mutable_writers();\n\n    // only the owner should be set at this stage...\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [](const auto&, auto msg)\n        {\n            database_response resp;\n\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.response_case(), database_response::kWriters);\n            ASSERT_EQ(resp.writers().owner(), \"caller_id\");\n            ASSERT_EQ(resp.writers().writers().size(), 2);\n            ASSERT_EQ(resp.writers().writers()[0], \"client_1_key\");\n            ASSERT_EQ(resp.writers().writers()[1], \"client_2_key\");\n        }));\n\n    crud.handle_request(\"caller_id\", msg, nullptr);\n}\n\n\nTEST(crud, test_that_remove_writers_sends_proper_response)\n{\n    bzn::crud crud(std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>(), std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), nullptr);\n\n    // create database...\n    database_msg msg;\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create_db();\n\n    auto mock_session = std::make_shared<bzn::mock_session_base>();\n\n    expect_signed_response(mock_session);\n\n    crud.handle_request(\"caller_id\", msg, mock_session);\n\n    // request writers...\n\n    msg.mutable_add_writers()->add_writers(\"client_1_key\");\n    msg.mutable_add_writers()->add_writers(\"client_2_key\");\n\n    expect_signed_response(mock_session);\n\n    crud.handle_request(\"caller_id\", msg, mock_session);\n\n    // remove writers...\n    msg.mutable_remove_writers()->add_writers(\"client_2_key\");\n\n    expect_signed_response(mock_session, \"uuid\", std::nullopt, database_response::RESPONSE_NOT_SET);\n\n    crud.handle_request(\"caller_id\", msg, mock_session);\n\n    // access test\n    expect_signed_response(mock_session, \"uuid\", std::nullopt, std::nullopt, bzn::storage_result_msg.at(bzn::storage_result::access_denied));\n\n    crud.handle_request(\"other_caller_id\", msg, mock_session);\n}\n\n\nTEST(crud, test_that_point_of_contact_remove_writers_sends_proper_response)\n{\n    auto mock_node = std::make_shared<bzn::mock_node_base>();\n\n    bzn::crud crud(std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>(), std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), mock_node);\n\n    // create database...\n    database_msg msg;\n    msg.mutable_header()->set_point_of_contact(\"point_of_contact\");\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create_db();\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>()));\n\n    crud.handle_request(\"caller_id\", msg, nullptr);\n\n    // request writers...\n\n    msg.mutable_add_writers()->add_writers(\"client_1_key\");\n    msg.mutable_add_writers()->add_writers(\"client_2_key\");\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>()));\n\n    crud.handle_request(\"caller_id\", msg, nullptr);\n\n    // remove writers...\n    msg.mutable_remove_writers()->add_writers(\"client_2_key\");\n\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [](const auto&, auto msg)\n        {\n            database_response resp;\n\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.response_case(), database_response::RESPONSE_NOT_SET);\n        }));\n\n    crud.handle_request(\"caller_id\", msg, nullptr);\n\n    // access test\n    EXPECT_CALL(*mock_node, send_signed_message(\"point_of_contact\", An<std::shared_ptr<bzn_envelope>>())).WillOnce(Invoke(\n        [](const auto&, auto msg)\n        {\n            database_response resp;\n\n            ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString()));\n            ASSERT_EQ(resp.header().db_uuid(), \"uuid\");\n            ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::access_denied));\n        }));\n\n    crud.handle_request(\"other_caller_id\", msg, nullptr);\n}\n\n\nTEST(crud, test_that_key_with_expire_set_is_deleted_by_timer_callback)\n{\n    auto mock_subscription_manager = std::make_shared<bzn::mock_subscription_manager_base>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n    auto mock_steady_timer = std::make_unique<bzn::asio::mock_steady_timer_base>();\n\n    EXPECT_CALL(*mock_steady_timer, expires_from_now(_)).Times(2);\n\n    bzn::asio::wait_handler wh;\n    EXPECT_CALL(*mock_steady_timer, async_wait(_)).WillRepeatedly(Invoke(\n        [&](auto handler)\n        {\n            wh = handler;\n        }));\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::move(mock_steady_timer);\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(), mock_subscription_manager, nullptr);\n\n    EXPECT_CALL(*mock_subscription_manager, start());\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    bzn::uuid_t node_uuid{\"node-uuid\"};\n    EXPECT_CALL(*mock_pbft, get_uuid()).WillOnce(ReturnRef(node_uuid));\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n\n    auto session = std::make_shared<bzn::mock_session_base>();\n\n    msg.mutable_create_db();\n    expect_signed_response(session, \"uuid\", 123, database_response::RESPONSE_NOT_SET);\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // create key with expiration...\n    msg.mutable_create()->set_key(\"key\");\n    msg.mutable_create()->set_value(\"value\");\n    msg.mutable_create()->set_expire(1);\n\n    EXPECT_CALL(*mock_subscription_manager, inspect_commit(_));\n    expect_signed_response(session, \"uuid\", 123, database_response::RESPONSE_NOT_SET);\n    crud->handle_request(\"caller_id\", msg, session);\n\n    sleep(2); // force expiration\n\n    // call background timer...\n    EXPECT_CALL(*mock_pbft, handle_database_message(_,_));\n    wh(boost::system::error_code());\n\n    // key should be gone...\n    msg.mutable_read()->set_key(\"key\");\n\n    expect_signed_response(session, \"uuid\", 123, database_response::kError);\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // failure does nothing...\n    wh(make_error_code(boost::system::errc::timed_out));\n}\n\n\nTEST(crud, test_that_key_with_expiration_can_be_made_persistent)\n{\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n    auto mock_steady_timer = std::make_unique<bzn::asio::mock_steady_timer_base>();\n\n    EXPECT_CALL(*mock_steady_timer, expires_from_now(_));\n    EXPECT_CALL(*mock_steady_timer, async_wait(_));\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::move(mock_steady_timer);\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), nullptr);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n\n    auto session = std::make_shared<bzn::mock_session_base>();\n\n    msg.mutable_create_db();\n    expect_signed_response(session, \"uuid\", 123, database_response::RESPONSE_NOT_SET);\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // create key with expiration...\n    msg.mutable_create()->set_key(\"key\");\n    msg.mutable_create()->set_value(\"value\");\n    msg.mutable_create()->set_expire(123);\n\n    expect_signed_response(session, \"uuid\", 123, database_response::RESPONSE_NOT_SET);\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // make key persist\n    msg.mutable_persist()->set_key(\"key\");\n\n    expect_signed_response(session, \"uuid\", 123, database_response::RESPONSE_NOT_SET);\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // should be gone\n    msg.mutable_ttl()->set_key(\"key\");\n    expect_signed_response(session, \"uuid\", 123, database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::ttl_not_found));\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // make key persist that no longer exists\n    msg.mutable_persist()->set_key(\"key\");\n    expect_signed_response(session, \"uuid\", 123, database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::ttl_not_found));\n    crud->handle_request(\"caller_id\", msg, session);\n}\n\n\nTEST(crud, test_that_create_db_uses_bluzelle_key_to_validate)\n{\n    auto mock_subscription_manager = std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n    auto session = std::make_shared<bzn::mock_session_base>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n            [&]()\n            {\n                return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n            }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n                                            mock_subscription_manager, nullptr, \"caller_id\");\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n    msg.mutable_create_db();\n\n    EXPECT_CALL(*session, send_signed_message(_)).WillOnce(Invoke(\n            [=](std::shared_ptr<bzn_envelope> env)\n            {\n                database_response resp;\n                resp.ParseFromString(env->database_response());\n                EXPECT_EQ(database_response::ResponseCase::RESPONSE_NOT_SET,resp.response_case());\n                EXPECT_EQ(\"\", resp.error().message());\n            }));\n    crud->handle_request(\"caller_id\", msg, session);\n}\n\n\nTEST(crud, test_that_create_db_with_incorrect_bluzelle_key_fails_to_validate)\n{\n    auto mock_subscription_manager = std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n    auto session = std::make_shared<bzn::mock_session_base>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n            [&]()\n            {\n                return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n            }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(), mock_subscription_manager, nullptr, \"caller_id\");\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n    msg.mutable_create_db();\n\n    EXPECT_CALL(*session, send_signed_message(_)).WillOnce(Invoke(\n            [=](std::shared_ptr<bzn_envelope> env)\n            {\n                database_response resp;\n                resp.ParseFromString(env->database_response());\n                EXPECT_EQ(database_response::ResponseCase::kError,resp.response_case());\n                EXPECT_EQ(bzn::storage_result_msg.at(bzn::storage_result::access_denied), resp.error().message());\n            }));\n    crud->handle_request(\"not_the_caller_id\", msg, session);\n}\n\n\nTEST(crud, test_that_delete_db_uses_bluzelle_key_to_validate)\n{\n    auto mock_subscription_manager = std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n    auto session = std::make_shared<bzn::mock_session_base>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n            [&]()\n            {\n                return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n            }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(), mock_subscription_manager, nullptr, \"caller_id\");\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    {\n        database_msg msg;\n        msg.mutable_header()->set_db_uuid(\"uuid\");\n        msg.mutable_header()->set_nonce(uint64_t(123));\n        msg.mutable_create_db();\n\n        EXPECT_CALL(*session, send_signed_message(_)).WillOnce(Invoke(\n                [=](std::shared_ptr<bzn_envelope> env)\n                {\n                    database_response resp;\n                    resp.ParseFromString(env->database_response());\n                    EXPECT_EQ(database_response::ResponseCase::RESPONSE_NOT_SET,resp.response_case());\n                    EXPECT_EQ(\"\", resp.error().message());\n                }));\n        crud->handle_request(\"caller_id\", msg, session);\n    }\n\n    {\n        database_msg msg;\n        msg.mutable_header()->set_db_uuid(\"uuid\");\n        msg.mutable_header()->set_nonce(uint64_t(123));\n        msg.mutable_delete_db();\n\n        EXPECT_CALL(*session, send_signed_message(_)).WillOnce(Invoke(\n                [=](std::shared_ptr<bzn_envelope> env)\n                {\n                    database_response resp;\n                    resp.ParseFromString(env->database_response());\n                    EXPECT_EQ(database_response::ResponseCase::RESPONSE_NOT_SET,resp.response_case());\n                    EXPECT_EQ(\"\", resp.error().message());\n                }));\n        crud->handle_request(\"caller_id\", msg, session);\n    }\n}\n\n\nTEST(crud, test_that_delete_db_with_incorrect_bluzelle_key_fails_to_validate)\n{\n    auto mock_subscription_manager = std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n    auto session = std::make_shared<bzn::mock_session_base>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n            [&]()\n            {\n                return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n            }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(), mock_subscription_manager, nullptr, \"caller_id\");\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    {\n        database_msg msg;\n        msg.mutable_header()->set_db_uuid(\"uuid\");\n        msg.mutable_header()->set_nonce(uint64_t(123));\n        msg.mutable_create_db();\n\n        EXPECT_CALL(*session, send_signed_message(_)).WillOnce(Invoke(\n                [=](std::shared_ptr<bzn_envelope> env)\n                {\n                    database_response resp;\n                    resp.ParseFromString(env->database_response());\n                    EXPECT_EQ(database_response::ResponseCase::RESPONSE_NOT_SET, resp.response_case());\n                    EXPECT_EQ(\"\", resp.error().message());\n                }));\n        crud->handle_request(\"caller_id\", msg, session);\n    }\n\n    {\n        database_msg msg;\n        msg.mutable_header()->set_db_uuid(\"uuid\");\n        msg.mutable_header()->set_nonce(uint64_t(123));\n        msg.mutable_delete_db();\n\n        EXPECT_CALL(*session, send_signed_message(_)).WillOnce(Invoke(\n                [=](std::shared_ptr<bzn_envelope> env)\n                {\n                    database_response resp;\n                    resp.ParseFromString(env->database_response());\n                    EXPECT_EQ(database_response::ResponseCase::kError, resp.response_case());\n                    EXPECT_EQ(bzn::storage_result_msg.at(bzn::storage_result::access_denied), resp.error().message());\n                }));\n        crud->handle_request(\"NOT_caller_id\", msg, session);\n    }\n}\n\n\nTEST(crud, test_assumption_that_boost_random_mt19937_produces_the_same_values_for_a_given_seed)\n{\n    // This test is only to validate the assumption that mt19937 behaves the same on multiple operating systems. The\n    // actual values were created on macOS Mojave with boost 1.68.0. If this test ever fails the developers need to be\n    // told immediately\n    const uint64_t KEY_COUNT{422};\n    const uint64_t seed{2615920895};\n    boost::random::uniform_int_distribution<> dist(0, KEY_COUNT - 1);\n    std::vector<size_t> accepted_random_integers{308, 88, 77, 377, 58, 109, 101, 369, 14, 269};\n    std::vector<size_t> actual_random_integers(10,0);\n    boost::random::mt19937 mt(seed); // mt19937 chosen because it is fast\n    std::for_each(actual_random_integers.begin(), actual_random_integers.end(), [&](auto& val){ val = dist(mt); });\n    ASSERT_EQ(actual_random_integers, accepted_random_integers);\n}\n\n\nTEST(crud, test_that_create_and_updates_which_exceed_db_limit_send_proper_responses)\n{\n    auto mock_subscription_manager = std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n    auto session = std::make_shared<bzn::mock_session_base>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(), mock_subscription_manager, nullptr);\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n\n    // create db\n    msg.mutable_create_db();\n    msg.mutable_create_db()->set_max_size(10);\n\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::RESPONSE_NOT_SET);\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // create a key that exceeds db limit..\n    msg.mutable_create()->set_key(\"key\");\n    msg.mutable_create()->set_value(\"00000000\"); // 1 too many (key+value size)\n\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kError\n            , bzn::storage_result_msg.at(bzn::storage_result::value_too_large));\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // create key...\n    msg.mutable_create()->set_key(\"key\");\n    msg.mutable_create()->set_value(\"0000000\"); // exactly db limit\n\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::RESPONSE_NOT_SET);\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // update but not exceed db limit...\n    msg.mutable_update()->set_key(\"key\");\n    msg.mutable_update()->set_value(\"1111111\"); // exactly db limit\n\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::RESPONSE_NOT_SET);\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // update but exceed db limit...\n    msg.mutable_update()->set_key(\"key\");\n    msg.mutable_update()->set_value(\"11111110\"); // exactly db limit\n\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kError);\n    crud->handle_request(\"caller_id\", msg, session);\n}\n\n\n// TODO: RHN - Move the random eviction policy tests to the policy module\nTEST(crud, test_random_eviction_policy_randomly_removes_a_key_value_pair_for_create)\n{\n    const size_t TEST_VALUE_SIZE{20};\n    const uint64_t MAX_SIZE{512};\n    const bzn::uuid_t DB_UUID{\"sut_uuid\"};\n    const bzn::uuid_t CALLER_UUID{\"caller_id\"};\n    const uint64_t NONCE{123};\n    const std::string REQUEST_HASH{generate_random_hash()};\n\n    std::shared_ptr<bzn::mock_session_base> session;\n    std::shared_ptr<bzn::mock_node_base> mock_node;\n\n    auto crud{initialize_crud(session, mock_node, CALLER_UUID)};\n    remove_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID);\n    create_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID, MAX_SIZE, database_create_db_eviction_policy_type_RANDOM);\n\n    // We have a cache with random eviction and max size MAX_SIZE bytes, fill up the database to just under the limit\n    // Fill up our database to almost the MAX_SIZE, such that doubling the size of one value via an update will cause\n    // a potential overflow\n    size_t key_count{fill_database(crud, session, mock_node, CALLER_UUID, REQUEST_HASH, DB_UUID, TEST_VALUE_SIZE, MAX_SIZE)};\n\n    const std::set<std::string> pre_eviction_keys{get_database_keys(crud, session, mock_node, CALLER_UUID, DB_UUID)};\n\n    // Add one more key, to push the storage over the top, this is a cache, so there will be no error, simply an\n    // eviction of an existing key\n    database_msg msg{build_create_msg(CALLER_UUID, DB_UUID, NONCE, generate_random_hash(), make_key(key_count + 1), make_value(TEST_VALUE_SIZE))};\n\n    // In this case we expect a db_full error as the key/value pair is larger than the storage limit.\n    expect_signed_response(session, DB_UUID, NONCE, database_response::RESPONSE_NOT_SET);\n    EXPECT_CALL(*mock_node, send_signed_message(A<const std::string&>(),_));\n\n    crud->handle_request(CALLER_UUID, msg, session);\n\n    // After 1 replacement the number of keys must be the same, and, in this case, the size of the database must be the\n    // same.\n    {\n        const auto [keys, size]{get_database_size(crud, session, mock_node, CALLER_UUID, DB_UUID)};\n        ASSERT_EQ( uint32_t(key_count), keys);\n        ASSERT_EQ( keys * (make_key(0).length() + TEST_VALUE_SIZE), size);\n    }\n\n    // Compare the post eviction set of keys to the pre eviction set of keys, there should be a difference of one key\n    std::set<std::string> post_eviction_keys{get_database_keys(crud, session, mock_node, CALLER_UUID, DB_UUID)};\n\n    std::set<std::string> difference;\n    std::set_difference(pre_eviction_keys.begin(), pre_eviction_keys.end(), post_eviction_keys.begin(), post_eviction_keys.end(), std::inserter(difference, difference.begin()));\n\n    ASSERT_EQ(size_t(1), difference.size());\n\n    // Clean up by removing the test database\n    remove_test_database(crud, session, mock_node, DB_UUID, CALLER_UUID);\n}\n\n\nTEST(crud, test_random_eviction_policy_with_large_value_requiring_many_evictions_for_create)\n{\n    const bzn::value_t TEST_VALUE{\"This is a very long string to use as a test value...\"};\n    const u_int64_t MAX_SIZE{8096};\n    const bzn::uuid_t DB_UUID{\"sut_uuid\"};\n    const bzn::uuid_t CALLER_UUID{\"caller_id\"};\n    const size_t VALUE_SIZE{42};\n    const bzn::value_t LARGE_TEST_VALUE{make_value(3 * VALUE_SIZE)};\n    const std::string REQUEST_HASH{generate_random_hash()};\n\n    std::shared_ptr<bzn::mock_session_base> session;\n    std::shared_ptr<bzn::mock_node_base> mock_node;\n\n    auto crud{initialize_crud(session, mock_node, CALLER_UUID)};\n    remove_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID);\n    create_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID, MAX_SIZE, database_create_db_eviction_policy_type_RANDOM);\n\n    // We have a cache with random eviction and max size MAX_SIZE bytes, fill up the database to just under the limit\n    size_t key_count = fill_database(crud, session, mock_node, CALLER_UUID, REQUEST_HASH, DB_UUID, VALUE_SIZE, MAX_SIZE);\n\n    const std::set<std::string> pre_eviction_keys{get_database_keys(crud, session, mock_node, CALLER_UUID, DB_UUID)};\n\n    // The cache is now less than one TEST_VALUE from its max storage limit. Add a very large value to ensure that\n    // enough key/value pairs are removed to make room for the new key/value pair\n    create_key_value(crud, session, mock_node, CALLER_UUID, generate_random_hash(), DB_UUID, make_key(key_count), LARGE_TEST_VALUE);\n\n    // Compare the actual set of keys, there must be a difference of more than one key\n    std::set<std::string> post_eviction_keys{get_database_keys(crud, session, mock_node, CALLER_UUID, DB_UUID)};\n\n    {\n        size_t size;\n        std::tie(std::ignore, size) = get_database_size(crud, session, mock_node, CALLER_UUID, DB_UUID);\n        ASSERT_LE(size, MAX_SIZE);\n    }\n\n    std::set<std::string> difference;\n    std::set_difference(pre_eviction_keys.begin(), pre_eviction_keys.end(), post_eviction_keys.begin(), post_eviction_keys.end(), std::inserter(difference, difference.begin()));\n\n    ASSERT_TRUE(difference.size() > 1);\n}\n\n\nTEST(crud, test_random_eviction_policy_edge_case_of_create_with_value_larger_than_max_storage)\n{\n    // TODO: RHN - I think this test is not useful as it tests functionality that has nothing to do with eviction\n    const uint64_t MAX_SIZE{8096};\n    const bzn::value_t TOO_LARGE_TEST_VALUE{make_value(MAX_SIZE)};\n    const bzn::uuid_t DB_UUID{\"sut_uuid\"};\n    const bzn::uuid_t CALLER_UUID{\"caller_id\"};\n    const uint64_t NONCE{123};\n    const std::string REQUEST_HASH{generate_random_hash()};\n\n    std::shared_ptr<bzn::mock_session_base> session;\n    std::shared_ptr<bzn::mock_node_base> mock_node;\n\n    auto crud{initialize_crud(session, mock_node, CALLER_UUID)};\n\n    remove_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID);\n    create_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID, MAX_SIZE, database_create_db_eviction_policy_type_RANDOM);\n\n    database_msg msg{build_create_msg(CALLER_UUID, DB_UUID, NONCE, REQUEST_HASH, make_key(0), make_value(MAX_SIZE))};\n\n    // In this case we expect a value_too_large error as the key/value pair is larger than the storage limit.\n    expect_signed_response(session, DB_UUID, NONCE, database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::value_too_large));\n    EXPECT_CALL(*mock_node, send_signed_message(A<const std::string&>(),_));\n\n    crud->handle_request(CALLER_UUID, msg, session);\n\n    remove_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID);\n}\n\n\nTEST(crud, test_random_eviction_policy_randomly_removes_a_single_key_value_pair_for_update_that_exceeds_max_storage_by_small_amount)\n{\n    const uint64_t MAX_SIZE{8096};\n    const bzn::uuid_t DB_UUID{\"sut_uuid\"};\n    const bzn::uuid_t CALLER_UUID{\"caller_id\"};\n    const size_t VALUE_SIZE{45};\n    const std::string REQUEST_HASH{generate_random_hash()};\n\n    std::shared_ptr<bzn::mock_session_base> session;\n    std::shared_ptr<bzn::mock_node_base> mock_node;\n\n    auto crud{initialize_crud(session, mock_node, CALLER_UUID)};\n\n    remove_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID);\n    create_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID, MAX_SIZE, database_create_db_eviction_policy_type_RANDOM);\n\n    // Fill up our database to almost the MAX_SIZE, such that doubling the size of one value via an update will cause\n    // a potential overflow\n    fill_database(crud, session, mock_node, CALLER_UUID, REQUEST_HASH, DB_UUID, VALUE_SIZE, MAX_SIZE);\n\n    const std::set<std::string> pre_eviction_keys{get_database_keys(crud, session, mock_node, CALLER_UUID, DB_UUID)};\n\n    // the database is now less than one VALUE_SIZE + key size from over flowing. Trigger a single replacement\n    size_t size{0};\n    std::tie(std::ignore, size) = get_database_size(crud, session, mock_node, CALLER_UUID, DB_UUID);\n    const size_t STORAGE_FREE{MAX_SIZE - size};\n\n    update_key_value(crud, session, mock_node, CALLER_UUID, generate_random_hash(), DB_UUID, make_key(0), make_value(VALUE_SIZE + STORAGE_FREE + 1));\n\n    {\n        // The size of the database must be less than MAX_SIZE after the update\n        size_t db_size;\n        std::tie(std::ignore, db_size) = get_database_size(crud, session, mock_node, CALLER_UUID, DB_UUID);\n        ASSERT_LE(size, MAX_SIZE);\n    }\n\n    // Compare the post eviction set of keys to the pre eviction set of keys, there should be a difference of one key\n    std::set<std::string> post_eviction_keys{get_database_keys(crud, session, mock_node, CALLER_UUID, DB_UUID)};\n\n    std::set<std::string> difference;\n    std::set_difference(pre_eviction_keys.begin(), pre_eviction_keys.end(), post_eviction_keys.begin(), post_eviction_keys.end(), std::inserter(difference, difference.begin()));\n\n    ASSERT_EQ(size_t(1), difference.size());\n\n    // Clean up by removing the test database\n    remove_test_database(crud, session, mock_node, DB_UUID, CALLER_UUID);\n}\n\n\nTEST(crud, test_random_eviction_policy_randomly_removes_many_key_value_pairs_for_update_that_exceeds_max_storage_by_large_amount)\n{\n    const uint64_t MAX_SIZE{8096};\n    const bzn::uuid_t DB_UUID{\"sut_uuid\"};\n    const bzn::uuid_t CALLER_UUID{\"caller_id\"};\n    const size_t VALUE_SIZE{45};\n    const size_t LARGE_VALUE_SIZE{5 * VALUE_SIZE};\n    const std::string REQUEST_HASH{generate_random_hash()};\n\n    std::shared_ptr<bzn::mock_session_base> session;\n    std::shared_ptr<bzn::mock_node_base> mock_node;\n\n    auto crud{initialize_crud(session, mock_node, CALLER_UUID)};\n\n    remove_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID);\n    create_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID, MAX_SIZE, database_create_db_eviction_policy_type_RANDOM);\n\n    // Fill up our database to almost the MAX_SIZE, such that doubling the size of one value via an update will cause\n    // a potential overflow\n    fill_database(crud, session, mock_node, CALLER_UUID, generate_random_hash(), DB_UUID, VALUE_SIZE, MAX_SIZE);\n\n    const std::set<std::string> pre_eviction_keys{get_database_keys(crud, session, mock_node, CALLER_UUID, DB_UUID)};\n\n    // the database is now less than one VALUE_SIZE + key size from over flowing. Trigger a single replacement\n    size_t size{0};\n    std::tie(std::ignore, size) = get_database_size(crud, session, mock_node, CALLER_UUID, DB_UUID);\n    const size_t STORAGE_FREE{MAX_SIZE - size};\n\n    update_key_value(crud, session, mock_node, CALLER_UUID, generate_random_hash(), DB_UUID, make_key(0), make_value(LARGE_VALUE_SIZE + STORAGE_FREE));\n\n    {\n        // The size of the database must be less than MAX_SIZE after the update\n        size_t db_size{0};\n        std::tie(std::ignore, db_size) = get_database_size(crud, session, mock_node, CALLER_UUID, DB_UUID);\n        ASSERT_LE(size, MAX_SIZE);\n    }\n\n    // Compare the post eviction set of keys to the pre eviction set of keys, there should be a difference of one key\n    std::set<std::string> post_eviction_keys{get_database_keys(crud, session, mock_node, CALLER_UUID, DB_UUID)};\n\n    std::set<std::string> difference;\n    std::set_difference(pre_eviction_keys.begin(), pre_eviction_keys.end(), post_eviction_keys.begin(), post_eviction_keys.end(), std::inserter(difference, difference.begin()));\n    ASSERT_GT(difference.size(), size_t(1));\n\n    // Clean up by removing the test database\n    remove_test_database(crud, session, mock_node, DB_UUID, CALLER_UUID);\n}\n\n\n// These two eviction test should probably stay here as they are testing the eviction policies *and* crud\nTEST(crud, test_that_two_cruds_evict_the_same_key_value_pairs_using_the_random_eviction_policy)\n{\n    const size_t MAX_SIZE{8096};\n    const bzn::uuid_t DB_UUID{\"sut_uuid\"};\n    const bzn::uuid_t CALLER_UUID{\"caller_id\"};\n    const size_t VALUE_SIZE{27};\n    const std::string REQUEST_HASH{generate_random_hash()};\n\n    std::shared_ptr<bzn::mock_session_base> session_0;\n    std::shared_ptr<bzn::mock_node_base> mock_node_0;\n    auto crud_0{initialize_crud(session_0, mock_node_0, CALLER_UUID)};\n\n    std::shared_ptr<bzn::mock_session_base> session_1;\n    std::shared_ptr<bzn::mock_node_base> mock_node_1;\n    auto crud_1{initialize_crud(session_1, mock_node_1, CALLER_UUID)};\n\n    remove_test_database(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID);\n    create_test_database(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID, MAX_SIZE, database_create_db_eviction_policy_type_RANDOM);\n\n    remove_test_database(crud_1, session_1, mock_node_1, CALLER_UUID, DB_UUID);\n    create_test_database(crud_1, session_1, mock_node_1, CALLER_UUID, DB_UUID, MAX_SIZE, database_create_db_eviction_policy_type_RANDOM);\n\n    // create a lot of keys to fill the database\n    const auto KEY_COUNT = fill_database(crud_0, session_0, mock_node_0, CALLER_UUID, REQUEST_HASH, DB_UUID, VALUE_SIZE, MAX_SIZE);\n    ASSERT_EQ(KEY_COUNT, fill_database(crud_1, session_1, mock_node_1, CALLER_UUID, REQUEST_HASH, DB_UUID, VALUE_SIZE, MAX_SIZE));\n\n    const std::set<std::string> pre_eviction_keys_0{get_database_keys(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID)};\n    const std::set<std::string> pre_eviction_keys_1{get_database_keys(crud_1, session_1, mock_node_1, CALLER_UUID, DB_UUID)};\n\n    EXPECT_EQ(pre_eviction_keys_0,pre_eviction_keys_1);\n\n    // create a number of keys larger than the max size of the database\n    for(size_t index{KEY_COUNT}; index < KEY_COUNT + 100; ++index)\n    {\n        size_t db_size{0};\n        std::tie(std::ignore, db_size) = get_database_size(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID);\n        const auto KEY = make_key(index);\n        const auto INNER_REQUEST_HASH{generate_random_hash()};\n\n        create_key_value(crud_0, session_0, mock_node_0, CALLER_UUID, INNER_REQUEST_HASH, DB_UUID, KEY, make_value(MAX_SIZE - db_size));\n        create_key_value(crud_1, session_1, mock_node_1, CALLER_UUID, INNER_REQUEST_HASH, DB_UUID, KEY, make_value(MAX_SIZE - db_size));\n    }\n\n    const auto select_key_from_set = [](const auto& keys, uint64_t index)\n            {\n                std::set<std::string>::const_iterator c_it(keys.begin());\n                std::advance(c_it, index);\n                return *c_it;\n            };\n\n    // update a lot of keys with values that will exceed the database max storage\n    boost::random::mt19937 mt;\n\n    // valgrind suppression needs this as there's different behaviour every run...\n    mt.seed(123);\n\n    for(size_t i{0}; i < 20; ++i)\n    {\n        const std::set<std::string> active_keys{get_database_keys(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID)};\n        const boost::random::uniform_int_distribution<> dist(0, active_keys.size() - 1);\n        const bzn::key_t KEY{select_key_from_set(active_keys, dist(mt))};\n\n        size_t db_size{0};\n        std::tie(std::ignore, db_size) = get_database_size(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID);\n        const auto VALUE{do_quickread(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID, KEY)};\n        const auto NEW_VALUE_SIZE{MAX_SIZE - db_size + VALUE.length() + 1};\n\n        update_key_value(crud_0, session_0, mock_node_0, CALLER_UUID, REQUEST_HASH, DB_UUID, KEY, make_value(NEW_VALUE_SIZE));\n        update_key_value(crud_1, session_1, mock_node_1, CALLER_UUID, REQUEST_HASH, DB_UUID, KEY, make_value(NEW_VALUE_SIZE));\n    }\n\n    // update a key with a value larger than the value of MAX_SIZE\n    {\n        const std::set<std::string> active_keys{get_database_keys(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID)};\n        const boost::random::uniform_int_distribution<> dist(0, active_keys.size() - 1);\n        const bzn::key_t KEY{select_key_from_set(active_keys, dist(mt))};\n        update_key_value(crud_0, session_0, mock_node_0, CALLER_UUID, REQUEST_HASH, DB_UUID, KEY, make_value(MAX_SIZE));\n        update_key_value(crud_1, session_1, mock_node_1, CALLER_UUID, REQUEST_HASH, DB_UUID, KEY, make_value(MAX_SIZE));\n    }\n\n\n    // Are the databases in each crud the same?\n    const std::set<std::string> post_eviction_keys_0{get_database_keys(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID)};\n    const std::set<std::string> post_eviction_keys_1{get_database_keys(crud_1, session_1, mock_node_1, CALLER_UUID, DB_UUID)};\n\n    std::set<std::string> difference;\n    std::set_difference(pre_eviction_keys_0.begin(), pre_eviction_keys_0.end(), post_eviction_keys_0.begin(), post_eviction_keys_0.end(), std::inserter(difference, difference.begin()));\n    ASSERT_GT(difference.size(), size_t(0));\n\n    ASSERT_EQ(post_eviction_keys_0, post_eviction_keys_1);\n\n    remove_test_database(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID);\n    remove_test_database(crud_1, session_1, mock_node_1, CALLER_UUID, DB_UUID);\n}\n\n\nTEST(crud, test_that_two_cruds_evict_the_same_key_value_pairs_using_the_volatile_ttl_eviction_policy)\n{\n    const size_t MAX_SIZE{8096};\n    const bzn::uuid_t DB_UUID{\"sut_uuid\"};\n    const bzn::uuid_t CALLER_UUID{\"caller_id\"};\n    const size_t VALUE_SIZE{27};\n    const std::string REQUEST_HASH{generate_random_hash()};\n\n    std::shared_ptr<bzn::mock_session_base> session_0;\n    std::shared_ptr<bzn::mock_node_base> mock_node_0;\n    auto crud_0{initialize_crud(session_0, mock_node_0, CALLER_UUID)};\n\n    std::shared_ptr<bzn::mock_session_base> session_1;\n    std::shared_ptr<bzn::mock_node_base> mock_node_1;\n    auto crud_1{initialize_crud(session_1, mock_node_1, CALLER_UUID)};\n\n    remove_test_database(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID);\n    create_test_database(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID, MAX_SIZE, database_create_db_eviction_policy_type_VOLATILE_TTL);\n\n    remove_test_database(crud_1, session_1, mock_node_1, CALLER_UUID, DB_UUID);\n    create_test_database(crud_1, session_1, mock_node_1, CALLER_UUID, DB_UUID, MAX_SIZE, database_create_db_eviction_policy_type_VOLATILE_TTL);\n\n    // create a lot of keys to fill the database\n    const auto KEY_COUNT = fill_database(crud_0, session_0, mock_node_0, CALLER_UUID, REQUEST_HASH, DB_UUID, VALUE_SIZE, MAX_SIZE, true);\n    ASSERT_EQ(KEY_COUNT, fill_database(crud_1, session_1, mock_node_1, CALLER_UUID, REQUEST_HASH, DB_UUID, VALUE_SIZE, MAX_SIZE, true));\n\n    const std::set<std::string> pre_eviction_keys_0{get_database_keys(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID)};\n    const std::set<std::string> pre_eviction_keys_1{get_database_keys(crud_1, session_1, mock_node_1, CALLER_UUID, DB_UUID)};\n\n    EXPECT_EQ(pre_eviction_keys_0,pre_eviction_keys_1);\n\n    // create a number of keys larger than the max size of the database\n    for(size_t index{KEY_COUNT}; index < KEY_COUNT + 100; ++index)\n    {\n        size_t db_size{0};\n        std::tie(std::ignore, db_size) = get_database_size(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID);\n        const auto KEY = make_key(index);\n        const auto INNER_REQUEST_HASH{generate_random_hash()};\n\n        const auto expire = 8 + index + 128; // Provide some expire values that are sortable\n\n        const bzn::value_t VALUE{make_value(MAX_SIZE - db_size)};\n        create_key_value(crud_0, session_0, mock_node_0, CALLER_UUID, INNER_REQUEST_HASH, DB_UUID, KEY, VALUE, expire);\n        create_key_value(crud_1, session_1, mock_node_1, CALLER_UUID, INNER_REQUEST_HASH, DB_UUID, KEY, VALUE, expire);\n    }\n\n    const auto select_key_from_set = [](const auto& keys, uint64_t index)\n            {\n                std::set<std::string>::const_iterator c_it(keys.begin());\n                std::advance(c_it, index);\n                return *c_it;\n            };\n\n    // update a lot of keys with values that will exceed the database max storage\n    boost::random::mt19937 mt;\n\n    // valgrind suppression needs this as there's different behaviour every run...\n    mt.seed(123);\n\n    for(size_t i{0}; i < 20; ++i)\n    {\n        const std::set<std::string> active_keys{get_database_keys(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID)};\n        const boost::random::uniform_int_distribution<> dist(0, active_keys.size() - 1);\n        const bzn::key_t KEY{select_key_from_set(active_keys, dist(mt))};\n\n        size_t db_size{0};\n        std::tie(std::ignore, db_size) = get_database_size(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID);\n        const auto VALUE{do_quickread(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID, KEY)};\n        const auto NEW_VALUE_SIZE{MAX_SIZE - db_size + VALUE.length() + 1};\n\n        update_key_value(crud_0, session_0, mock_node_0, CALLER_UUID, REQUEST_HASH, DB_UUID, KEY, make_value(NEW_VALUE_SIZE));\n        update_key_value(crud_1, session_1, mock_node_1, CALLER_UUID, REQUEST_HASH, DB_UUID, KEY, make_value(NEW_VALUE_SIZE));\n    }\n\n    // update a key with a value larger than the value of MAX_SIZE\n    {\n        const std::set<std::string> active_keys{get_database_keys(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID)};\n        const boost::random::uniform_int_distribution<> dist(0, active_keys.size() - 1);\n        const bzn::key_t KEY{select_key_from_set(active_keys, dist(mt))};\n        update_key_value(crud_0, session_0, mock_node_0, CALLER_UUID, REQUEST_HASH, DB_UUID, KEY, make_value(MAX_SIZE));\n        update_key_value(crud_1, session_1, mock_node_1, CALLER_UUID, REQUEST_HASH, DB_UUID, KEY, make_value(MAX_SIZE));\n    }\n\n\n    // Are the databases in each crud the same?\n    const std::set<std::string> post_eviction_keys_0{get_database_keys(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID)};\n    const std::set<std::string> post_eviction_keys_1{get_database_keys(crud_1, session_1, mock_node_1, CALLER_UUID, DB_UUID)};\n\n    std::set<std::string> difference;\n    std::set_difference(pre_eviction_keys_0.begin(), pre_eviction_keys_0.end(), post_eviction_keys_0.begin(), post_eviction_keys_0.end(), std::inserter(difference, difference.begin()));\n    ASSERT_GT(difference.size(), size_t(0));\n\n    ASSERT_EQ(post_eviction_keys_0, post_eviction_keys_1);\n\n    remove_test_database(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID);\n    remove_test_database(crud_1, session_1, mock_node_1, CALLER_UUID, DB_UUID);\n}\n\n\nTEST(crud, test_that_expire_send_proper_response)\n{\n    auto mock_subscription_manager = std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>();\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        mock_subscription_manager, nullptr);\n\n    auto mock_pbft = std::make_shared<bzn::mock_pbft_base>();\n\n    EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon()));\n\n    crud->start(mock_pbft);\n\n    database_msg msg;\n\n    msg.mutable_header()->set_db_uuid(\"uuid\");\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create_db();\n\n    crud->handle_request(\"caller_id\", msg, nullptr);\n\n    msg.mutable_create()->set_key(\"key\");\n    msg.mutable_create()->set_value(\"value\");\n\n    // add key...\n    auto session = std::make_shared<bzn::mock_session_base>();\n\n    EXPECT_CALL(*mock_subscription_manager, inspect_commit(_));\n\n    expect_signed_response(session);\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // set expire on key not in db...\n    msg.mutable_expire()->set_key(\"key1\");\n    msg.mutable_expire()->set_expire(1);\n\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kError,\n        bzn::storage_result_msg.at(bzn::storage_result::not_found));\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // set expire...\n    msg.mutable_expire()->set_key(\"key\");\n    msg.mutable_expire()->set_expire(1);\n\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::RESPONSE_NOT_SET);\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // update key..\n    msg.mutable_expire()->set_expire(0);\n\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kError,\n        bzn::storage_result_msg.at(bzn::storage_result::invalid_argument));\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // update key..\n    msg.mutable_expire()->set_expire(2);\n\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::RESPONSE_NOT_SET);\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // get ttl..\n    msg.mutable_ttl()->set_key(\"key\");\n\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kTtl, std::nullopt,\n        [](const auto& resp)\n        {\n            EXPECT_EQ(resp.ttl().key(), \"key\");\n            EXPECT_GE(resp.ttl().ttl(), uint64_t(2));\n        });\n\n    crud->handle_request(\"caller_id\", msg, session);\n\n    // test for expired...\n    sleep(3);\n\n    // update key..\n    msg.mutable_expire()->set_key(\"key\");\n    msg.mutable_expire()->set_expire(2);\n\n    expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kError,\n        bzn::storage_result_msg.at(bzn::storage_result::delete_pending));\n\n    crud->handle_request(\"caller_id\", msg, session);\n}\n\n\nTEST(crud, test_that_create_exceeding_max_swarm_storage_sends_proper_response)\n{\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n    auto session = std::make_shared<bzn::mock_session_base>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), nullptr);\n\n    // start crud with a max swarm storage size of 2K...\n    crud->start(std::make_shared<NiceMock<bzn::mock_pbft_base>>(), 2048);\n\n    // create a valid sized db...\n    {\n        auto request = build_create_db_msg(\"caller_id\", \"uuid\", uint64_t(123), 2048, database_create_db::NONE);\n        expect_signed_response(session, \"uuid\", uint64_t(123), database_response::RESPONSE_NOT_SET);\n        crud->handle_request(\"caller_id\", request, session);\n    }\n\n    // try to create another but this time we will fail since the swarm is full...\n    {\n        auto request = build_create_db_msg(\"caller_id\", \"uuid2\", uint64_t(123), 1024, database_create_db::NONE);\n        expect_signed_response(session, \"uuid2\", uint64_t(123), database_response::kError,\n            bzn::storage_result_msg.at(bzn::storage_result::db_full));\n        crud->handle_request(\"caller_id\", request, session);\n    }\n\n    // delete a database to make room...\n    {\n        database_msg request;\n        request.mutable_header()->set_db_uuid(\"uuid\");\n        request.mutable_header()->set_nonce(uint64_t(123));\n        request.mutable_delete_db();\n\n        expect_signed_response(session, \"uuid\", uint64_t(123), database_response::RESPONSE_NOT_SET);\n\n        crud->handle_request(\"caller_id\", request, session);\n    }\n\n    // try to create again...\n    {\n        auto request = build_create_db_msg(\"caller_id\", \"uuid2\", uint64_t(123), 1024, database_create_db::NONE);\n        expect_signed_response(session, \"uuid2\", uint64_t(123), database_response::RESPONSE_NOT_SET);\n        crud->handle_request(\"caller_id\", request, session);\n    }\n\n    // test that update size to 2048 to fill swarm...\n    {\n        database_msg request;\n        request.mutable_header()->set_db_uuid(\"uuid2\");\n        request.mutable_header()->set_nonce(uint64_t(123));\n        request.mutable_update_db()->set_max_size(2048);\n        request.mutable_update_db()->set_eviction_policy(database_create_db::VOLATILE_TTL);\n\n        expect_signed_response(session, \"uuid2\", uint64_t(123), database_response::RESPONSE_NOT_SET);\n        crud->handle_request(\"caller_id\", request, session);\n    }\n\n    // try to create another and we fail because swarm is full...\n    {\n        auto request = build_create_db_msg(\"caller_id\", \"uuid\", uint64_t(123), 1024, database_create_db::NONE);\n        expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kError,\n            bzn::storage_result_msg.at(bzn::storage_result::db_full));\n        crud->handle_request(\"caller_id\", request, session);\n    }\n}\n\n\nTEST(crud, test_that_update_exceeding_max_swarm_stroage_sends_proper_resonse)\n{\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n    auto session = std::make_shared<bzn::mock_session_base>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), nullptr);\n\n    // start crud with a max swarm storage size of 2K...\n    crud->start(std::make_shared<NiceMock<bzn::mock_pbft_base>>(), 2048);\n\n    // create a valid sized db...\n    {\n        auto request = build_create_db_msg(\"caller_id\", \"uuid\", uint64_t(123), 1024, database_create_db::NONE);\n        expect_signed_response(session, \"uuid\", uint64_t(123), database_response::RESPONSE_NOT_SET);\n        crud->handle_request(\"caller_id\", request, session);\n    }\n\n    // another...\n    {\n        auto request = build_create_db_msg(\"caller_id\", \"uuid2\", uint64_t(123), 1024, database_create_db::NONE);\n        expect_signed_response(session, \"uuid2\", uint64_t(123), database_response::RESPONSE_NOT_SET);\n        crud->handle_request(\"caller_id\", request, session);\n    }\n\n    // update with a new size that exceeds swarm db limit...\n    {\n        auto request = build_update_db_msg(\"caller_id\", \"uuid\", uint64_t(123), 1025, database_create_db::NONE);\n        expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kError,\n            bzn::storage_result_msg.at(bzn::storage_result::db_full));\n        crud->handle_request(\"caller_id\", request, session);\n    }\n}\n\n\nTEST(crud, test_that_create_db_cannot_create_a_database_that_is_unlimited_when_max_swarm_storage_is_set)\n{\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n    auto session = std::make_shared<bzn::mock_session_base>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), nullptr);\n\n    // start crud with limited storage...\n    crud->start(std::make_shared<NiceMock<bzn::mock_pbft_base>>(), 1024);\n\n    // try to create an unlimited db...\n    {\n        auto request = build_create_db_msg(\"caller_id\", \"uuid\", uint64_t(123), 0, database_create_db::NONE);\n        expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kError,\n            bzn::storage_result_msg.at(bzn::storage_result::invalid_size));\n        crud->handle_request(\"caller_id\", request, session);\n    }\n}\n\n\nTEST(crud, test_that_update_db_cannot_convert_a_database_to_unlimited_when_max_swarm_storage_is_set)\n{\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n    auto session = std::make_shared<bzn::mock_session_base>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), nullptr);\n\n    // start crud with limited storage...\n    crud->start(std::make_shared<NiceMock<bzn::mock_pbft_base>>(), 1024);\n\n    // create a valid db with a limit...\n    {\n        auto request = build_create_db_msg(\"caller_id\", \"uuid\", uint64_t(123), 1024, database_create_db::NONE);\n        expect_signed_response(session, \"uuid\", uint64_t(123), database_response::RESPONSE_NOT_SET);\n        crud->handle_request(\"caller_id\", request, session);\n    }\n\n    // attempt to convert to an unlimited db...\n    {\n        auto request = build_update_db_msg(\"caller_id\", \"uuid\", uint64_t(123), 0, database_create_db::NONE);\n        expect_signed_response(session, \"uuid\", uint64_t(123), database_response::kError,\n            bzn::storage_result_msg.at(bzn::storage_result::invalid_size));\n        crud->handle_request(\"caller_id\", request, session);\n    }\n}\n\n\nTEST(crud, test_that_status_reports_current_usage)\n{\n    auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n    auto session = std::make_shared<bzn::mock_session_base>();\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base>>();\n        }));\n\n    auto crud = std::make_shared<bzn::crud>(mock_io_context, std::make_shared<bzn::mem_storage>(),\n        std::make_shared<NiceMock<bzn::mock_subscription_manager_base>>(), nullptr);\n\n    // start crud with limited storage...\n    crud->start(std::make_shared<NiceMock<bzn::mock_pbft_base>>(), 2048);\n\n    // create a valid db with a limit...\n    {\n        auto request = build_create_db_msg(\"caller_id\", \"uuid\", uint64_t(123), 1024, database_create_db::NONE);\n        expect_signed_response(session, \"uuid\", uint64_t(123), database_response::RESPONSE_NOT_SET);\n        crud->handle_request(\"caller_id\", request, session);\n    }\n\n    // and another...\n    {\n        auto request = build_create_db_msg(\"caller_id\", \"uuid2\", uint64_t(123), 512, database_create_db::NONE);\n        expect_signed_response(session, \"uuid2\", uint64_t(123), database_response::RESPONSE_NOT_SET);\n        crud->handle_request(\"caller_id\", request, session);\n    }\n\n    auto status = crud->get_status();\n\n    EXPECT_EQ(status[\"max_swarm_storage\"].asUInt64(), uint64_t(2048));\n    EXPECT_EQ(status[\"swarm_storage_usage\"].asUInt64(), uint64_t(1536));\n    EXPECT_EQ(crud->get_name(), \"crud\");\n}\n"
  },
  {
    "path": "crud/test/subscription_manager_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <mocks/mock_node_base.hpp>\n#include <mocks/mock_session_base.hpp>\n#include <mocks/mock_boost_asio_beast.hpp>\n#include <crud/subscription_manager.hpp>\n\nusing namespace ::testing;\n\nnamespace\n{\n    const bzn::key_t  TEST_KEY{\"key\"};\n    const bzn::key_t  TEST_UNKOWN_KEY{\"unknown\"};\n    const bzn::uuid_t TEST_UUID{\"uuid\"};\n    const bzn::uuid_t TEST_UNKOWN_UUID{\"67ee0ca8-bd79-4eef-88db-9343aaf6ca7e\"};\n}\n\n\nTEST(subscription_manager, test_that_session_can_subscribe_and_unsubscribe_for_updates)\n{\n    auto mock_session1 = std::make_shared<bzn::mock_session_base>();\n    auto mock_session2 = std::make_shared<bzn::mock_session_base>();\n    auto mock_session3 = std::make_shared<bzn::mock_session_base>();\n\n    EXPECT_CALL(*mock_session1, get_session_id()).WillRepeatedly(Return(bzn::session_id(1)));\n    EXPECT_CALL(*mock_session2, get_session_id()).WillRepeatedly(Return(bzn::session_id(2)));\n    EXPECT_CALL(*mock_session3, get_session_id()).WillRepeatedly(Return(bzn::session_id(3)));\n\n    bzn::subscription_manager sm(std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>());\n\n    // two subscribers...\n    {\n        database_response response;\n        sm.subscribe(TEST_UUID, TEST_KEY, 0, response, mock_session1);\n\n        ASSERT_EQ(response.response_case(), database_response::RESPONSE_NOT_SET);\n    }\n\n    {\n        database_response response;\n        sm.subscribe(TEST_UUID, TEST_KEY, 1, response, mock_session1);\n\n        ASSERT_EQ(response.response_case(), database_response::RESPONSE_NOT_SET);\n    }\n\n    // duplicate subscription request... (session 1)\n    {\n        database_response response;\n        sm.subscribe(TEST_UUID, TEST_KEY, 1, response, mock_session1);\n\n        ASSERT_EQ(response.response_case(), database_response::kError);\n        ASSERT_EQ(response.error().message(), bzn::MSG_DUPLICATE_SUB);\n    }\n\n    // new session should be able to register using same transaction id\n    {\n        database_response response;\n        sm.subscribe(TEST_UUID, TEST_KEY, 1, response, mock_session2);\n\n        ASSERT_EQ(response.response_case(), database_response::RESPONSE_NOT_SET);\n    }\n\n    // duplicate subscription request... (session 2)\n    {\n        database_response response;\n        sm.subscribe(TEST_UUID, TEST_KEY, 1, response, mock_session2);\n\n        ASSERT_EQ(response.response_case(), database_response::kError);\n        ASSERT_EQ(response.error().message(), bzn::MSG_DUPLICATE_SUB);\n    }\n\n    // invalid key\n    {\n        database_response response;\n        sm.unsubscribe(TEST_UUID, TEST_UNKOWN_KEY, 0, response, mock_session1);\n\n        ASSERT_EQ(response.response_case(), database_response::kError);\n        ASSERT_EQ(response.error().message(), bzn::MSG_INVALID_KEY);\n    }\n\n    // invalid session\n    {\n        database_response response;\n        sm.unsubscribe(TEST_UUID, TEST_KEY, 0, response, mock_session3);\n\n        ASSERT_EQ(response.response_case(), database_response::kError);\n        ASSERT_EQ(response.error().message(), bzn::MSG_INVALID_SUB);\n    }\n\n    // succeed and we should be return a success response...\n    {\n        database_response response;\n        sm.unsubscribe(TEST_UUID, TEST_KEY, 0, response, mock_session1);\n\n        ASSERT_EQ(response.response_case(), database_response::RESPONSE_NOT_SET);\n    }\n\n    // invalid transaction_id\n    {\n        database_response response;\n        sm.unsubscribe(TEST_UUID, TEST_KEY, 0, response, mock_session1);\n\n        ASSERT_EQ(response.response_case(), database_response::kError);\n        ASSERT_EQ(response.error().message(), bzn::MSG_INVALID_SUB);\n    }\n\n    // should get an unknown subscription error..\n    {\n        database_response response;\n        sm.unsubscribe(TEST_UUID, TEST_KEY, 4, response, mock_session2);\n\n        ASSERT_EQ(response.response_case(), database_response::kError);\n        ASSERT_EQ(response.error().message(), bzn::MSG_INVALID_SUB);\n    }\n\n    // test for invalid uuid...\n    {\n        database_response response;\n        sm.unsubscribe(TEST_UNKOWN_UUID, TEST_KEY, 5, response, mock_session2);\n\n        ASSERT_EQ(response.response_case(), database_response::kError);\n        ASSERT_EQ(response.error().message(), bzn::MSG_INVALID_UUID);\n    }\n}\n\n\nTEST(subscription_manager, test_that_session_cannot_unsubscribe_other_sessions)\n{\n    auto mock_session1 = std::make_shared<bzn::mock_session_base>();\n    auto mock_session2 = std::make_shared<bzn::mock_session_base>();\n\n    EXPECT_CALL(*mock_session1, get_session_id()).WillRepeatedly(Return(bzn::session_id(1)));\n    EXPECT_CALL(*mock_session2, get_session_id()).WillRepeatedly(Return(bzn::session_id(2)));\n\n    bzn::subscription_manager sm(std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>());\n\n    // two subscribers...\n    {\n        database_response response;\n        sm.subscribe(TEST_UUID, \"1\", 0, response, mock_session1);\n        sm.subscribe(TEST_UUID, \"2\", 1, response, mock_session2);\n    }\n\n    // test for invalid uuid...\n    database_response response;\n\n    // session two will try to unsub session 1...\n    sm.unsubscribe(TEST_UUID, \"1\", 0, response, mock_session2);\n\n    ASSERT_EQ(response.error().message(), bzn::MSG_INVALID_SUB);\n}\n\n\nTEST(subscription_manager, test_that_subscriber_is_notified_for_create_and_updates)\n{\n    auto mock_session1 = std::make_shared<bzn::mock_session_base>();\n    auto mock_session2 = std::make_shared<bzn::mock_session_base>();\n\n    EXPECT_CALL(*mock_session1, get_session_id()).WillRepeatedly(Return(bzn::session_id(1)));\n    EXPECT_CALL(*mock_session2, get_session_id()).WillRepeatedly(Return(bzn::session_id(2)));\n\n    bzn::subscription_manager sm(std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>());\n\n    database_response response;\n    sm.subscribe(TEST_UUID, \"0\", 0,    response, mock_session1);\n    sm.subscribe(TEST_UUID, \"0\", 1234, response, mock_session2);\n\n    sm.subscribe(TEST_UUID, \"1\", 4321, response, mock_session1);\n    sm.subscribe(TEST_UUID, \"1\", 0,    response, mock_session2);\n\n    // send through a 'create' message...\n    {\n        database_msg msg;\n\n        msg.mutable_header()->set_db_uuid(TEST_UUID);\n        msg.mutable_header()->set_nonce(123);\n        msg.mutable_create()->set_key(\"0\");\n        msg.mutable_create()->set_value(\"0\");\n\n        EXPECT_CALL(*mock_session1, send_message(An<std::shared_ptr<std::string>>())).WillOnce(Invoke(\n            [](std::shared_ptr<std::string> msg)\n            {\n                database_response resp;\n                resp.ParseFromString(*msg);\n                ASSERT_EQ(resp.header().db_uuid(), TEST_UUID);\n                ASSERT_EQ(resp.header().nonce(), uint64_t(0));\n                ASSERT_EQ(resp.response_case(), database_response::kSubscriptionUpdate);\n                ASSERT_EQ(resp.subscription_update().key(), \"0\");\n                ASSERT_EQ(resp.subscription_update().value(), \"0\");\n                ASSERT_EQ(resp.subscription_update().seq(), uint64_t(1));\n                ASSERT_EQ(resp.subscription_update().operation(), database_subscription_update::UPDATE);\n            }));\n\n        EXPECT_CALL(*mock_session2, send_message(An<std::shared_ptr<std::string>>())).WillOnce(Invoke(\n            [](std::shared_ptr<std::string> msg)\n            {\n                database_response resp;\n                resp.ParseFromString(*msg);\n                ASSERT_EQ(resp.header().db_uuid(), TEST_UUID);\n                ASSERT_EQ(resp.header().nonce(), uint64_t(1234));\n                ASSERT_EQ(resp.response_case(), database_response::kSubscriptionUpdate);\n                ASSERT_EQ(resp.subscription_update().key(), \"0\");\n                ASSERT_EQ(resp.subscription_update().value(), \"0\");\n                ASSERT_EQ(resp.subscription_update().seq(), uint64_t(1));\n                ASSERT_EQ(resp.subscription_update().operation(), database_subscription_update::UPDATE);\n            }));\n\n        sm.inspect_commit(msg);\n    }\n\n    // send through an 'update' message...\n    {\n        database_msg msg;\n\n        msg.mutable_header()->set_db_uuid(TEST_UUID);\n        msg.mutable_header()->set_nonce(123);\n        msg.mutable_update()->set_key(\"1\");\n        msg.mutable_update()->set_value(\"1\");\n\n        EXPECT_CALL(*mock_session1, send_message(An<std::shared_ptr<std::string>>())).WillOnce(Invoke(\n            [](std::shared_ptr<std::string> msg)\n            {\n                database_response resp;\n                resp.ParseFromString(*msg);\n                ASSERT_EQ(resp.header().db_uuid(), TEST_UUID);\n                ASSERT_EQ(resp.header().nonce(), uint64_t(4321));\n                ASSERT_EQ(resp.response_case(), database_response::kSubscriptionUpdate);\n                ASSERT_EQ(resp.subscription_update().key(), \"1\");\n                ASSERT_EQ(resp.subscription_update().value(), \"1\");\n                ASSERT_EQ(resp.subscription_update().seq(), uint64_t(1));\n                ASSERT_EQ(resp.subscription_update().operation(), database_subscription_update::UPDATE);\n            }));\n\n        EXPECT_CALL(*mock_session2, send_message(An<std::shared_ptr<std::string>>())).WillOnce(Invoke(\n            [](std::shared_ptr<std::string> msg)\n            {\n                database_response resp;\n                resp.ParseFromString(*msg);\n                ASSERT_EQ(resp.header().db_uuid(), TEST_UUID);\n                ASSERT_EQ(resp.header().nonce(), uint64_t(0));\n                ASSERT_EQ(resp.response_case(), database_response::kSubscriptionUpdate);\n                ASSERT_EQ(resp.subscription_update().key(), \"1\");\n                ASSERT_EQ(resp.subscription_update().value(), \"1\");\n                ASSERT_EQ(resp.subscription_update().seq(), uint64_t(1));\n                ASSERT_EQ(resp.subscription_update().operation(), database_subscription_update::UPDATE);\n            }));\n\n        sm.inspect_commit(msg);\n    }\n\n    // send a delete... nothing should happen...\n    {\n        database_msg msg;\n\n        msg.mutable_header()->set_db_uuid(TEST_UUID);\n        msg.mutable_header()->set_nonce(123);\n        msg.mutable_delete_()->set_key(\"1\");\n\n        EXPECT_CALL(*mock_session1, send_message(An<std::shared_ptr<std::string>>())).WillOnce(Invoke(\n            [](std::shared_ptr<std::string> msg)\n            {\n                database_response resp;\n                resp.ParseFromString(*msg);\n                ASSERT_EQ(resp.header().db_uuid(), TEST_UUID);\n                ASSERT_EQ(resp.header().nonce(), uint64_t(4321));\n                ASSERT_EQ(resp.response_case(), database_response::kSubscriptionUpdate);\n                ASSERT_EQ(resp.subscription_update().key(), \"1\");\n                ASSERT_EQ(resp.subscription_update().value(), \"\");\n                ASSERT_EQ(resp.subscription_update().seq(), uint64_t(2));\n                ASSERT_EQ(resp.subscription_update().operation(), database_subscription_update::DELETE);\n            }));\n\n        EXPECT_CALL(*mock_session2, send_message(An<std::shared_ptr<std::string>>())).WillOnce(Invoke(\n            [](std::shared_ptr<std::string> msg)\n            {\n                database_response resp;\n                resp.ParseFromString(*msg);\n                ASSERT_EQ(resp.header().db_uuid(), TEST_UUID);\n                ASSERT_EQ(resp.header().nonce(), uint64_t(0));\n                ASSERT_EQ(resp.response_case(), database_response::kSubscriptionUpdate);\n                ASSERT_EQ(resp.subscription_update().key(), \"1\");\n                ASSERT_EQ(resp.subscription_update().value(), \"\");\n                ASSERT_EQ(resp.subscription_update().seq(), uint64_t(2));\n                ASSERT_EQ(resp.subscription_update().operation(), database_subscription_update::DELETE);\n            }));\n\n        sm.inspect_commit(msg);\n    }\n}\n\n\nTEST(subscription_manager, test_that_dead_session_is_removed_from_subscriber_list)\n{\n    auto mock_io_context = std::make_shared<bzn::asio::mock_io_context_base>();\n    auto mock_steady_timer = std::make_unique<bzn::asio::mock_steady_timer_base>();\n\n    EXPECT_CALL(*mock_steady_timer, expires_from_now(_)).Times(2);\n\n    bzn::asio::wait_handler wh;\n    EXPECT_CALL(*mock_steady_timer, async_wait(_)).WillRepeatedly(Invoke(\n        [&](auto handler)\n        {\n            wh = handler;\n        }));\n\n    EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke(\n        [&]()\n        {\n            return std::move(mock_steady_timer);\n        }));\n\n    auto sm = std::make_shared<bzn::subscription_manager>(mock_io_context);\n\n    sm->start();\n\n    auto mock_session1 = std::make_shared<bzn::mock_session_base>();\n    auto mock_session2 = std::make_shared<bzn::mock_session_base>();\n\n    EXPECT_CALL(*mock_session1, get_session_id()).WillRepeatedly(Return(bzn::session_id(1)));\n    EXPECT_CALL(*mock_session2, get_session_id()).WillRepeatedly(Return(bzn::session_id(2)));\n\n    // update message...\n    database_msg msg;\n\n    msg.mutable_header()->set_db_uuid(TEST_UUID);\n    msg.mutable_header()->set_nonce(0);\n    msg.mutable_update()->set_key(\"0\");\n    msg.mutable_update()->set_value(\"0\");\n\n    // two subs for the same key...\n    database_response response;\n    sm->subscribe(TEST_UUID, \"0\", 0, response, mock_session1);\n    sm->subscribe(TEST_UUID, \"0\", 1, response, mock_session2);\n\n    EXPECT_CALL(*mock_session1, send_message(An<std::shared_ptr<std::string>>())).WillOnce(Invoke(\n        [](std::shared_ptr<std::string> msg)\n        {\n            database_response resp;\n            resp.ParseFromString(*msg);\n            ASSERT_EQ(resp.header().db_uuid(), TEST_UUID);\n            ASSERT_EQ(resp.header().nonce(), uint64_t(0));\n            ASSERT_EQ(resp.response_case(), database_response::kSubscriptionUpdate);\n            ASSERT_EQ(resp.subscription_update().key(), \"0\");\n            ASSERT_EQ(resp.subscription_update().value(), \"0\");\n            ASSERT_EQ(resp.subscription_update().seq(), uint64_t(1));\n            ASSERT_EQ(resp.subscription_update().operation(), database_subscription_update::UPDATE);\n        }));\n\n    EXPECT_CALL(*mock_session2, send_message(An<std::shared_ptr<std::string>>())).WillOnce(Invoke(\n        [](std::shared_ptr<std::string> msg)\n        {\n            database_response resp;\n            resp.ParseFromString(*msg);\n            ASSERT_EQ(resp.header().db_uuid(), TEST_UUID);\n            ASSERT_EQ(resp.header().nonce(), uint64_t(1));\n            ASSERT_EQ(resp.response_case(), database_response::kSubscriptionUpdate);\n            ASSERT_EQ(resp.subscription_update().key(), \"0\");\n            ASSERT_EQ(resp.subscription_update().value(), \"0\");\n            ASSERT_EQ(resp.subscription_update().seq(), uint64_t(1));\n            ASSERT_EQ(resp.subscription_update().operation(), database_subscription_update::UPDATE);\n        }));\n\n    sm->inspect_commit(msg);\n\n    // kill session...\n    mock_session2.reset();\n\n    // exceute purge...\n    wh(boost::system::error_code());\n\n    // there should only be one...\n    EXPECT_CALL(*mock_session1, send_message(An<std::shared_ptr<std::string>>())).WillOnce(Invoke(\n        [](std::shared_ptr<std::string> msg)\n        {\n            database_response resp;\n            resp.ParseFromString(*msg);\n            ASSERT_EQ(resp.header().db_uuid(), TEST_UUID);\n            ASSERT_EQ(resp.header().nonce(), uint64_t(0));\n            ASSERT_EQ(resp.response_case(), database_response::kSubscriptionUpdate);\n            ASSERT_EQ(resp.subscription_update().key(), \"0\");\n            ASSERT_EQ(resp.subscription_update().value(), \"0\");\n            ASSERT_EQ(resp.subscription_update().seq(), uint64_t(2));\n            ASSERT_EQ(resp.subscription_update().operation(), database_subscription_update::UPDATE);\n        }));\n\n    sm->inspect_commit(msg);\n}\n"
  },
  {
    "path": "crypto/CMakeLists.txt",
    "content": "add_library(crypto\n        crypto_base.hpp\n        crypto.hpp\n        crypto.cpp\n        )\n\ntarget_link_libraries(crypto proto utils)\nadd_dependencies(crypto boost openssl)\ntarget_include_directories(crypto PRIVATE ${BLUZELLE_STD_INCLUDES})\nadd_subdirectory(test)\n"
  },
  {
    "path": "crypto/crypto.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <crypto/crypto.hpp>\n#include <openssl/pem.h>\n#include <openssl/err.h>\n#include <openssl/crypto.h>\n#include <utils/bytes_to_debug_string.hpp>\n\nusing namespace bzn;\n\nnamespace\n{\n    const std::string PEM_PREFIX = \"-----BEGIN PUBLIC KEY-----\\n\";\n    const std::string PEM_SUFFIX = \"\\n-----END PUBLIC KEY-----\\n\";\n}\n\ncrypto::crypto(std::shared_ptr<bzn::options_base> options, std::shared_ptr<bzn::monitor_base> monitor)\n        : options(std::move(options))\n        , monitor(std::move(monitor))\n{\n    LOG(info) << \"Using \" << SSLeay_version(SSLEAY_VERSION);\n    if (this->options->get_simple_options().get<bool>(bzn::option_names::CRYPTO_ENABLED_OUTGOING))\n    {\n        this->load_private_key();\n    }\n}\n\nconst std::string&\ncrypto::extract_payload(const bzn_envelope& msg)\n{\n    switch (msg.payload_case())\n    {\n        case bzn_envelope::kDatabaseMsg :\n        {\n            return msg.database_msg();\n        }\n        case bzn_envelope::kPbftInternalRequest :\n        {\n            return msg.pbft_internal_request();\n        }\n        case bzn_envelope::kDatabaseResponse :\n        {\n            return msg.database_response();\n        }\n        case bzn_envelope::kJson :\n        {\n            return msg.json();\n        }\n        case bzn_envelope::kAudit :\n        {\n            return msg.audit();\n        }\n        case bzn_envelope::kPbft :\n        {\n            return msg.pbft();\n        }\n        case bzn_envelope::kPbftMembership :\n        {\n            return msg.pbft_membership();\n        }\n        case bzn_envelope::kStatusRequest:\n        {\n            return msg.status_request();\n        }\n        case bzn_envelope::kStatusResponse:\n        {\n            return msg.status_response();\n        }\n        case bzn_envelope::kCheckpointMsg:\n        {\n            return msg.checkpoint_msg();\n        }\n        case bzn_envelope::kSwarmError:\n        {\n            return msg.swarm_error();\n        }\n        default :\n        {\n            throw std::runtime_error(\n                    \"Crypto does not know how to handle a message with type \" + std::to_string(msg.payload_case()));\n        }\n    }\n}\n\nconst std::string\ncrypto::deterministic_serialize(const bzn_envelope& msg)\n{\n    // I don't like hand-rolling this, but doing it here lets us do it in one place, while avoiding implementing\n    // it for every message type\n\n    std::vector<std::string> tokens = {msg.sender(), std::to_string(msg.payload_case()), this->extract_payload(msg), std::to_string(msg.timestamp())};\n\n    // this construction defeats an attack where the adversary blurs the lines between the fields. if we simply\n    // concatenate the fields, then consider the two messages\n    //     {sender: \"foo\", payload: \"bar\"}\n    //     {sender: \"foobar\", payload: \"\"}\n    // they may have the same serialization - and therefore the same signature.\n    std::string result = \"\";\n    for (const auto& token : tokens)\n    {\n        result += (std::to_string(token.length()) + \"|\" + token);\n    }\n\n    return result;\n}\n\nbool\ncrypto::verify(const bzn_envelope& msg)\n{\n    if (!this->options->get_simple_options().get<bool>(bzn::option_names::CRYPTO_ENABLED_INCOMING))\n    {\n        return true;\n    }\n\n    BIO_ptr_t bio(BIO_new(BIO_s_mem()), &BIO_free);\n    EC_KEY_ptr_t pubkey(nullptr, &EC_KEY_free);\n    EVP_PKEY_ptr_t key(EVP_PKEY_new(), &EVP_PKEY_free);\n    EVP_MD_CTX_ptr_t context(EVP_MD_CTX_create(), &EVP_MD_CTX_free);\n\n    if (!bio || !key || !context)\n    {\n        LOG(error) << \"failed to allocate memory for signature verification\";\n        return false;\n    }\n\n    const auto msg_text = this->deterministic_serialize(msg);\n\n    // In openssl 1.0.1 (but not newer versions), EVP_DigestVerifyFinal strangely expects the signature as\n    // a non-const pointer.\n    std::string signature = msg.signature();\n    char* sig_ptr = signature.data();\n\n    bool result =\n            // Reconstruct the PEM file in memory (this is awkward, but it avoids dealing with EC specifics)\n            (0 < BIO_write(bio.get(), PEM_PREFIX.c_str(), PEM_PREFIX.length()))\n            && (0 < BIO_write(bio.get(), msg.sender().c_str(), msg.sender().length()))\n            && (0 < BIO_write(bio.get(), PEM_SUFFIX.c_str(), PEM_SUFFIX.length()))\n\n            // Parse the PEM string to get the public key the message is allegedly from\n            && (pubkey = EC_KEY_ptr_t(PEM_read_bio_EC_PUBKEY(bio.get(), NULL, NULL, NULL), &EC_KEY_free))\n            && (1 == EC_KEY_check_key(pubkey.get()))\n            && (1 == EVP_PKEY_set1_EC_KEY(key.get(), pubkey.get()))\n\n            // Perform the signature validation\n            && (1 == EVP_DigestVerifyInit(context.get(), NULL, EVP_sha256(), NULL, key.get()))\n            && (1 == EVP_DigestVerifyUpdate(context.get(), msg_text.c_str(), msg_text.length()))\n            && (1 == EVP_DigestVerifyFinal(context.get(), reinterpret_cast<unsigned char*>(sig_ptr), msg.signature().length()));\n\n    /* Any errors here can be attributed to a bad (potentially malicious) incoming message, and we we should not\n     * pollute our own logs with them (but we still have to clear the error state)\n     */\n    ERR_clear_error();\n\n    this->monitor->send_counter(bzn::statistic::signature_verified);\n    this->monitor->send_counter(bzn::statistic::signature_verified_bytes, msg_text.length());\n    if (!result)\n    {\n        this->monitor->send_counter(bzn::statistic::signature_rejected);\n    }\n\n    return result;\n}\n\nbool\ncrypto::sign(bzn_envelope& msg)\n{\n    if (msg.sender().empty())\n    {\n        msg.set_sender(this->options->get_uuid());\n    }\n\n    if (msg.sender() != options->get_uuid())\n    {\n        LOG(error) << \"Cannot sign message purportedly sent by \" << msg.sender();\n        return false;\n    }\n\n    if (!this->options->get_simple_options().get<bool>(bzn::option_names::CRYPTO_ENABLED_OUTGOING))\n    {\n        return true;\n    }\n\n    const auto msg_text = this->deterministic_serialize(msg);\n\n    EVP_MD_CTX_ptr_t context(EVP_MD_CTX_create(), &EVP_MD_CTX_free);\n    size_t signature_length = 0;\n\n    bool result =\n            (bool) (context)\n            && (1 == EVP_DigestSignInit(context.get(), NULL, EVP_sha256(), NULL, this->private_key_EVP.get()))\n            && (1 == EVP_DigestSignUpdate(context.get(), msg_text.c_str(), msg_text.length()))\n            && (1 == EVP_DigestSignFinal(context.get(), NULL, &signature_length));\n\n    auto deleter = [](unsigned char* ptr){OPENSSL_free(ptr);};\n    std::unique_ptr<unsigned char, decltype(deleter)> signature((unsigned char*) OPENSSL_malloc(sizeof(unsigned char) * signature_length), deleter);\n\n    result &=\n            (bool) (signature)\n            && (1 == EVP_DigestSignFinal(context.get(), signature.get(), &signature_length));\n\n    if (result)\n    {\n        msg.set_signature(signature.get(), signature_length);\n    }\n    else\n    {\n        LOG(error) << \"Failed to sign message with openssl error (do we have a valid private key?)\";\n        // Message will be sent without signature; depending on settings they may still accept it\n    }\n\n    this->log_openssl_errors();\n\n    if (result && this->options->get_simple_options().get<bool>(bzn::option_names::CRYPTO_SELF_VERIFY))\n    {\n        if (!this->verify(msg))\n        {\n            LOG(error) << \"Failed to verify own signature?\";\n            // These messages could be awkwardly long, but it is a severe bug if they are ever printed\n            // and their full contents are useful for debugging\n            LOG(error) << \"offending message (deterministic_serialized, hex encoded): \" << bzn::bytes_to_debug_string(msg_text, true);\n            LOG(error) << \"our bad signature (hex encoded): \" << bzn::bytes_to_debug_string(msg.signature(), true);\n        }\n\n    }\n\n    this->monitor->send_counter(bzn::statistic::signature_computed);\n    this->monitor->send_counter(bzn::statistic::signature_computed_bytes, msg_text.length());\n\n    return result;\n}\n\nbool\ncrypto::load_private_key()\n{\n    auto filename = this->options->get_simple_options().get<std::string>(bzn::option_names::NODE_PRIVATEKEY_FILE);\n    std::unique_ptr<FILE, decltype(&fclose)> fp(fopen(filename.c_str(), \"r\"), &fclose);\n\n    bool result =\n            (bool) (fp)\n            && (this->private_key_EC = EC_KEY_ptr_t(PEM_read_ECPrivateKey(fp.get(), NULL, NULL, NULL), &EC_KEY_free))\n            && (1 == EC_KEY_check_key(this->private_key_EC.get()))\n            && (this->private_key_EVP = EVP_PKEY_ptr_t(EVP_PKEY_new(), &EVP_PKEY_free))\n            && (1 == EVP_PKEY_set1_EC_KEY(this->private_key_EVP.get(), this->private_key_EC.get()));\n\n    if (!result)\n    {\n        LOG(error) << \"Crypto failed to load private key; will not be able to sign messages\";\n    }\n\n    this->log_openssl_errors();\n\n    return result;\n}\n\nstd::string\ncrypto::hash(const std::string& msg)\n{\n    EVP_MD_CTX_ptr_t context(EVP_MD_CTX_create(), &EVP_MD_CTX_free);\n    size_t md_size = EVP_MD_size(EVP_sha256());\n\n    auto deleter = [](unsigned char* ptr){OPENSSL_free(ptr);};\n    std::unique_ptr<unsigned char, decltype(deleter)> hash_buffer((unsigned char*) OPENSSL_malloc(sizeof(unsigned char) * md_size), deleter);\n\n    bool success =\n            (bool) (context)\n            && (1 == EVP_DigestInit_ex(context.get(), EVP_sha256(), NULL))\n            && (1 == EVP_DigestUpdate(context.get(), msg.c_str(), msg.size()))\n            && (1 == EVP_DigestFinal_ex(context.get(), hash_buffer.get(), NULL));\n\n    if (!success)\n    {\n        this->log_openssl_errors();\n        throw std::runtime_error(std::string(\"\\nfailed to compute message hash \") + msg);\n    }\n\n    this->monitor->send_counter(bzn::statistic::hash_computed);\n    this->monitor->send_counter(bzn::statistic::hash_computed_bytes, msg.length());\n\n    return std::string(reinterpret_cast<char*>(hash_buffer.get()), md_size);\n}\n\nstd::string\ncrypto::hash(const bzn_envelope& msg)\n{\n    return this->hash(this->deterministic_serialize(msg));\n}\n\nvoid\ncrypto::log_openssl_errors()\n{\n    unsigned long last_error;\n    char buffer[120]; //openssl says this is the appropriate length\n\n    while((last_error = ERR_get_error()))\n    {\n        ERR_error_string(last_error, buffer);\n        LOG(error) << buffer;\n    }\n}\n"
  },
  {
    "path": "crypto/crypto.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#pragma once\n\n#include <crypto/crypto_base.hpp>\n#include <options/options_base.hpp>\n#include <proto/bluzelle.pb.h>\n#include <openssl/evp.h>\n#include <openssl/ec.h>\n#include <monitor/monitor_base.hpp>\n\nnamespace bzn\n{\n    class crypto : public bzn::crypto_base\n    {\n    public:\n\n        crypto(std::shared_ptr<bzn::options_base> options, std::shared_ptr<bzn::monitor_base> monitor);\n\n        bool sign(bzn_envelope& msg) override;\n\n        bool verify(const bzn_envelope& msg) override;\n\n        std::string hash(const std::string& msg) override;\n\n        std::string hash(const bzn_envelope& msg) override;\n\n    private:\n\n        using EC_KEY_ptr_t = std::unique_ptr<EC_KEY, decltype(&::EC_KEY_free)>;\n        using EVP_PKEY_ptr_t = std::unique_ptr<EVP_PKEY, decltype(&::EVP_PKEY_free)>;\n        using BIO_ptr_t = std::unique_ptr<BIO, decltype(&::BIO_free)>;\n        using EVP_MD_CTX_ptr_t = std::unique_ptr<EVP_MD_CTX, decltype(&::EVP_MD_CTX_free)>;\n\n        bool load_private_key();\n\n        void log_openssl_errors();\n\n        const std::string& extract_payload(const bzn_envelope& msg);\n\n        const std::string deterministic_serialize(const bzn_envelope& msg);\n\n        std::shared_ptr<bzn::options_base> options;\n        std::shared_ptr<bzn::monitor_base> monitor;\n\n        EVP_PKEY_ptr_t private_key_EVP = EVP_PKEY_ptr_t(nullptr, &EVP_PKEY_free);\n        EC_KEY_ptr_t private_key_EC = EC_KEY_ptr_t(nullptr, &EC_KEY_free);\n\n    };\n}\n\n"
  },
  {
    "path": "crypto/crypto_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <proto/bluzelle.pb.h>\n\nnamespace bzn\n{\n    class crypto_base\n    {\n    public:\n        /*\n         * sign a message using our key\n         * @msg message to sign\n         * @return if signature was successful\n         */\n        virtual bool sign(bzn_envelope& msg) = 0;\n\n        /*\n         * verify that the signature on a message is correct and matches its sender\n         * @msg message to verify\n         * @return signature is present, valid and matches sender\n         */\n        virtual bool verify(const bzn_envelope& msg) = 0;\n\n        /*\n         * Compute the hash of some string\n         * @msg data\n         * @return hash value\n         */\n        virtual std::string hash(const std::string& msg) = 0;\n\n        /*\n         * @msg data\n         * @return hash value\n         */\n        virtual std::string hash(const bzn_envelope& msg) = 0;\n\n        virtual ~crypto_base() = default;\n    };\n}\n\n\n"
  },
  {
    "path": "crypto/test/CMakeLists.txt",
    "content": "set(test_srcs crypto_test.cpp)\nset(test_libs crypto proto options ${Protobuf_LIBRARIES})\n\nadd_gmock_test(crypto)\n"
  },
  {
    "path": "crypto/test/crypto_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <crypto/crypto.hpp>\n#include <mocks/mock_options_base.hpp>\n#include <mocks/mock_monitor.hpp>\n#include <options/options.hpp>\n#include <gtest/gtest.h>\n#include <proto/bluzelle.pb.h>\n#include <fstream>\n#include <boost/range/irange.hpp>\n\nusing namespace ::testing;\n\nclass crypto_test : public Test\n{\npublic:\n    std::shared_ptr<bzn::options_base> options = std::make_shared<bzn::options>();\n    std::shared_ptr<bzn::mock_monitor> monitor = std::make_shared<NiceMock<bzn::mock_monitor>>();\n    std::shared_ptr<bzn::crypto> crypto;\n\n    const std::string private_key_file = \"test_private_key.pem\";\n    const std::string public_key_file = \"test_public_key.pem\";\n\n    const std::string test_private_key_pem =\n            \"-----BEGIN EC PRIVATE KEY-----\\n\"\n            \"MHQCAQEEIFskFIUF/rSbcA62nW+a90ptWSaMnwlpNa6w5ab2BjT3oAcGBSuBBAAK\\n\"\n            \"oUQDQgAEIUn235kRQyjEwZiexq7tOSu/9QiabDqg8Mcwr7lq+Hi7/xx7A37wZBHV\\n\"\n            \"tCRpaXbJNqRhIErf6FnOZI3m71sQoA==\\n\"\n            \"-----END EC PRIVATE KEY-----\\n\";\n\n    const std::string test_public_key_pem =\n            \"-----BEGIN PUBLIC KEY-----\\n\"\n            \"MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEIUn235kRQyjEwZiexq7tOSu/9QiabDqg\\n\"\n            \"8Mcwr7lq+Hi7/xx7A37wZBHVtCRpaXbJNqRhIErf6FnOZI3m71sQoA==\\n\"\n            \"-----END PUBLIC KEY-----\\n\";\n\n    bzn_envelope msg;\n\n    crypto_test()\n    {\n        this->msg.set_pbft(\"pretend this is a serialized protobuf message\");\n\n        std::ofstream ofile(private_key_file.c_str());\n        ofile << test_private_key_pem;\n        ofile.close();\n\n        std::ofstream ofile2(public_key_file.c_str());\n        ofile2 << test_public_key_pem;\n        ofile2.close();\n\n        this->options->get_mutable_simple_options().set(bzn::option_names::NODE_PRIVATEKEY_FILE, private_key_file);\n        this->options->get_mutable_simple_options().set(bzn::option_names::NODE_PUBKEY_FILE, public_key_file);\n        this->options->get_mutable_simple_options().set(bzn::option_names::CRYPTO_ENABLED_INCOMING, std::to_string(true));\n        this->options->get_mutable_simple_options().set(bzn::option_names::CRYPTO_ENABLED_OUTGOING, std::to_string(true));\n\n        this->crypto = std::make_shared<bzn::crypto>(this->options, this->monitor);\n\n    }\n\n    ~crypto_test()\n    {\n        ::unlink(private_key_file.c_str());\n        ::unlink(public_key_file.c_str());\n    }\n\n};\n\nTEST_F(crypto_test, messages_use_my_public_key)\n{\n    // bzn::kPbft\n    EXPECT_TRUE(crypto->sign(msg));\n    EXPECT_EQ(msg.sender(), this->options->get_uuid());\n\n    // bzn_envelope::kDatabaseMsg\n    this->msg.set_database_msg(\"pretend this is a serialized protobuf message\");\n    EXPECT_TRUE(crypto->sign(msg));\n    EXPECT_EQ(msg.sender(), this->options->get_uuid());\n\n    // bzn_envelope::kPbftInternalRequest;\n    this->msg.set_pbft_internal_request(\"pretend this is a serialized protobuf message\");\n    EXPECT_TRUE(crypto->sign(msg));\n    EXPECT_EQ(msg.sender(), this->options->get_uuid());\n\n    // bzn_envelope::kDatabaseResponse\n    this->msg.set_database_response(\"pretend this is a serialized protobuf message\");\n    EXPECT_TRUE(crypto->sign(msg));\n    EXPECT_EQ(msg.sender(), this->options->get_uuid());\n\n    // bzn_envelope::kJson\n    this->msg.set_json(\"pretend this is a serialized protobuf message\");\n    EXPECT_TRUE(crypto->sign(msg));\n    EXPECT_EQ(msg.sender(), this->options->get_uuid());\n\n    // bzn_envelope::kAudit\n    this->msg.set_audit(\"pretend this is a serialized protobuf message\");\n    EXPECT_TRUE(crypto->sign(msg));\n    EXPECT_EQ(msg.sender(), this->options->get_uuid());\n\n    // bzn_envelope::kPbftMembership\n    this->msg.set_pbft_membership(\"pretend this is a serialized protobuf message\");\n    EXPECT_TRUE(crypto->sign(msg));\n    EXPECT_EQ(msg.sender(), this->options->get_uuid());\n\n    // bzn_envelope::kStatusRequest\n    this->msg.set_status_request(\"pretend this is a serialized protobuf message\");\n    EXPECT_TRUE(crypto->sign(msg));\n    EXPECT_EQ(msg.sender(), this->options->get_uuid());\n\n    // bzn_envelope::kStatusResponse\n    this->msg.set_status_response(\"pretend this is a serialized protobuf message\");\n    EXPECT_TRUE(crypto->sign(msg));\n    EXPECT_EQ(msg.sender(), this->options->get_uuid());\n\n    // bzn_envelope::kCheckpointMsg\n    this->msg.set_checkpoint_msg(\"pretend this is a serialized protobuf message\");\n    EXPECT_TRUE(crypto->sign(msg));\n    EXPECT_EQ(msg.sender(), this->options->get_uuid());\n\n    // bzn_envelope::kSwarmError\n    this->msg.set_swarm_error(\"pretend this is a serialized protobuf message\");\n    EXPECT_TRUE(crypto->sign(msg));\n    EXPECT_EQ(msg.sender(), this->options->get_uuid());\n\n    // invalid type throws\n    this->msg.clear_swarm_error();\n    EXPECT_THROW(crypto->sign(msg), std::exception);\n    EXPECT_EQ(msg.sender(), this->options->get_uuid());\n}\n\nTEST_F(crypto_test, messages_signed_and_verified)\n{\n    bzn_envelope msg2 = msg;\n    bzn_envelope msg3 = msg;\n\n    EXPECT_TRUE(crypto->sign(msg));\n    EXPECT_TRUE(crypto->verify(msg));\n}\n\nTEST_F(crypto_test, bad_signature_caught)\n{\n    bzn_envelope msg2 = msg;\n\n    EXPECT_TRUE(crypto->sign(msg));\n\n    msg2.set_signature(\"a\" + msg.signature());\n    EXPECT_FALSE(crypto->verify(msg2));\n}\n\nTEST_F(crypto_test, bad_sender_caught)\n{\n    bzn_envelope msg3 = msg;\n\n    EXPECT_TRUE(crypto->sign(msg));\n\n    msg3.set_sender('a' + msg.sender());\n    msg3.set_signature(msg.signature());\n    EXPECT_FALSE(crypto->verify(msg3));\n}\n\nTEST_F(crypto_test, hash_no_collision)\n{\n    /*\n     * It's well outside our scope to test that the hash actually has cryptographically secure hash properties,\n     * so we'll just test that it \"looks like\" a hash function\n     */\n\n    std::set<std::string> hash_values;\n    std::string hash_data = \"\";\n\n    for(int i=0; i<10000; i++)\n    {\n        hash_data.push_back('A');\n    }\n\n    for(int i=0; i<1000; i++)\n    {\n        hash_data[i] = 'a' + (i%31);\n        hash_values.insert(this->crypto->hash(hash_data));\n    }\n\n    EXPECT_EQ(hash_values.size(), 1000u);\n}\n\nTEST_F(crypto_test, hash_deterministic_but_not_identity)\n{\n    for(int i=0; i<1000; i++)\n    {\n        std::string str = std::to_string(i);\n        EXPECT_EQ(this->crypto->hash(str), this->crypto->hash(str));\n        EXPECT_NE(str, this->crypto->hash(str));\n    }\n}\n"
  },
  {
    "path": "depend/CMakeLists.txt",
    "content": "# Copyright (C) 2019 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\ncmake_minimum_required(VERSION 3.10)\n\ninclude(ExternalProject)\n\nmacro(add_external_project NAME VERSION)\n    message(STATUS \"${NAME} -- ${CMAKE_SYSTEM_NAME} ${CMAKE_BUILD_TYPE} ${VERSION}\")\n\n    add_subdirectory(${NAME})\n\n    string(TOLOWER ${CMAKE_SYSTEM_NAME} PKG_SYSTEM_NAME)\n\n    if(\"${CMAKE_BUILD_TYPE}\" STREQUAL \"RelWithDebInfo\")\n        set(PKG_BUILD_TYPE \"release\")\n    else()\n        string(TOLOWER ${CMAKE_BUILD_TYPE} PKG_BUILD_TYPE)\n    endif()\n\n    ExternalProject_Add(${NAME}\n        URL file://${CMAKE_SOURCE_DIR}/depend/${NAME}/package/${NAME}-${PKG_BUILD_TYPE}-${VERSION}-${PKG_SYSTEM_NAME}.tar.gz\n        CONFIGURE_COMMAND \"\"\n        BUILD_COMMAND \"\"\n        PREFIX ${CMAKE_BINARY_DIR}/${NAME}\n        INSTALL_COMMAND \"\"\n        )\nendmacro()\n\nadd_external_project(boost 1.70.0)\nadd_external_project(googletest 1.8.0)\nadd_external_project(jsoncpp 1.8.4)\nadd_external_project(openssl 1.1.1)\nadd_external_project(rocksdb 5.14.3)\n"
  },
  {
    "path": "depend/README.md",
    "content": "swarmDB uses several precompiled libraries for faster CI builds.\n\n##### Set the required library build number in depend/CMakelists:\n```text  \n    ...\n    \n    add_external_project(boost 1.70.0)\n    add_external_project(googletest 1.8.0)\n    add_external_project(jsoncpp 1.8.4)\n    add_external_project(openssl 1.1.1)\n    add_external_project(rocksdb 5.14.3)\n```    \n##### To add the debug version of Boost 1.70.0 using git LFS:\n###### For release use: -DCMAKE_BUILD_TYPE=Release\n```text\n$ cd depend/boost/package\n$ mkdir build-debug && cd build-debug\n$ cmake .. -DCMAKE_BUILD_TYPE=Debug -DPKG_VER=1.70.0 [-DPKG_HASH=<sha256>]\n ```\n\n ###### PKG_HASH is optional and if given will be used to validate the downloaded source code archive.   \n ```text\n-- The CXX compiler identification is GNU 8.3.0\n-- Check for working CXX compiler: /usr/bin/c++\n-- Check for working CXX compiler: /usr/bin/c++ -- works\n-- Detecting CXX compiler ABI info\n-- Detecting CXX compiler ABI info - done\n-- Detecting CXX compile features\n-- Detecting CXX compile features - done\n-- boost -- debug 1.70.0 (chrono,program_options,random,regex,system,thread,log,serialization)\n-- boost -- URL: https://dl.bintray.com/boostorg/release/1.70.0/source/boost_1_70_0.tar.gz\n-- boost -- URL_HASH: 882b48708d211a5f48e60b0124cf5863c1534cd544ecd0664bb534a4b5d506e9\n-- Configuring done\n-- Generating done\n-- Build files have been written to: /home/username/bluzelle/swarmdb/depend/boost/package/build-debug\n\n$ make\nScanning dependencies of target boost\n[ 12%] Creating directories for 'boost'\n[ 25%] Performing download step (download, verify and extract) for 'boost'\n-- Downloading...\n   dst='/home/username/bluzelle/swarmdb/depend/boost/package/build-debug/boost/src/boost_1_70_0.tar.gz'\n   timeout='120 seconds'\n-- Using src='https://dl.bintray.com/boostorg/release/1.70.0/source/boost_1_70_0.tar.gz'\n-- verifying file...\n       file='/home/username/bluzelle/swarmdb/depend/boost/package/build-debug/boost/src/boost_1_70_0.tar.gz'\n-- Downloading... done\n-- extracting...\n     src='/home/username/bluzelle/swarmdb/depend/boost/package/build-debug/boost/src/boost_1_70_0.tar.gz'\n     dst='/home/username/bluzelle/swarmdb/depend/boost/package/build-debug/boost/src/boost'\n-- extracting... [tar xfz]\n-- extracting... [analysis]\n-- extracting... [rename]\n-- extracting... [clean up]\n-- extracting... done\n    ...   \n[ 87%] No install step for 'boost'\n[100%] Completed 'boost'\n[100%] Built target boost\n$\n```\n\n##### Create a package to be added to the repo\n```text\n$ make package\n[100%] Built target boost\nRun CPack packaging tool...\nCPack: Create package using TGZ\nCPack: Install projects\nCPack: - Run preinstall target for: boost\nCPack: - Install project: boost\nCPack: Create package\nCPack: - package: /home/username/bluzelle/swarmdb/depend/boost/package/build-debug/boost-debug-1.70.0-linux.tar.gz generated.\n$ mv boost-debug-1.70.0-linux.tar.gz ..\n$ cd ..\n$ git lfs track boost-debug-1.70.0-linux.tar.gz\n$ git add .gitattributes boost-debug-1.70.0-linux.tar.gz\n$ git commit -m \"added debug Boost 1.70.0 for Linux\"\n```\n"
  },
  {
    "path": "depend/boost/CMakeLists.txt",
    "content": "# Copyright (C) 2019 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\nset(SOURCE_DIR ${CMAKE_BINARY_DIR}/boost/src/boost)\n\nset(Boost_INCLUDE_DIRS ${SOURCE_DIR}/include CACHE INTERNAL \"\")\n\nset(Boost_LIBRARIES\n    ${SOURCE_DIR}/lib/libboost_log.a\n    ${SOURCE_DIR}/lib/libboost_program_options.a\n    ${SOURCE_DIR}/lib/libboost_system.a\n    ${SOURCE_DIR}/lib/libboost_thread.a\n    pthread\n    ${SOURCE_DIR}/lib/libboost_serialization.a\n    ${SOURCE_DIR}/lib/libboost_date_time.a\n    ${SOURCE_DIR}/lib/libboost_log_setup.a\n    ${SOURCE_DIR}/lib/libboost_filesystem.a\n    ${SOURCE_DIR}/lib/libboost_regex.a\n    ${SOURCE_DIR}/lib/libboost_chrono.a\n    ${SOURCE_DIR}/lib/libboost_atomic.a\n    CACHE INTERNAL \"\")\n"
  },
  {
    "path": "depend/boost/package/.gitattributes",
    "content": "boost-debug-1.68.0-linux.tar.gz filter=lfs diff=lfs merge=lfs -text\nboost-release-1.68.0-linux.tar.gz filter=lfs diff=lfs merge=lfs -text\nboost-release-1.68.0-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text\nboost-debug-1.68.0-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text\nboost-debug-1.70.0-linux.tar.gz filter=lfs diff=lfs merge=lfs -text\nboost-release-1.70.0-linux.tar.gz filter=lfs diff=lfs merge=lfs -text\nboost-debug-1.70.0-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text\nboost-release-1.70.0-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text\n"
  },
  {
    "path": "depend/boost/package/CMakeLists.txt",
    "content": "# Copyright (C) 2019 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\ncmake_minimum_required(VERSION 3.10)\n\nproject(boost CXX)\n\ninclude(ExternalProject)\ninclude(ProcessorCount)\n\nif (NOT DEFINED PKG_VER)\n  message(FATAL_ERROR \"usage: -DPKG_VER=x.y.z [-DPKG_HASH=<sha256>]\")\nendif()\n\nif(PKG_HASH)\n  set(URL_HASH_OPTION SHA256=${PKG_HASH})\nelse()\n  message(WARNING \"PKG_HASH not specified! Downloaded package will not be validated.\")\nendif()\n\n# default to debug builds\nif(\"${CMAKE_BUILD_TYPE}\" STREQUAL \"\")\n  set(CMAKE_BUILD_TYPE Debug)\nendif()\n\nstring(TOLOWER ${CMAKE_BUILD_TYPE} PKG_BUILD_TYPE)\nset(PREFIX ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_${PKG_BUILD_TYPE})\n\nset(BOOST_TARBALL \"boost_${PKG_VER}\")\nstring(REPLACE \".\" \"_\" BOOST_TARBALL ${BOOST_TARBALL})\nstring(APPEND BOOST_TARBALL \".tar.gz\")\nset(BOOST_LIBS \"chrono,program_options,random,regex,system,thread,log,serialization\")\nset(URL https://dl.bintray.com/boostorg/release/${PKG_VER}/source/${BOOST_TARBALL})\n\nProcessorCount(NPROC)\n\nmessage(STATUS \"${PROJECT_NAME} -- ${PKG_BUILD_TYPE} ${PKG_VER} (${BOOST_LIBS})\")\nmessage(STATUS \"${PROJECT_NAME} -- URL: ${URL}\")\nmessage(STATUS \"${PROJECT_NAME} -- URL_HASH: ${PKG_HASH}\")\n\nExternalProject_Add(boost\n    PREFIX ${CMAKE_CURRENT_BINARY_DIR}/boost\n    URL ${URL}\n    URL_HASH ${URL_HASH_OPTION}\n    TIMEOUT 120\n    CONFIGURE_COMMAND ${CMAKE_CURRENT_BINARY_DIR}/boost/src/boost/bootstrap.sh --prefix=${PREFIX} --with-libraries=${BOOST_LIBS}\n    BUILD_COMMAND ${CMAKE_CURRENT_BINARY_DIR}/boost/src/boost/b2 variant=${PKG_BUILD_TYPE} link=static visibility=global -j${NPROC} install\n    INSTALL_COMMAND \"\"\n    BUILD_IN_SOURCE true\n    DOWNLOAD_NO_PROGRESS true\n    )\n\nset(CPACK_GENERATOR TGZ)\nstring(REPLACE \".\" \";\" VERSION_LIST ${PKG_VER})\nlist(GET VERSION_LIST 0 CPACK_PACKAGE_VERSION_MAJOR)\nlist(GET VERSION_LIST 1 CPACK_PACKAGE_VERSION_MINOR)\nlist(GET VERSION_LIST 2 CPACK_PACKAGE_VERSION_PATCH)\nset(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0)\nset(CPACK_PACKAGE_NAME ${PROJECT_NAME}-${PKG_BUILD_TYPE})\nstring(TOLOWER ${CMAKE_SYSTEM_NAME} CPACK_SYSTEM_NAME)\n\ninstall(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_${PKG_BUILD_TYPE}/ DESTINATION ${PKG_BUILD_TYPE}/)\n\ninclude(CPack)\n"
  },
  {
    "path": "depend/googletest/CMakeLists.txt",
    "content": "# Copyright (C) 2019 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\nset(SOURCE_DIR ${CMAKE_BINARY_DIR}/googletest/src/googletest)\n\nset(GTEST_INCLUDE_DIR ${SOURCE_DIR}/include CACHE INTERNAL \"\")\nset(GMOCK_INCLUDE_DIR ${SOURCE_DIR}/include CACHE INTERNAL \"\")\n\nset(GMOCK_BOTH_LIBRARIES\n    ${SOURCE_DIR}/lib/libgmock_main.a\n    ${SOURCE_DIR}/lib/libgmock.a\n    CACHE INTERNAL \"\")\n\nset(GTEST_BOTH_LIBRARIES\n    ${SOURCE_DIR}/lib/libgtest_main.a\n    ${SOURCE_DIR}/lib/libgtest.a\n    CACHE INTERNAL \"\")\n"
  },
  {
    "path": "depend/googletest/package/.gitattributes",
    "content": "googletest-debug-1.8.0-linux.tar.gz filter=lfs diff=lfs merge=lfs -text\ngoogletest-release-1.8.0-linux.tar.gz filter=lfs diff=lfs merge=lfs -text\ngoogletest-debug-1.8.0-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text\ngoogletest-release-1.8.0-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text\n"
  },
  {
    "path": "depend/googletest/package/CMakeLists.txt",
    "content": "# Copyright (C) 2019 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\ncmake_minimum_required(VERSION 3.10)\n\nproject(googletest CXX)\n\ninclude(ExternalProject)\n\nif (NOT DEFINED PKG_VER)\n\tmessage(FATAL_ERROR \"usage: -DPKG_VER=x.y.z [-DPKG_HASH=<sha256>]\")\nendif()\n\nif(PKG_HASH)\n\tset(URL_HASH_OPTION SHA256=${PKG_HASH})\nelse()\n\tmessage(WARNING \"PKG_HASH not specified! Downloaded package will not be validated.\")\nendif()\n\n# default to debug builds\nif(\"${CMAKE_BUILD_TYPE}\" STREQUAL \"\")\n  set(CMAKE_BUILD_TYPE Debug)\nendif()\n\nstring(TOLOWER ${CMAKE_BUILD_TYPE} PKG_BUILD_TYPE)\nset(URL https://github.com/google/googletest/archive/release-${PKG_VER}.tar.gz)\nset(PREFIX ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_${PKG_BUILD_TYPE})\n\nmessage(STATUS \"${PROJECT_NAME} -- ${PKG_BUILD_TYPE} ${PKG_VER}\")\nmessage(STATUS \"${PROJECT_NAME} -- URL: ${URL}\")\nmessage(STATUS \"${PROJECT_NAME} -- URL_HASH: ${PKG_HASH}\")\n\nExternalProject_Add(googletest\n    PREFIX \"${CMAKE_CURRENT_BINARY_DIR}/googletest\"\n    URL ${URL}\n    URL_HASH ${URL_HASH_OPTION}\n    TIMEOUT 30\n\tCMAKE_ARGS\n\t-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}\n \t-DCMAKE_INSTALL_PREFIX=${PREFIX}\n    DOWNLOAD_NO_PROGRESS true\n    )\n\nset(CPACK_GENERATOR TGZ)\nstring(REPLACE \".\" \";\" VERSION_LIST ${PKG_VER})\nlist(GET VERSION_LIST 0 CPACK_PACKAGE_VERSION_MAJOR)\nlist(GET VERSION_LIST 1 CPACK_PACKAGE_VERSION_MINOR)\nlist(GET VERSION_LIST 2 CPACK_PACKAGE_VERSION_PATCH)\nset(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0)\nset(CPACK_PACKAGE_NAME ${PROJECT_NAME}-${PKG_BUILD_TYPE})\nstring(TOLOWER ${CMAKE_SYSTEM_NAME} CPACK_SYSTEM_NAME)\n\ninstall(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_${PKG_BUILD_TYPE}/ DESTINATION ${PKG_BUILD_TYPE}/)\n\ninclude(CPack)\n"
  },
  {
    "path": "depend/jsoncpp/CMakeLists.txt",
    "content": "# Copyright (C) 2019 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\nset(SOURCE_DIR ${CMAKE_BINARY_DIR}/jsoncpp/src/jsoncpp)\n\nset(JSONCPP_INCLUDE_DIRS ${SOURCE_DIR}/include CACHE INTERNAL \"\")\nset(JSONCPP_LIBRARIES ${SOURCE_DIR}/lib/libjsoncpp.a CACHE INTERNAL \"\")\n"
  },
  {
    "path": "depend/jsoncpp/package/.gitattributes",
    "content": "jsoncpp-debug-1.8.4-linux.tar.gz filter=lfs diff=lfs merge=lfs -text\njsoncpp-release-1.8.4-linux.tar.gz filter=lfs diff=lfs merge=lfs -text\njsoncpp-debug-1.8.4-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text\njsoncpp-release-1.8.4-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text\n"
  },
  {
    "path": "depend/jsoncpp/package/CMakeLists.txt",
    "content": "# Copyright (C) 2019 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\ncmake_minimum_required(VERSION 3.10)\n\nproject(jsoncpp CXX)\n\ninclude(ExternalProject)\n\nif (NOT DEFINED PKG_VER)\n\tmessage(FATAL_ERROR \"usage: -DPKG_VER=x.y.z [-DPKG_HASH=<sha256>]\")\nendif()\n\nif(PKG_HASH)\n\tset(URL_HASH_OPTION SHA256=${PKG_HASH})\nelse()\n\tmessage(WARNING \"PKG_HASH not specified! Downloaded package will not be validated.\")\nendif()\n\n# default to debug builds\nif(\"${CMAKE_BUILD_TYPE}\" STREQUAL \"\")\n  set(CMAKE_BUILD_TYPE Debug)\nendif()\n\nstring(TOLOWER ${CMAKE_BUILD_TYPE} PKG_BUILD_TYPE)\nset(PREFIX ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_${PKG_BUILD_TYPE})\nset(URL https://github.com/open-source-parsers/jsoncpp/archive/${PKG_VER}.tar.gz)\n\nmessage(STATUS \"${PROJECT_NAME} -- ${PKG_BUILD_TYPE} ${PKG_VER}\")\nmessage(STATUS \"${PROJECT_NAME} -- URL: ${URL}\")\nmessage(STATUS \"${PROJECT_NAME} -- URL_HASH: ${PKG_HASH}\")\n\nExternalProject_Add(jsoncpp\n    PREFIX \"${CMAKE_CURRENT_BINARY_DIR}/jsoncpp\"\n    URL ${URL}\n\tURL_HASH ${URL_HASH_OPTION}\n    TIMEOUT 30\n    CMAKE_ARGS\n\t-DJSONCPP_WITH_PKGCONFIG_SUPPORT=OFF\n\t-DJSONCPP_WITH_POST_BUILD_UNITTEST=OFF\n\t-DJSONCPP_WITH_TESTS=OFF\n\t-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}\n\t-DCMAKE_INSTALL_PREFIX=${PREFIX}\n    DOWNLOAD_NO_PROGRESS true\n    )\n\nset(CPACK_GENERATOR TGZ)\nstring(REPLACE \".\" \";\" VERSION_LIST ${PKG_VER})\nlist(GET VERSION_LIST 0 CPACK_PACKAGE_VERSION_MAJOR)\nlist(GET VERSION_LIST 1 CPACK_PACKAGE_VERSION_MINOR)\nlist(GET VERSION_LIST 2 CPACK_PACKAGE_VERSION_PATCH)\nset(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0)\nset(CPACK_PACKAGE_NAME ${PROJECT_NAME}-${PKG_BUILD_TYPE})\nstring(TOLOWER ${CMAKE_SYSTEM_NAME} CPACK_SYSTEM_NAME)\n\ninstall(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_${PKG_BUILD_TYPE}/ DESTINATION ${PKG_BUILD_TYPE}/)\n\ninclude(CPack)\n"
  },
  {
    "path": "depend/openssl/CMakeLists.txt",
    "content": "# Copyright (C) 2019 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\nset(SOURCE_DIR ${CMAKE_BINARY_DIR}/openssl/src/openssl)\n\nset(OPENSSL_INCLUDE_DIR ${SOURCE_DIR}/include CACHE INTERNAL \"\")\n\nset(OPENSSL_LIBRARIES\n    ${SOURCE_DIR}/lib/libssl.a\n    ${SOURCE_DIR}/lib/libcrypto.a\n    dl\n    pthread\n    CACHE INTERNAL \"\")\n"
  },
  {
    "path": "depend/openssl/package/.gitattributes",
    "content": "openssl-debug-1.1.1-linux.tar.gz filter=lfs diff=lfs merge=lfs -text\nopenssl-release-1.1.1-linux.tar.gz filter=lfs diff=lfs merge=lfs -text\nopenssl-debug-1.1.1-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text\nopenssl-release-1.1.1-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text\n"
  },
  {
    "path": "depend/openssl/package/CMakeLists.txt",
    "content": "# Copyright (C) 2019 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\ncmake_minimum_required(VERSION 3.10)\n\nproject(openssl CXX)\n\ninclude(ExternalProject)\ninclude(ProcessorCount)\n\nif(PKG_HASH)\n    set(URL_HASH_OPTION SHA256=${PKG_HASH})\nelse()\n    message(WARNING \"PKG_HASH not specified! Downloaded package will not be validated.\")\nendif()\n\n# default to debug builds\nif(\"${CMAKE_BUILD_TYPE}\" STREQUAL \"\")\n  set(CMAKE_BUILD_TYPE Debug)\nendif()\n\nstring(TOLOWER ${CMAKE_BUILD_TYPE} PKG_BUILD_TYPE)\nset(PREFIX ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_${PKG_BUILD_TYPE})\nset(URL https://www.openssl.org/source/openssl-${PKG_VER}.tar.gz)\n\nmessage(STATUS \"${PROJECT_NAME} -- ${PKG_BUILD_TYPE} ${PKG_VER}\")\nmessage(STATUS \"${PROJECT_NAME} -- URL: ${URL}\")\nmessage(STATUS \"${PROJECT_NAME} -- URL_HASH: ${PKG_HASH}\")\n\n# platform detection\nif (APPLE)\n    set(OPENSSL_BUILD_PLATFORM darwin64-x86_64-cc)\n    set(OPENSSLDIR /usr/local/etc/openssl)\nelse()\n    set(OPENSSL_BUILD_PLATFORM linux-x86_64)\n    set(OPENSSLDIR /etc/ssl)\nendif()\n\nProcessorCount(NPROC)\n\nExternalProject_Add(openssl\n    PREFIX \"${CMAKE_CURRENT_BINARY_DIR}/openssl\"\n    URL ${URL}\n    URL_HASH ${URL_HASH_OPTION}\n    TIMEOUT 30\n    DOWNLOAD_NO_PROGRESS true\n\tCONFIGURE_COMMAND ${CMAKE_CURRENT_BINARY_DIR}/openssl/src/openssl/Configure ${OPENSSL_BUILD_PLATFORM} --prefix=${PREFIX} --${PKG_BUILD_TYPE} --openssldir=${OPENSSLDIR}\n\tINSTALL_COMMAND make install_sw\n    BUILD_COMMAND make -j${NPROC}\n    )\n\nset(CPACK_GENERATOR TGZ)\nstring(REPLACE \".\" \";\" VERSION_LIST ${PKG_VER})\nlist(GET VERSION_LIST 0 CPACK_PACKAGE_VERSION_MAJOR)\nlist(GET VERSION_LIST 1 CPACK_PACKAGE_VERSION_MINOR)\nlist(GET VERSION_LIST 2 CPACK_PACKAGE_VERSION_PATCH)\nset(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0)\nset(CPACK_PACKAGE_NAME ${PROJECT_NAME}-${PKG_BUILD_TYPE})\nstring(TOLOWER ${CMAKE_SYSTEM_NAME} CPACK_SYSTEM_NAME)\n\ninstall(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_${PKG_BUILD_TYPE}/ DESTINATION ${PKG_BUILD_TYPE}/)\n\ninclude(CPack)\n"
  },
  {
    "path": "depend/rocksdb/CMakeLists.txt",
    "content": "# Copyright (C) 2019 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\ninclude(FindZLIB)\ninclude(FindPackageHandleStandardArgs)\n\n# find snappy...\nfind_path(SNAPPY_INCLUDE_DIR\n    NAMES snappy.h\n    HINTS ${SNAPPY_ROOT_DIR}/include)\n\nfind_library(SNAPPY_LIBRARIES\n    NAMES snappy\n    HINTS ${SNAPPY_ROOT_DIR}/lib)\n\nfind_package_handle_standard_args(Snappy DEFAULT_MSG\n    SNAPPY_LIBRARIES\n    SNAPPY_INCLUDE_DIR)\n\nmark_as_advanced(\n    SNAPPY_ROOT_DIR\n    SNAPPY_LIBRARIES\n    SNAPPY_INCLUDE_DIR)\n\n# find bzip2...\nfind_path(BZIP2_INCLUDE_DIR\n    NAMES bzlib.h\n    HINTS ${BZIP2_ROOT_DIR}/include)\n\nfind_library(BZIP2_LIBRARIES\n    NAMES bz2\n    HINTS ${BZIP2_ROOT_DIR}/lib)\n\nfind_package_handle_standard_args(Bzip2 DEFAULT_MSG\n    BZIP2_LIBRARIES\n    BZIP2_INCLUDE_DIR)\n\nmark_as_advanced(\n    BZIP2_ROOT_DIR\n    BZIP2_LIBRARIES\n    BZIP2_INCLUDE_DIR)\n\nset(SOURCE_DIR ${CMAKE_BINARY_DIR}/rocksdb/src/rocksdb)\n\nset(ROCKSDB_INCLUDE_DIRS ${SOURCE_DIR}/include CACHE INTERNAL \"\")\nset(ROCKSDB_LIBRARIES ${SOURCE_DIR}/lib/librocksdb.a ${SNAPPY_LIBRARIES} ${ZLIB_LIBRARIES} ${BZIP2_LIBRARIES} CACHE INTERNAL \"\")\n\nif (\"${CMAKE_SYSTEM_NAME}\" STREQUAL \"Darwin\")\n    find_library(LZ4_LIBRARY NAMES liblz4.a)\n    message(STATUS ${LZ4_LIBRARY})\n    list(APPEND ROCKSDB_LIBRARIES ${LZ4_LIBRARY})\n\n    # rocksdb may of found these libraries...\n    find_library(ZSTD_LIBRARY NAMES libzstd.a)\n    if (ZSTD_LIBRARY)\n        message(STATUS ${ZSTD_LIBRARY})\n        list(APPEND ROCKSDB_LIBRARIES ${ZSTD_LIBRARY})\n    endif()\n\n    find_library(TBB_LIBRARY NAMES libtbb.a)\n    if (TBB_LIBRARY)\n        message(STATUS ${TBB_LIBRARY})\n        list(APPEND ROCKSDB_LIBRARIES ${TBB_LIBRARY})\n    endif()\n\n    set(ROCKSDB_LIBRARIES ${ROCKSDB_LIBRARIES} CACHE INTERNAL \"\")\nendif()\n"
  },
  {
    "path": "depend/rocksdb/package/.gitattributes",
    "content": "rocksdb-debug-5.14.3-linux.tar.gz filter=lfs diff=lfs merge=lfs -text\nrocksdb-release-5.14.3-linux.tar.gz filter=lfs diff=lfs merge=lfs -text\nrocksdb-debug-5.14.3-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text\nrocksdb-release-5.14.3-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text\n"
  },
  {
    "path": "depend/rocksdb/package/CMakeLists.txt",
    "content": "# Copyright (C) 2019 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\ncmake_minimum_required(VERSION 3.10)\n\nproject(rocksdb CXX)\n\ninclude(ExternalProject)\ninclude(ProcessorCount)\n\nif (NOT DEFINED PKG_VER)\n  message(FATAL_ERROR \"usage: -DPKG_VER=x.y.z [-DPKG_HASH=<sha256>]\")\nendif()\n\nif(PKG_HASH)\n  set(URL_HASH_OPTION SHA256=${PKG_HASH})\nelse()\n  message(WARNING \"PKG_HASH not specified! Downloaded package will not be validated.\")\nendif()\n\n# default to debug builds\nif(\"${CMAKE_BUILD_TYPE}\" STREQUAL \"\")\n  set(CMAKE_BUILD_TYPE Debug)\nendif()\n\n# rocksdb uses \"levels\"\nif (${CMAKE_BUILD_TYPE} STREQUAL \"Debug\")\n  set(DEBUG_LEVEL \"2\")\nelse()\n  set(DEBUG_LEVEL \"0\")\nendif()\n\nstring(TOLOWER ${CMAKE_BUILD_TYPE} PKG_BUILD_TYPE)\nset(PREFIX ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_${PKG_BUILD_TYPE})\nset(URL https://github.com/facebook/rocksdb/archive/v${PKG_VER}.tar.gz)\n\nProcessorCount(NPROC)\n\nmessage(STATUS \"${PROJECT_NAME} -- ${PKG_BUILD_TYPE} ${PKG_VER}\")\nmessage(STATUS \"${PROJECT_NAME} -- URL: ${URL}\")\nmessage(STATUS \"${PROJECT_NAME} -- URL_HASH: ${PKG_HASH}\")\n\nExternalProject_Add(rocksdb\n    PREFIX \"${CMAKE_CURRENT_BINARY_DIR}/rocksdb\"\n    URL ${URL}\n    URL_HASH ${URL_HASH_OPTION}\n    TIMEOUT 30\n    CONFIGURE_COMMAND \"\"\n    BUILD_COMMAND PORTABLE=1 make -e DISABLE_JEMALLOC=1 DEBUG_LEVEL=${DEBUG_LEVEL} static_lib -j${NPROC}\n    INSTALL_COMMAND make INSTALL_PATH=${PREFIX} install\n    BUILD_IN_SOURCE true\n    DOWNLOAD_NO_PROGRESS true\n    )\n\nset(CPACK_GENERATOR TGZ)\nstring(REPLACE \".\" \";\" VERSION_LIST ${PKG_VER})\nlist(GET VERSION_LIST 0 CPACK_PACKAGE_VERSION_MAJOR)\nlist(GET VERSION_LIST 1 CPACK_PACKAGE_VERSION_MINOR)\nlist(GET VERSION_LIST 2 CPACK_PACKAGE_VERSION_PATCH)\nset(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0)\nset(CPACK_PACKAGE_NAME ${PROJECT_NAME}-${PKG_BUILD_TYPE})\nstring(TOLOWER ${CMAKE_SYSTEM_NAME} CPACK_SYSTEM_NAME)\n\ninstall(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_${PKG_BUILD_TYPE}/ DESTINATION ${PKG_BUILD_TYPE}/)\n\ninclude(CPack)\n"
  },
  {
    "path": "include/bluzelle.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <boost/log/trivial.hpp>\n#include <string_view>\n#include <json/json.h>\n#include <swarm_version.hpp>\n\n\nnamespace bzn\n{\n    using caller_id_t = std::string;\n\n    using encoded_message = std::string;\n\n    using hash_t = std::string;\n\n    using json_message = Json::Value;\n\n    using key_t = std::string;\n\n    using service_state_t = std::string;\n\n    using session_id = uint64_t;\n\n    using uuid_t = std::string;\n\n    using value_t = std::string;\n\n    using swarm_id_t = std::string;\n\n} // bzn\n\n\nnamespace bzn::utils\n{\n    constexpr\n    std::string_view basename(const std::string_view& path)\n    {\n        return path.substr(path.rfind('/') + 1);\n    }\n\n    const std::string ROPSTEN_URL{\"https://ropsten.infura.io\"};\n\n    const std::string DEFAULT_SWARM_INFO_ESR_ADDRESS{\"D5B3d7C061F817ab05aF9Fab3b61EEe036e4f4fc\"};\n} // bzn::utils\n\n\n// logging\n#define LOG(x) BOOST_LOG_TRIVIAL(x) << \"(\" << bzn::utils::basename(__FILE__) << \":\"  << __LINE__ << \") - \"\n\n// This limits the number of characters that are displayed in \"LOG(x) <<\"  messages.\nconst uint16_t MAX_MESSAGE_SIZE = 1024;\nconst uint16_t MAX_SHORT_MESSAGE_SIZE = 32;\n"
  },
  {
    "path": "include/boost_asio_beast.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <include/bluzelle.hpp>\n#include <boost/asio.hpp>\n#include <boost/beast.hpp>\n#include <boost/beast/ssl.hpp>\n#include <boost/beast/websocket/ssl.hpp>\n\n\n// todo: this file needs a better name!\n\nnamespace bzn::asio\n{\n    // types...\n    using  accept_handler = std::function<void(const boost::system::error_code& ec)>;\n    using    read_handler = std::function<void(const boost::system::error_code& ec, size_t bytes_transfered)>;\n    using   write_handler = std::function<void(const boost::system::error_code& ec, size_t bytes_transfered)>;\n    using connect_handler = std::function<void(const boost::system::error_code& ec)>;\n    using   close_handler = std::function<void(const boost::system::error_code& ec)>;\n    using    wait_handler = std::function<void(const boost::system::error_code& ec)>;\n    using            task = std::function<void()>;\n\n    ///////////////////////////////////////////////////////////////////////////\n    // mockable interfaces...\n\n    class tcp_socket_base\n    {\n    public:\n        virtual ~tcp_socket_base() = default;\n\n        virtual void async_connect(const boost::asio::ip::tcp::endpoint& ep, bzn::asio::connect_handler handler) = 0;\n\n        virtual boost::asio::ip::tcp::endpoint remote_endpoint() = 0;\n\n        virtual boost::asio::ip::tcp::socket& get_tcp_socket() = 0;\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    class udp_socket_base\n    {\n    public:\n        virtual ~udp_socket_base() = default;\n\n        virtual void async_send_to(const boost::asio::const_buffer& msg, boost::asio::ip::udp::endpoint ep, bzn::asio::write_handler handler) = 0;\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    class tcp_acceptor_base\n    {\n    public:\n        virtual ~tcp_acceptor_base() = default;\n\n        virtual void async_accept(bzn::asio::tcp_socket_base& socket, bzn::asio::accept_handler handler) = 0;\n\n        virtual boost::asio::ip::tcp::acceptor& get_tcp_acceptor() = 0;\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    class steady_timer_base\n    {\n    public:\n        virtual ~steady_timer_base() = default;\n\n        virtual void async_wait(wait_handler handler) = 0;\n\n        virtual std::size_t expires_from_now(const std::chrono::milliseconds& expiry_time) = 0;\n\n        virtual void cancel() = 0;\n\n        virtual boost::asio::steady_timer& get_steady_timer() = 0;\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    class strand_base\n    {\n    public:\n        virtual ~strand_base() = default;\n\n        virtual bzn::asio::write_handler wrap(write_handler handler) = 0;\n\n        virtual bzn::asio::close_handler wrap(close_handler handler) = 0;\n\n        virtual bzn::asio::task wrap(bzn::asio::task action) = 0;\n\n        virtual void post(bzn::asio::task action) = 0;\n\n        virtual boost::asio::io_context::strand& get_strand() = 0;\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    class io_context_base\n    {\n    public:\n        virtual ~io_context_base() = default;\n\n        virtual std::unique_ptr<bzn::asio::tcp_acceptor_base> make_unique_tcp_acceptor(const boost::asio::ip::tcp::endpoint& ep) = 0;\n\n        virtual std::unique_ptr<bzn::asio::tcp_socket_base> make_unique_tcp_socket() = 0;\n\n        virtual std::unique_ptr<bzn::asio::tcp_socket_base> make_unique_tcp_socket(bzn::asio::strand_base& ctx) = 0;\n\n        virtual std::unique_ptr<bzn::asio::udp_socket_base> make_unique_udp_socket() = 0;\n\n        virtual std::unique_ptr<bzn::asio::steady_timer_base> make_unique_steady_timer() = 0;\n\n        virtual std::unique_ptr<bzn::asio::strand_base> make_unique_strand() = 0;\n\n        virtual void post(bzn::asio::task) = 0;\n\n        virtual boost::asio::io_context::count_type run() = 0;\n\n\n        virtual void stop() = 0;\n\n        virtual boost::asio::io_context& get_io_context() = 0;\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n    // the real thing...\n\n    class udp_socket final : public udp_socket_base\n    {\n    public:\n        explicit udp_socket(boost::asio::io_context& io_context)\n            : socket(io_context)\n        {\n            this->socket.open(boost::asio::ip::udp::v4());\n        }\n\n        void async_send_to(const boost::asio::const_buffer& msg, boost::asio::ip::udp::endpoint ep, bzn::asio::write_handler handler)\n        {\n            this->socket.async_send_to(msg, ep, handler);\n        }\n\n    private:\n        boost::asio::ip::udp::socket socket;\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    class tcp_socket final : public tcp_socket_base\n    {\n    public:\n        explicit tcp_socket(boost::asio::io_context& io_context)\n            : socket(io_context)\n        {\n        }\n\n        explicit tcp_socket(bzn::asio::strand_base& ctx)\n                : socket(ctx.get_strand())\n        {\n        }\n\n        void async_connect(const boost::asio::ip::tcp::endpoint& ep, bzn::asio::connect_handler handler) override\n        {\n            this->socket.async_connect(ep, handler);\n        }\n\n        boost::asio::ip::tcp::endpoint remote_endpoint() override\n        {\n            return this->socket.remote_endpoint();\n        }\n\n        boost::asio::ip::tcp::socket& get_tcp_socket() override\n        {\n            return this->socket;\n        }\n\n    private:\n        boost::asio::ip::tcp::socket socket;\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    class tcp_acceptor final : public tcp_acceptor_base\n    {\n    public:\n        explicit tcp_acceptor(boost::asio::io_context& io_context, const boost::asio::ip::tcp::endpoint& ep)\n            : acceptor(io_context, ep)\n        {\n        }\n\n        void async_accept(bzn::asio::tcp_socket_base& socket, bzn::asio::accept_handler handler) override\n        {\n            this->acceptor.async_accept(socket.get_tcp_socket(), std::move(handler));\n        }\n\n        boost::asio::ip::tcp::acceptor& get_tcp_acceptor() override\n        {\n            return this->acceptor;\n        }\n\n    private:\n        boost::asio::ip::tcp::acceptor acceptor;\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    class steady_timer final : public steady_timer_base\n    {\n    public:\n        explicit steady_timer(boost::asio::io_context& io_context)\n            : timer(io_context)\n        {\n        }\n\n        void async_wait(wait_handler handler) override\n        {\n            this->timer.async_wait(handler);\n        }\n\n        std::size_t expires_from_now(const std::chrono::milliseconds& expiry_time) override\n        {\n            return this->timer.expires_from_now(expiry_time);\n        }\n\n        void cancel() override\n        {\n            this->timer.cancel();\n        }\n\n        boost::asio::steady_timer& get_steady_timer() override\n        {\n            return this->timer;\n        }\n\n    private:\n        boost::asio::steady_timer timer;\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    class strand final : public strand_base\n    {\n    public:\n        explicit strand(boost::asio::io_context& io_context)\n            : s(io_context)\n        {\n        }\n\n        bzn::asio::write_handler wrap(write_handler handler) override\n        {\n            return this->s.wrap(std::move(handler));\n        }\n\n        bzn::asio::close_handler wrap(close_handler handler) override\n        {\n            return this->s.wrap(std::move(handler));\n        }\n\n        bzn::asio::task wrap(bzn::asio::task action) override\n        {\n            return this->s.wrap(std::move(action));\n        }\n\n        void post(bzn::asio::task action) override\n        {\n            this->s.post(action);\n        }\n\n        boost::asio::io_context::strand& get_strand() override\n        {\n            return this->s;\n        }\n\n    private:\n        boost::asio::io_context::strand s;\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    class io_context final : public io_context_base\n    {\n    public:\n        std::unique_ptr<bzn::asio::tcp_acceptor_base> make_unique_tcp_acceptor(const boost::asio::ip::tcp::endpoint& ep) override\n        {\n            return std::make_unique<bzn::asio::tcp_acceptor>(this->io_context, ep);\n        }\n\n        std::unique_ptr<bzn::asio::tcp_socket_base> make_unique_tcp_socket() override\n        {\n            return std::make_unique<bzn::asio::tcp_socket>(this->io_context);\n        }\n\n        std::unique_ptr<bzn::asio::tcp_socket_base> make_unique_tcp_socket(bzn::asio::strand_base& ctx) override\n        {\n            return std::make_unique<bzn::asio::tcp_socket>(ctx);\n        }\n\n        std::unique_ptr<bzn::asio::udp_socket_base> make_unique_udp_socket() override\n        {\n            return std::make_unique<bzn::asio::udp_socket>(this->io_context);\n        }\n\n        std::unique_ptr<bzn::asio::steady_timer_base> make_unique_steady_timer() override\n        {\n            return std::make_unique<bzn::asio::steady_timer>(this->io_context);\n        }\n\n        std::unique_ptr<bzn::asio::strand_base> make_unique_strand() override\n        {\n            return std::make_unique<bzn::asio::strand>(this->io_context);\n        }\n\n        void post(bzn::asio::task func) override\n        {\n            boost::asio::post(this->io_context, func);\n        }\n\n        boost::asio::io_context::count_type run() override\n        {\n            return this->io_context.run();\n        }\n\n        void stop() override\n        {\n            this->io_context.stop();\n        }\n\n        boost::asio::io_context& get_io_context() override\n        {\n            return this->io_context;\n        }\n\n    private:\n        boost::asio::io_context io_context;\n    };\n\n} // bzn::asio\n\n\nnamespace bzn::beast\n{\n    // types...\n    using handshake_handler = std::function<void(const boost::system::error_code& ec)>;\n    using read_handler  = std::function<void(const boost::beast::error_code& ec, std::size_t bytes_transferred)>;\n    using write_handler = std::function<void(const boost::beast::error_code& ec, std::size_t bytes_transferred)>;\n    using close_handler = std::function<void(const boost::system::error_code& ec)>;\n\n    ///////////////////////////////////////////////////////////////////////////\n    // mockable interfaces...\n\n    class http_socket_base\n    {\n    public:\n        virtual ~http_socket_base() = default;\n\n        virtual boost::asio::ip::tcp::socket& get_socket() = 0;\n\n        virtual void async_read(boost::beast::flat_buffer& buffer, boost::beast::http::request<boost::beast::http::dynamic_body>& request, bzn::beast::read_handler handler) = 0;\n\n        virtual void async_write(boost::beast::http::response<boost::beast::http::dynamic_body>& response, bzn::beast::write_handler handler) = 0;\n\n        virtual void close() = 0;\n    };\n\n    class http_socket final : public http_socket_base\n    {\n    public:\n        explicit http_socket(boost::asio::ip::tcp::socket socket)\n            : socket(std::move(socket))\n        {\n        }\n\n        boost::asio::ip::tcp::socket& get_socket() override\n        {\n            return this->socket;\n        }\n\n        void async_read(boost::beast::flat_buffer& buffer, boost::beast::http::request<boost::beast::http::dynamic_body>& request, bzn::beast::read_handler handler) override\n        {\n            boost::beast::http::async_read(this->socket, buffer, request, std::move(handler));\n        }\n\n        void async_write(boost::beast::http::response<boost::beast::http::dynamic_body>& response, bzn::beast::write_handler handler) override\n        {\n            boost::beast::http::async_write(this->socket, response, std::move(handler));\n        }\n\n        void close() override\n        {\n            this->socket.close();\n        }\n\n    private:\n        boost::asio::ip::tcp::socket socket;\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    class websocket_stream_base\n    {\n    public:\n        virtual ~websocket_stream_base() = default;\n\n        virtual void async_accept(bzn::asio::accept_handler handler) = 0;\n\n        virtual void async_read(boost::beast::multi_buffer& buffer, bzn::asio::read_handler handler) = 0;\n\n        virtual void async_write(const boost::asio::mutable_buffers_1& buffer, bzn::asio::write_handler handler) = 0;\n\n        virtual size_t write(const boost::asio::mutable_buffers_1& buffer, boost::beast::error_code& ec) = 0;\n\n        virtual void async_close(boost::beast::websocket::close_code reason, bzn::beast::close_handler handler) = 0;\n\n        virtual void async_handshake(const std::string& host, const std::string& target, bzn::beast::handshake_handler handler) = 0;\n\n        virtual void binary(bool bin) = 0;\n\n        virtual bool is_open() = 0;\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    class websocket_stream final : public websocket_stream_base\n    {\n    public:\n        explicit websocket_stream(boost::asio::ip::tcp::socket socket)\n            : websocket(std::move(socket))\n        {\n        }\n\n        void async_accept(bzn::asio::accept_handler handler) override\n        {\n            this->websocket.async_accept(handler);\n        }\n\n        void async_read(boost::beast::multi_buffer& buffer, bzn::asio::read_handler handler) override\n        {\n            this->websocket.async_read(buffer, handler);\n        }\n\n        void async_write(const boost::asio::mutable_buffers_1& buffer, bzn::asio::write_handler handler) override\n        {\n            this->websocket.async_write(buffer, handler);\n        }\n\n        size_t write(const boost::asio::mutable_buffers_1& buffer, boost::beast::error_code& ec) override\n        {\n            return this->websocket.write(buffer, ec);\n        }\n\n        void async_close(boost::beast::websocket::close_code reason, bzn::beast::close_handler handler) override\n        {\n            this->websocket.async_close(reason, handler);\n        }\n\n        void async_handshake(const std::string& host, const std::string& target, bzn::beast::handshake_handler handler) override\n        {\n            this->websocket.async_handshake(host, target, handler);\n        }\n\n        bool is_open() override\n        {\n            return this->websocket.is_open();\n        }\n\n        void binary(bool bin) override\n        {\n            this->websocket.binary(bin);\n        }\n\n    private:\n        boost::beast::websocket::stream<boost::asio::ip::tcp::socket> websocket;\n    };\n\n\n\n    class websocket_secure_stream final : public websocket_stream_base, public std::enable_shared_from_this<websocket_secure_stream>\n    {\n    public:\n        explicit websocket_secure_stream(boost::asio::ip::tcp::socket socket, boost::asio::ssl::context& ctx)\n            : websocket(std::move(socket), ctx)\n        {\n            // todo: add peer validation\n        }\n\n        void async_accept(bzn::asio::accept_handler handler) override\n        {\n            boost::beast::get_lowest_layer(this->websocket).expires_after(std::chrono::seconds(30));\n\n            this->websocket.next_layer().async_handshake(\n                boost::asio::ssl::stream_base::server,\n                [self = shared_from_this(), handler](auto ec)\n                {\n                    if (ec)\n                    {\n                        LOG(error) << \"server ssl handshake failed: \" << ec.message();\n                        return;\n                    }\n\n                    boost::beast::get_lowest_layer(self->websocket).expires_never();\n\n                    self->websocket.async_accept(handler);\n                });\n        }\n\n        void async_read(boost::beast::multi_buffer& buffer, bzn::asio::read_handler handler) override\n        {\n            this->websocket.async_read(buffer, handler);\n        }\n\n        void async_write(const boost::asio::mutable_buffers_1& buffer, bzn::asio::write_handler handler) override\n        {\n            this->websocket.async_write(buffer, handler);\n        }\n\n        size_t write(const boost::asio::mutable_buffers_1& buffer, boost::beast::error_code& ec) override\n        {\n            return this->websocket.write(buffer, ec);\n        }\n\n        void async_close(boost::beast::websocket::close_code reason, bzn::beast::close_handler handler) override\n        {\n            this->websocket.async_close(reason, handler);\n        }\n\n        void async_handshake(const std::string& host, const std::string& target, bzn::beast::handshake_handler handler) override\n        {\n            boost::beast::get_lowest_layer(this->websocket).expires_after(std::chrono::seconds(30));\n\n            this->websocket.next_layer().async_handshake(\n                boost::asio::ssl::stream_base::client,\n                [self = shared_from_this(), host, target, handler](auto ec)\n                {\n                    if (ec)\n                    {\n                        LOG(error) << \"client ssl handshake failed: \" << ec.message();\n                        return;\n                    }\n\n                    boost::beast::get_lowest_layer(self->websocket).expires_never();\n\n                    self->websocket.async_handshake(host, target, handler);\n                });\n        }\n\n        bool is_open() override\n        {\n            return this->websocket.is_open();\n        }\n\n        void binary(bool bin) override\n        {\n            this->websocket.binary(bin);\n        }\n\n    private:\n        boost::beast::websocket::stream<boost::beast::ssl_stream<boost::beast::tcp_stream>> websocket;\n    };\n    //\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    class websocket_base\n    {\n    public:\n        virtual ~websocket_base() = default;\n\n        virtual std::unique_ptr<bzn::beast::websocket_stream_base> make_websocket_stream(boost::asio::ip::tcp::socket& socket) = 0;\n\n        virtual std::shared_ptr<bzn::beast::websocket_stream_base> make_websocket_secure_stream(boost::asio::ip::tcp::socket& socket,\n            boost::asio::ssl::context& ctx) = 0;\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    class websocket final : public websocket_base\n    {\n    public:\n        std::unique_ptr<bzn::beast::websocket_stream_base> make_websocket_stream(boost::asio::ip::tcp::socket& socket) override\n        {\n            return std::make_unique<bzn::beast::websocket_stream>(std::move(socket));\n        }\n\n        std::shared_ptr<bzn::beast::websocket_stream_base> make_websocket_secure_stream(boost::asio::ip::tcp::socket& socket,\n            boost::asio::ssl::context& ctx) override\n        {\n            return std::make_shared<bzn::beast::websocket_secure_stream>(std::move(socket), ctx);\n        }\n    };\n\n} // bzn::beast\n"
  },
  {
    "path": "include/system_clock.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n#include <chrono>\n\nnamespace bzn\n{\n    class system_clock_base\n    {\n    public:\n        virtual uint64_t microseconds_since_epoch() = 0;\n\n        virtual ~system_clock_base() = default;\n    };\n\n    class system_clock : public system_clock_base\n    {\n        uint64_t microseconds_since_epoch()\n        {\n            auto res = std::chrono::time_point_cast<std::chrono::microseconds>(std::chrono::high_resolution_clock::now());\n            return res.time_since_epoch().count();\n        }\n    };\n}\n"
  },
  {
    "path": "mocks/CMakeLists.txt",
    "content": "add_library(smart_mocks STATIC\n        smart_mock_node.hpp\n        smart_mock_node.cpp\n        smart_mock_io.hpp\n        smart_mock_io.cpp\n        smart_mock_peers_beacon.hpp\n        smart_mock_peers_beacon.cpp\n        )\n\nadd_dependencies(smart_mocks boost proto googletest)\n\ntarget_include_directories(smart_mocks PRIVATE ${BLUZELLE_STD_INCLUDES})\n"
  },
  {
    "path": "mocks/mock_boost_asio_beast.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <include/boost_asio_beast.hpp>\n#include <gmock/gmock.h>\n\n\n// gmock_gen.py generated...\n\nnamespace bzn::asio {\n\n    class mock_tcp_socket_base : public tcp_socket_base {\n    public:\n        MOCK_METHOD0(get_tcp_socket,\n            boost::asio::ip::tcp::socket&());\n        MOCK_METHOD2(async_connect,\n            void(const boost::asio::ip::tcp::endpoint& ep, bzn::asio::connect_handler handler));\n        MOCK_METHOD0(remote_endpoint,\n            boost::asio::ip::tcp::endpoint());\n    };\n\n}  // namespace bzn::asio\n\n\nnamespace bzn::asio {\n\n    class mock_udp_socket_base : public udp_socket_base {\n    public:\n        MOCK_METHOD3(async_send_to, void(const boost::asio::const_buffer& msg,\n                           boost::asio::ip::udp::endpoint ep,\n                           std::function<void(const boost::system::error_code&, size_t)> handler));\n    };\n\n}  // namespace bzn::asio\n\n\nnamespace bzn::asio {\n\n    class mock_tcp_acceptor_base : public tcp_acceptor_base {\n    public:\n        MOCK_METHOD2(async_accept,\n            void(bzn::asio::tcp_socket_base& socket, bzn::asio::accept_handler handler));\n        MOCK_METHOD0(get_tcp_acceptor,\n            boost::asio::ip::tcp::acceptor&());\n    };\n\n}  // namespace bzn::asio\n\n\nnamespace bzn::asio {\n\n    class mock_steady_timer_base : public steady_timer_base {\n    public:\n        MOCK_METHOD1(async_wait,\n            void(wait_handler handler));\n        MOCK_METHOD1(expires_from_now,\n            std::size_t(const std::chrono::milliseconds& expiry_time));\n        MOCK_METHOD0(cancel,\n            void());\n        MOCK_METHOD0(get_steady_timer,\n            boost::asio::steady_timer&());\n    };\n\n}  // namespace bzn::asio\n\n\nnamespace bzn::asio {\n\n    class mock_strand_base : public strand_base {\n    public:\n        MOCK_METHOD1(wrap,\n            bzn::asio::write_handler(write_handler handler));\n        MOCK_METHOD1(wrap,\n            bzn::asio::close_handler(close_handler handler));\n        MOCK_METHOD1(wrap,\n            bzn::asio::task(bzn::asio::task handler));\n        MOCK_METHOD1(post,\n            void(bzn::asio::task task));\n        MOCK_METHOD0(get_strand,\n            boost::asio::io_context::strand&());\n    };\n\n}  // namespace bzn::asio\n\n\nnamespace bzn::asio {\n\n    class mock_io_context_base : public io_context_base {\n    public:\n        MOCK_METHOD1(make_unique_tcp_acceptor,\n            std::unique_ptr<bzn::asio::tcp_acceptor_base>(const boost::asio::ip::tcp::endpoint& ep));\n        MOCK_METHOD0(make_unique_tcp_socket,\n            std::unique_ptr<bzn::asio::tcp_socket_base>());\n        MOCK_METHOD1(make_unique_tcp_socket,\n                std::unique_ptr<bzn::asio::tcp_socket_base>(bzn::asio::strand_base&));\n        MOCK_METHOD0(make_unique_udp_socket,\n                     std::unique_ptr<bzn::asio::udp_socket_base>());\n        MOCK_METHOD0(make_unique_steady_timer,\n            std::unique_ptr<bzn::asio::steady_timer_base>());\n        MOCK_METHOD0(make_unique_strand,\n            std::unique_ptr<bzn::asio::strand_base>());\n        MOCK_METHOD1(post,\n            void(bzn::asio::task));\n        MOCK_METHOD0(run,\n            boost::asio::io_context::count_type());\n        MOCK_METHOD0(stop,\n            void());\n        MOCK_METHOD0(get_io_context,\n            boost::asio::io_context&());\n    };\n\n}  // namespace bzn::asio\n\n\nnamespace bzn::beast {\n\n    class mock_http_socket_base : public http_socket_base {\n    public:\n        MOCK_METHOD0(get_socket,\n            boost::asio::ip::tcp::socket&());\n        MOCK_METHOD3(async_read,\n            void(boost::beast::flat_buffer& buffer, boost::beast::http::request<boost::beast::http::dynamic_body>& request, bzn::beast::read_handler handler));\n        MOCK_METHOD2(async_write,\n            void(boost::beast::http::response<boost::beast::http::dynamic_body>& response, bzn::beast::write_handler handler));\n        MOCK_METHOD0(close,\n            void());\n    };\n\n}  // namespace bzn::beast\n\n\nnamespace bzn::beast {\n\n    class mock_websocket_stream_base : public websocket_stream_base {\n    public:\n        MOCK_METHOD1(async_accept,\n            void(bzn::asio::accept_handler handler));\n        MOCK_METHOD2(async_read,\n            void(boost::beast::multi_buffer& buffer, bzn::asio::read_handler handler));\n        MOCK_METHOD2(async_write,\n            void(const boost::asio::mutable_buffers_1& buffer, bzn::asio::write_handler handler));\n        MOCK_METHOD2(write,\n            size_t(const boost::asio::mutable_buffers_1& buffer, boost::beast::error_code& ec));\n        MOCK_METHOD2(async_close,\n            void(boost::beast::websocket::close_code reason, bzn::beast::close_handler handler));\n        MOCK_METHOD3(async_handshake,\n            void(const std::string& host, const std::string& target, bzn::beast::handshake_handler handler));\n        MOCK_METHOD0(is_open,\n            bool());\n        MOCK_METHOD1(binary,\n            void(bool bin));\n    };\n\n}  // namespace bzn::beast\n\n\nnamespace bzn::beast {\n\n    class mock_websocket_base : public websocket_base {\n    public:\n        MOCK_METHOD1(make_websocket_stream,\n            std::unique_ptr<bzn::beast::websocket_stream_base>(boost::asio::ip::tcp::socket& socket));\n        MOCK_METHOD2(make_websocket_secure_stream,\n            std::shared_ptr<bzn::beast::websocket_stream_base>(boost::asio::ip::tcp::socket& socket, boost::asio::ssl::context& ctx));\n    };\n\n}  // namespace bzn::beast\n"
  },
  {
    "path": "mocks/mock_chaos_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <functional>\n#include <gmock/gmock.h>\n\nnamespace bzn {\n\nclass mock_chaos_base : public chaos_base {\n public:\n  MOCK_METHOD0(start,\n      void());\n  MOCK_METHOD0(is_message_dropped,\n      bool());\n  MOCK_METHOD0(is_message_delayed,\n      bool());\n  MOCK_CONST_METHOD1(reschedule_message,\n      void(std::function<void()> callback));\n};\n\n}  // namespace bzn\n"
  },
  {
    "path": "mocks/mock_crud_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <crud/crud_base.hpp>\n#include <gmock/gmock.h>\n\nnamespace bzn {\n\n    class mock_crud_base : public crud_base {\n    public:\n        MOCK_METHOD3(handle_request,\n            void(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session));\n        MOCK_METHOD2(start,\n            void(std::shared_ptr<bzn::pbft_base> pbft, size_t max_storage));\n        MOCK_METHOD0(save_state,\n            bool());\n        MOCK_METHOD0(get_saved_state,\n            std::shared_ptr<std::string>());\n        MOCK_METHOD1(load_state,\n            bool(const std::string&));\n    };\n\n}  // namespace bzn\n\n"
  },
  {
    "path": "mocks/mock_crypto_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <crypto/crypto_base.hpp>\n#include <gmock/gmock.h>\n\nnamespace bzn\n{\n    class mock_crypto_base : public crypto_base\n    {\n    public:\n        MOCK_METHOD1(sign, bool(bzn_envelope& msg));\n\n        MOCK_METHOD1(verify, bool(const bzn_envelope& msg));\n\n        MOCK_METHOD1(hash, std::string(const std::string& msg));\n\n        MOCK_METHOD1(hash,  std::string(const bzn_envelope& msg));\n    };\n}\n"
  },
  {
    "path": "mocks/mock_monitor.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <monitor/monitor_base.hpp>\n#include <gmock/gmock.h>\n\nnamespace bzn {\n\n    class mock_monitor : public monitor_base {\n    public:\n        MOCK_METHOD1(start_timer,\n            void(std::string instance_id));\n        MOCK_METHOD2(finish_timer,\n            void(statistic stat, std::string instance_id));\n        MOCK_METHOD2(send_counter,\n            void(statistic, uint64_t));\n    };\n\n}  // namespace bzn\n"
  },
  {
    "path": "mocks/mock_node_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <node/node_base.hpp>\n#include <gmock/gmock.h>\n\n\n// gmock_gen.py generated...\n\nnamespace bzn {\n\nclass mock_node_base : public node_base {\n public:\n  MOCK_METHOD2(register_for_message,\n      bool(const bzn_envelope::PayloadCase msg_type, bzn::protobuf_handler message_handler));\n  MOCK_METHOD1(register_error_handler,\n      void(std::function<void(const boost::asio::ip::tcp::endpoint& ep, const boost::system::error_code&)> error_callback));\n  MOCK_METHOD1(start,\n      void(std::shared_ptr<bzn::pbft_base> pbft));\n  MOCK_METHOD2(send_signed_message,\n      void(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr<bzn_envelope> msg));\n  MOCK_METHOD2(send_signed_message,\n      void(const bzn::uuid_t& uuid, std::shared_ptr<bzn_envelope> msg));\n  MOCK_METHOD2(send_message_str,\n      void(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr<bzn::encoded_message> msg));\n  MOCK_METHOD2(multicast_signed_message,\n      void(std::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> eps, std::shared_ptr<bzn_envelope> msg));\n    MOCK_METHOD2(send_maybe_signed_message,\n        void(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr<bzn_envelope> msg));\n    MOCK_METHOD2(send_maybe_signed_message,\n        void(const bzn::uuid_t& uuid, std::shared_ptr<bzn_envelope> msg));\n    MOCK_METHOD2(multicast_maybe_signed_message,\n        void(std::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> eps, std::shared_ptr<bzn_envelope> msg));\n};\n\n}  // namespace bzn\n"
  },
  {
    "path": "mocks/mock_options_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <node/node_base.hpp>\n#include <gmock/gmock.h>\n#include <options/options_base.hpp>\n\nnamespace bzn {\n\nclass mock_options_base : public options_base {\n public:\n  MOCK_CONST_METHOD0(get_simple_options,\n      const simple_options&());\n  MOCK_METHOD0(get_mutable_simple_options,\n      simple_options&());\n  MOCK_CONST_METHOD0(get_listener,\n      boost::asio::ip::tcp::endpoint());\n  MOCK_CONST_METHOD1(get_monitor_endpoint,\n      std::optional<boost::asio::ip::udp::endpoint>(std::shared_ptr<bzn::asio::io_context_base> context));\n  MOCK_CONST_METHOD0(get_ethererum_address,\n      std::string());\n  MOCK_CONST_METHOD0(get_ethererum_io_api_token,\n      std::string());\n  MOCK_CONST_METHOD0(get_bootstrap_peers_url,\n      std::string());\n  MOCK_CONST_METHOD0(get_bootstrap_peers_file,\n      std::string());\n  MOCK_CONST_METHOD0(get_debug_logging,\n      bool());\n  MOCK_CONST_METHOD0(get_log_to_stdout,\n      bool());\n  MOCK_CONST_METHOD0(get_uuid,\n      bzn::uuid_t());\n  MOCK_CONST_METHOD0(get_swarm_id,\n        bzn::swarm_id_t());\n  MOCK_CONST_METHOD0(get_ws_idle_timeout,\n      std::chrono::milliseconds());\n  MOCK_CONST_METHOD0(get_audit_mem_size,\n      size_t());\n  MOCK_CONST_METHOD0(get_state_dir,\n      std::string());\n  MOCK_CONST_METHOD0(get_logfile_dir,\n      std::string());\n  MOCK_CONST_METHOD0(get_max_swarm_storage,\n        size_t());\n  MOCK_CONST_METHOD0(get_mem_storage,\n      bool());\n  MOCK_CONST_METHOD0(get_logfile_rotation_size,\n      size_t());\n  MOCK_CONST_METHOD0(get_logfile_max_size,\n      size_t());\n  MOCK_CONST_METHOD0(pbft_enabled,\n      bool());\n  MOCK_CONST_METHOD0(peer_validation_enabled,\n      bool());\n  MOCK_CONST_METHOD0(get_signed_key,\n      std::string());\n  MOCK_CONST_METHOD0(get_owner_public_key,\n      std::string());\n  MOCK_CONST_METHOD0(get_swarm_info_esr_address,\n      std::string());\n  MOCK_CONST_METHOD0(get_swarm_info_esr_url,\n      std::string());\n  MOCK_CONST_METHOD0(get_stack,\n      std::string());\n  MOCK_CONST_METHOD0(get_wss_enabled,\n      bool());\n  MOCK_CONST_METHOD0(get_wss_server_certificate_file,\n      std::string());\n  MOCK_CONST_METHOD0(get_wss_server_private_key_file,\n      std::string());\n  MOCK_CONST_METHOD0(get_wss_server_dh_params_file,\n      std::string());\n  MOCK_CONST_METHOD0(get_admission_window,\n      size_t());\n  MOCK_CONST_METHOD0(get_peer_message_signing,\n      bool());\n};\n\n}  // namespace bzn\n"
  },
  {
    "path": "mocks/mock_pbft_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <pbft/pbft_base.hpp>\n#include <gmock/gmock.h>\n\n\n// gmock_gen.py generated...\n\nnamespace bzn {\n\nclass mock_pbft_base : public pbft_base {\npublic:\n    MOCK_METHOD0(start,\n            void());\n    MOCK_METHOD2(handle_message,\n            void(const pbft_msg& msg, const bzn_envelope& original_msg));\n    MOCK_METHOD2(handle_database_message,\n            void(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> session));\n    MOCK_CONST_METHOD0(is_primary,\n            bool());\n    MOCK_CONST_METHOD0(get_current_primary,\n            std::optional<peer_address_t>());\n    MOCK_CONST_METHOD1(predict_primary,\n            std::optional<peer_address_t>(uint64_t view));\n    MOCK_CONST_METHOD0(get_uuid,\n            const bzn::uuid_t&());\n    MOCK_METHOD0(handle_failure,\n            void());\n    MOCK_CONST_METHOD1(get_peer_by_uuid,\n            const peer_address_t&(const std::string& uuid));\n    MOCK_CONST_METHOD0(peers,\n        std::shared_ptr<bzn::peers_beacon_base>());\n};\n\n}  // namespace bzn\n"
  },
  {
    "path": "mocks/mock_pbft_failure_detector.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <pbft/pbft_failure_detector_base.hpp>\n#include <gmock/gmock.h>\n#include <functional>\n\nnamespace bzn\n{\n    class mock_pbft_failure_detector_base : public pbft_failure_detector_base\n    {\n    public:\n        MOCK_METHOD1(request_seen, void(const bzn::hash_t& req));\n\n        MOCK_METHOD1(request_executed, void(const bzn::hash_t& req));\n\n        MOCK_METHOD1(register_failure_handler, void(std::function<void()> handler));\n    };\n\n}\n"
  },
  {
    "path": "mocks/mock_pbft_service_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <pbft/pbft_service_base.hpp>\n#include <gmock/gmock.h>\n#include <functional>\n\nnamespace bzn {\n\n    class mock_pbft_service_base : public pbft_service_base {\n     public:\n      MOCK_CONST_METHOD2(query,\n          void(const database_msg& request, uint64_t sequence_number));\n      MOCK_CONST_METHOD1(service_state_hash,\n          bzn::hash_t(uint64_t sequence_number));\n      MOCK_METHOD1(consolidate_log,\n          void(uint64_t sequence_number));\n      MOCK_METHOD1(register_execute_handler,\n          void(bzn::execute_handler_t handler));\n      MOCK_METHOD1(apply_operation,\n          void(const std::shared_ptr<pbft_operation>&));\n      MOCK_METHOD2(apply_operation_now,\n          bool(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> session));\n      MOCK_CONST_METHOD1(get_service_state,\n          std::shared_ptr<bzn::service_state_t>(uint64_t sequence_number));\n      MOCK_METHOD2(set_service_state,\n          bool(uint64_t sequence_number, const bzn::service_state_t& data));\n      MOCK_METHOD1(save_service_state_at,\n            void(uint64_t));\n    };\n\n}  // namespace bzn\n"
  },
  {
    "path": "mocks/mock_peers_beacon_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <peers_beacon/peers_beacon_base.hpp>\n#include <gmock/gmock.h>\n\n\nnamespace bzn {\n\n    class mock_peers_beacon_base : public peers_beacon_base\n    {\n    public:\n        MOCK_METHOD0(start,\n            void());\n\n        MOCK_CONST_METHOD0(current,\n            std::shared_ptr<const peers_list_t>());\n\n        MOCK_CONST_METHOD0(ordered,\n                std::shared_ptr<const ordered_peers_list_t>());\n\n        MOCK_METHOD1(refresh,\n            bool(bool first_run));\n\n        bool refresh()\n        {\n            return this->refresh(false);\n        }\n    };\n\n}\n"
  },
  {
    "path": "mocks/mock_session_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <node/session_base.hpp>\n#include <gmock/gmock.h>\n\n\n// gmock_gen.py generated...\n\nnamespace bzn {\n    class mock_session_base : public session_base {\n    public:\n        MOCK_METHOD1(send_message,\n            void(std::shared_ptr<bzn::encoded_message> msg));\n        MOCK_METHOD1(send_signed_message,\n                void(std::shared_ptr<bzn_envelope> msg));\n        MOCK_METHOD0(get_session_id,\n            bzn::session_id());\n        MOCK_METHOD0(close,\n            void());\n        MOCK_CONST_METHOD0(is_open,\n            bool());\n        MOCK_CONST_METHOD0(is_closing,\n            bool());\n        MOCK_METHOD2(open,\n            void(std::shared_ptr<bzn::beast::websocket_base> ws_factory, std::function<void(const boost::system::error_code&)>));\n        MOCK_METHOD1(accept,\n            void(std::shared_ptr<bzn::beast::websocket_stream_base> ws));\n        MOCK_METHOD1(add_shutdown_handler,\n            void(bzn::session_shutdown_handler handler));\n\n    };\n}  // namespace bzn\n"
  },
  {
    "path": "mocks/mock_status_provider_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <status/status_provider_base.hpp>\n#include <gmock/gmock.h>\n\n\n// gmock_gen.py generated...\n\nnamespace bzn {\n\n    class mock_status_provider_base : public status_provider_base {\n    public:\n        MOCK_METHOD0(get_name,\n            std::string());\n        MOCK_METHOD0(get_status,\n            bzn::json_message());\n    };\n\n}  // namespace bzn\n"
  },
  {
    "path": "mocks/mock_storage_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <storage/storage_base.hpp>\n#include <gmock/gmock.h>\n\nnamespace bzn {\n\n    class mock_storage_base : public storage_base {\n    public:\n        MOCK_METHOD3(create,\n            bzn::storage_result(const bzn::uuid_t& uuid, const std::string& key, const std::string& value));\n        MOCK_METHOD2(read,\n            std::optional<bzn::value_t> (const bzn::uuid_t& uuid, const std::string& key));\n        MOCK_METHOD3(update,\n            bzn::storage_result(const bzn::uuid_t& uuid, const std::string& key, const std::string& value));\n        MOCK_METHOD2(remove,\n            bzn::storage_result(const bzn::uuid_t& uuid, const std::string& key));\n        MOCK_METHOD0(start,\n            bzn::storage_result());\n        MOCK_METHOD1(save,\n            bzn::storage_result(const std::string& path));\n        MOCK_METHOD1(load,\n            bzn::storage_result(const std::string& path));\n        MOCK_METHOD1(error_msg,\n            std::string(bzn::storage_result error_id));\n        MOCK_METHOD1(get_keys,\n            std::vector<std::string>(const bzn::uuid_t& uuid));\n        MOCK_METHOD2(has,\n            bool(const bzn::uuid_t& uuid, const std::string& key));\n        MOCK_METHOD1(get_size,\n            std::pair<std::size_t, std::size_t>(const bzn::uuid_t& uuid));\n        MOCK_METHOD2(get_key_size,\n            std::optional<std::size_t>(const bzn::uuid_t& uuid, const bzn::key_t& key));\n        MOCK_METHOD1(remove,\n            bzn::storage_result(const bzn::uuid_t& uuid));\n        MOCK_METHOD0(create_snapshot,\n            bool());\n        MOCK_METHOD0(get_snapshot,\n            std::shared_ptr<std::string>());\n        MOCK_METHOD1(load_snapshot,\n            bool(const std::string&));\n        MOCK_METHOD3(remove_range,\n            void(const bzn::uuid_t& uuid, const std::string&, const std::string&));\n        MOCK_METHOD4(get_keys_if,\n            std::vector<bzn::key_t>(const bzn::uuid_t&, const std::string&\n            , const std::string&, std::optional<std::function<bool(const bzn::key_t&, const bzn::value_t&)>>));\n        MOCK_METHOD4(read_if,\n            std::vector<std::pair<bzn::key_t, bzn::value_t>>(const bzn::uuid_t&, const std::string&\n            , const std::string&, std::optional<std::function<bool(const bzn::key_t&, const bzn::value_t&)>>));\n    };\n\n}  // namespace bzn\n"
  },
  {
    "path": "mocks/mock_subscription_manager_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <crud/subscription_manager_base.hpp>\n#include <gmock/gmock.h>\n\nnamespace bzn {\n\nclass mock_subscription_manager_base : public subscription_manager_base {\n public:\n  MOCK_METHOD0(start,\n      void());\n  MOCK_METHOD5(subscribe,\n      void(const bzn::uuid_t& uuid, const bzn::key_t& key, uint64_t transaction_id, database_response& response, std::shared_ptr<bzn::session_base> session));\n  MOCK_METHOD5(unsubscribe,\n      void(const bzn::uuid_t& uuid, const bzn::key_t& key, uint64_t transaction_id, database_response& response, std::shared_ptr<bzn::session_base> session));\n  MOCK_METHOD1(inspect_commit,\n      void(const database_msg& msg));\n};\n\n}  // namespace bzn\n"
  },
  {
    "path": "mocks/mock_system_clock.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <include/system_clock.hpp>\n#include <gmock/gmock.h>\n\nnamespace bzn\n{\n    class mock_system_clock : public system_clock_base\n    {\n    public:\n        MOCK_METHOD0(microseconds_since_epoch, uint64_t());\n    };\n}\n\n"
  },
  {
    "path": "mocks/mock_utils_interface.hpp",
    "content": "#pragma once\n#include <utils/utils_interface.hpp>\n\nnamespace bzn {\n\n    class mock_utils_interface_base : public utils_interface_base {\n    public:\n        MOCK_CONST_METHOD3(get_peer_ids,\n                std::vector<std::string>(const bzn::uuid_t& swarm_id, const std::string& esr_address, const std::string& url));\n        MOCK_CONST_METHOD4(get_peer_info,\n                bzn::peer_address_t(const bzn::uuid_t& swarm_id, const std::string& peer_id, const std::string& esr_address, const std::string& url));\n        MOCK_CONST_METHOD2(sync_req,\n                std::string(const std::string& url, const std::string& post));\n\n        std::string sync_req(const std::string& url) const\n        {\n            return this->sync_req(url, \"\");\n        }\n    };\n\n}  // namespace bzn\n"
  },
  {
    "path": "mocks/smart_mock_io.cpp",
    "content": "// Copyright (C) 2019 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n\n#include <mocks/smart_mock_io.hpp>\n#include <include/bluzelle.hpp>\n\nusing namespace ::testing;\nusing namespace bzn;\n\n\nbzn::asio::smart_mock_io::smart_mock_io()\n{\n    EXPECT_CALL(*this, make_unique_strand()).WillRepeatedly(Invoke(\n            [&]()\n            {\n                auto strand = std::make_unique<bzn::asio::mock_strand_base>();\n                EXPECT_CALL(*strand, wrap(A<bzn::asio::close_handler>())).WillRepeatedly(ReturnArg<0>());\n                EXPECT_CALL(*strand, wrap(A<bzn::asio::read_handler>())).WillRepeatedly(ReturnArg<0>());\n                EXPECT_CALL(*strand, wrap(A<bzn::asio::task>())).WillRepeatedly(ReturnArg<0>());\n                EXPECT_CALL(*strand, post(A<bzn::asio::task>())).WillRepeatedly(Invoke(\n                        [&](auto task)\n                        {\n                            this->wrapped_post(task);\n                        }));\n\n                return strand;\n            }));\n\n    EXPECT_CALL(*this, post(_)).WillRepeatedly(Invoke(\n            [&](auto func)\n            {\n                this->wrapped_post(func);\n            }));\n\n    EXPECT_CALL(*this, make_unique_steady_timer()).WillRepeatedly(Invoke(\n            [&]()\n            {\n                auto id = timer_count++;\n\n                auto timer = std::make_unique<bzn::asio::mock_steady_timer_base>();\n                EXPECT_CALL(*timer, async_wait(_)).WillRepeatedly(Invoke(\n                        [&, id](auto wh)\n                        {\n                            timer_callbacks[id] = wh;\n                        }));\n                EXPECT_CALL(*timer, expires_from_now(_)).Times(AnyNumber());\n                return timer;\n            }));\n\n    EXPECT_CALL(*this, make_unique_tcp_socket(_)).WillRepeatedly(Invoke(\n            [&](auto& /*strand*/)\n            {\n                return this->make_unique_tcp_socket();\n            }));\n\n    EXPECT_CALL(*this, make_unique_tcp_socket()).WillRepeatedly(Invoke(\n            [&]()\n            {\n                auto id = socket_count++;\n\n                auto mock_socket = std::make_unique<bzn::asio::mock_tcp_socket_base>();\n\n                static boost::asio::io_context io;\n                static boost::asio::ip::tcp::socket socket(io);\n                this->socket_id_map.insert_or_assign(socket.native_handle(), id);\n                EXPECT_CALL(*mock_socket, get_tcp_socket()).WillRepeatedly(ReturnRef(socket));\n\n                EXPECT_CALL(*mock_socket, remote_endpoint()).Times(AnyNumber());\n\n                EXPECT_CALL(*mock_socket, async_connect(_, _)).Times(AtMost(1)).WillOnce(Invoke(\n                        [&](auto, auto handler)\n                        {\n                            this->wrapped_post(std::bind(handler,\n                                    this->tcp_connect_works ? boost::system::error_code{} : boost::asio::error::connection_refused));\n                        }));\n\n                return mock_socket;\n            }));\n\n    EXPECT_CALL(*this, make_unique_tcp_acceptor(_)).Times(AtMost(1)).WillOnce(Invoke(\n            [&](auto& /*ep*/)\n            {\n                auto mock_acceptor = std::make_unique<bzn::asio::mock_tcp_acceptor_base>();\n\n                EXPECT_CALL(*mock_acceptor, async_accept(_, _)).WillRepeatedly(Invoke(\n                        [&](auto& socket, auto handler)\n                        {\n                            auto id = this->socket_id_map.at(socket.get_tcp_socket().native_handle());\n                            this->tcp_accept_handlers.insert_or_assign(id, handler);\n                        }));\n\n                return mock_acceptor;\n            }));\n\n    EXPECT_CALL(*(this->websocket), make_websocket_stream(_)).WillRepeatedly(Invoke(\n            [&](auto& socket)\n            {\n                auto id = this->socket_id_map.at(socket.native_handle());\n                this->socket_is_open.insert_or_assign(id, true);\n                auto wss = std::make_unique<bzn::beast::mock_websocket_stream_base>();\n\n                EXPECT_CALL(*wss, async_accept(_)).Times(AtMost(1)).WillOnce(Invoke(\n                        [&, id](auto handler)\n                        {\n                            this->ws_accept_handlers.insert_or_assign(id, handler);\n                        }));\n\n                EXPECT_CALL(*wss, async_write(_, _)).WillRepeatedly(Invoke(\n                        [&, id](const boost::asio::mutable_buffers_1& buffer, auto handler)\n                        {\n                            this->ws_write_closures.insert_or_assign(id,\n                                    [handler, &buffer]()\n                                    {\n                                        char* raw_buf = static_cast<char*>(buffer.begin()->data());\n                                        std::string result(raw_buf, buffer.begin()->size());\n                                        handler(boost::system::error_code{}, result.size());\n\n                                        return result;\n                                    });\n                        }));\n\n                EXPECT_CALL(*wss, async_read(_, _)).WillRepeatedly(Invoke(\n                        [&, id](auto& buffer, auto handler)\n                        {\n                            this->ws_read_closures.insert_or_assign(id,\n                                    [handler, &buffer](std::string data)\n                                    {\n                                        size_t n = boost::asio::buffer_copy(buffer.prepare(data.size()), boost::asio::buffer(data));\n                                        buffer.commit(n);\n\n                                        handler(boost::system::error_code{}, data.size());\n                                    });\n                        }));\n\n                EXPECT_CALL(*wss, async_handshake(_, _, _)).Times(AtMost(1)).WillRepeatedly(Invoke(\n                        [&](auto, auto, auto handler)\n                        {\n                            this->wrapped_post(std::bind(handler, boost::system::error_code{}));\n                        }));\n\n                EXPECT_CALL(*wss, is_open()).WillRepeatedly(Invoke(\n                        [&, id]()\n                        {\n                            return this->socket_is_open.at(id);\n                        }));\n\n                this->ws_closed.insert_or_assign(id, false);\n                EXPECT_CALL(*wss, async_close(_, _)).WillRepeatedly(Invoke(\n                        [&, id](auto /*reason*/, auto handler)\n                        {\n                            this->ws_closed.insert_or_assign(id, true);\n                            this->wrapped_post(std::bind(handler, boost::system::error_code{}));\n                        }));\n\n                EXPECT_CALL(*wss, binary(_)).Times(AnyNumber());\n\n                return wss;\n            }));\n}\n\nvoid\nbzn::asio::smart_mock_io::do_incoming_connection(size_t id)\n{\n    this->tcp_accept_handlers.at(id)(boost::system::error_code{});\n    this->yield_until_clear();\n    this->ws_accept_handlers.at(id)(boost::system::error_code{});\n    this->yield_until_clear();\n}\n\nvoid\nbzn::asio::smart_mock_io::shutdown()\n{\n    if (this->pending_real_callbacks > 0)\n    {\n        LOG(error) << \"Warning: shutting down mock io context while it still has pending real callbacks to execute\";\n    }\n\n    // These callbacks are likely to transitively hold a shared pointers to us,\n    // so cleaning them up is necessary for us to be cleaned up\n    this->timer_callbacks.clear();\n    this->ws_read_closures.clear();\n    this->ws_write_closures.clear();\n    this->ws_accept_handlers.clear();\n    this->tcp_accept_handlers.clear();\n}\n\nvoid\nbzn::asio::smart_mock_io::wrapped_post(bzn::asio::task task)\n{\n    this->pending_real_callbacks++;\n    boost::asio::post([this, task]()\n        {\n            task();\n            this->pending_real_callbacks--;\n        });\n}\n\nvoid\nbzn::asio::smart_mock_io::yield_until_clear()\n{\n    uint64_t sleep_time = 1;\n    while (this->pending_real_callbacks > 0)\n    {\n        if (sleep_time > 1)\n        {\n            LOG(debug) << \"some callbacks are still pending; mock waiting for \" << sleep_time << \" ms\";\n        }\n\n        std::this_thread::sleep_for(std::chrono::milliseconds(sleep_time));\n        sleep_time *= 2;\n    }\n}\n\nvoid\nbzn::asio::smart_mock_io::trigger_timer(unsigned int timer_id)\n{\n    this->timer_callbacks.at(timer_id)(boost::system::error_code{});\n}\n"
  },
  {
    "path": "mocks/smart_mock_io.hpp",
    "content": "// Copyright (C) 2019 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n\n#pragma once\n\n#include <mocks/mock_boost_asio_beast.hpp>\n\nnamespace bzn::asio\n{\n    class smart_mock_io : public mock_io_context_base\n    {\n    public:\n\n        smart_mock_io();\n        void do_incoming_connection(size_t id);\n        void shutdown();\n\n        void yield_until_clear();\n\n        void trigger_timer(unsigned int timer_id);\n\n        std::shared_ptr<bzn::asio::io_context_base> real_io_context = std::make_shared<bzn::asio::io_context>();\n        std::shared_ptr<bzn::beast::mock_websocket_base> websocket = std::make_shared<bzn::beast::mock_websocket_base>();\n\n        size_t timer_count = 0;\n        std::map<size_t, bzn::asio::wait_handler> timer_callbacks;\n\n        size_t socket_count = 0;\n        std::map<size_t, bzn::asio::accept_handler> tcp_accept_handlers;\n        std::map<size_t, bzn::asio::accept_handler> ws_accept_handlers;\n\n        std::map<size_t, std::function<std::string()>> ws_write_closures;\n        std::map<size_t, std::function<void(std::string)>> ws_read_closures;\n\n        std::map<size_t, bool> ws_closed;\n\n        std::map<size_t, bool> socket_is_open;\n\n        std::map<boost::asio::ip::tcp::socket::native_handle_type, size_t> socket_id_map;\n\n        bool tcp_connect_works = true;\n\n    private:\n        void wrapped_post(bzn::asio::task task);\n\n        std::atomic_int pending_real_callbacks;\n    };\n}\n"
  },
  {
    "path": "mocks/smart_mock_node.cpp",
    "content": "// Copyright (C) 2019 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <mocks/smart_mock_node.hpp>\n\n\nusing namespace ::testing;\n\nbzn::smart_mock_node::smart_mock_node()\n{\n    EXPECT_CALL(*this, register_for_message(_, _)).WillRepeatedly(Invoke(\n            [&](auto type, auto handler)\n            {\n                if (this->registrants.count(type) > 0)\n                {\n                    throw std::runtime_error(\"duplicate node registration\");\n                }\n\n                this->registrants[type] = handler;\n                return true;\n            }\n            ));\n\n    EXPECT_CALL(*this, multicast_maybe_signed_message(_, _)).WillRepeatedly(Invoke(\n            [&](auto endpoints, auto message)\n            {\n                for (const auto ep : *endpoints)\n                {\n                    this->send_maybe_signed_message(ep, message);\n                }\n            }));\n}\n\nvoid bzn::smart_mock_node::deliver(const bzn_envelope& msg)\n{\n    if (this->registrants.count(msg.payload_case()) == 0)\n    {\n        throw std::runtime_error(\"undeliverable message\");\n    }\n\n    this->registrants.at(msg.payload_case())(msg, nullptr);\n}\n\nvoid bzn::smart_mock_node::clear()\n{\n    this->registrants.clear();\n}\n"
  },
  {
    "path": "mocks/smart_mock_node.hpp",
    "content": "// Copyright (C) 2019 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <mocks/mock_node_base.hpp>\n#include <unordered_map>\n\nnamespace bzn\n{\n    class smart_mock_node : public mock_node_base\n    {\n    public:\n        smart_mock_node();\n\n        void deliver(const bzn_envelope&);\n\n        std::unordered_map<bzn_envelope::PayloadCase, bzn::protobuf_handler> registrants;\n\n        void clear();\n\n    };\n}\n"
  },
  {
    "path": "mocks/smart_mock_peers_beacon.cpp",
    "content": "// Copyright (C) 2019 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n\n#include <mocks/smart_mock_peers_beacon.hpp>\n\nusing namespace ::testing;\n\nstd::shared_ptr<bzn::mock_peers_beacon_base>\nbzn::static_peers_beacon_for(bzn::peers_list_t peers)\n{\n    auto res = std::make_shared<bzn::mock_peers_beacon_base>();\n    auto list = std::make_shared<bzn::peers_list_t>(peers);\n\n    EXPECT_CALL(*res, start()).Times(AtMost(1));\n\n    EXPECT_CALL(*res, current()).WillRepeatedly(Return(list));\n\n    auto ordered = std::make_shared<ordered_peers_list_t>();\n    std::for_each(peers.begin(), peers.end(),\n            [&](const auto& peer)\n            {\n                ordered->push_back(peer);\n            });\n\n    std::sort(ordered->begin(), ordered->end(),\n            [](const auto& peer1, const auto& peer2)\n            {\n                return peer1.uuid.compare(peer2.uuid) < 0;\n            });\n\n    EXPECT_CALL(*res, ordered()).WillRepeatedly(Return(ordered));\n\n    EXPECT_CALL(*res, refresh(_)).Times(AnyNumber());\n\n    return res;\n}\n\nstd::shared_ptr<bzn::mock_peers_beacon_base>\nbzn::static_peers_beacon_for(std::vector<bzn::peer_address_t> peers)\n{\n    bzn::peers_list_t list;\n    std::for_each(peers.begin(), peers.end(),\n            [&](const auto& peer){list.insert(peer);}\n            );\n\n    return static_peers_beacon_for(list);\n}\n\nstd::shared_ptr<bzn::mock_peers_beacon_base>\nbzn::static_empty_peers_beacon()\n{\n    return static_peers_beacon_for(std::vector<peer_address_t>{});\n}\n"
  },
  {
    "path": "mocks/smart_mock_peers_beacon.hpp",
    "content": "// Copyright (C) 2019 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n\n#pragma once\n\n#include <mocks/mock_peers_beacon_base.hpp>\n\nnamespace bzn\n{\n    std::shared_ptr<mock_peers_beacon_base> static_peers_beacon_for(peers_list_t peers);\n    std::shared_ptr<mock_peers_beacon_base> static_peers_beacon_for(std::vector<peer_address_t> peers);\n    std::shared_ptr<mock_peers_beacon_base> static_empty_peers_beacon();\n}\n"
  },
  {
    "path": "monitor/CMakeLists.txt",
    "content": "add_library(monitor\n        monitor_base.hpp\n        monitor.hpp\n        monitor.cpp\n        )\n\nadd_dependencies(monitor boost jsoncpp)\ntarget_include_directories(monitor PRIVATE ${BLUZELLE_STD_INCLUDES})\ntarget_link_libraries(utils)\nadd_subdirectory(test)\n"
  },
  {
    "path": "monitor/monitor.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <monitor/monitor.hpp>\n#include <boost/format.hpp>\n\nusing namespace bzn;\n\nnamespace\n{\n    const std::unordered_map<statistic, std::string> statistic_names{\n            {\n                    {statistic::hash_computed, \"crypto.hashes_computed\"},\n                    {statistic::hash_computed_bytes, \"crypto.bytes_hashed\"},\n                    {statistic::signature_computed, \"crypto.signatures_computed\"},\n                    {statistic::signature_computed_bytes, \"crypto.bytes_signed\"},\n                    {statistic::signature_verified, \"crypto.signatures_verified\"},\n                    {statistic::signature_verified_bytes, \"crypto.bytes_verified\"},\n                    {statistic::signature_rejected, \"crypto.signatures_rejected\"},\n\n                    {statistic::session_opened, \"node.sessions_opened\"},\n                    {statistic::message_sent, \"node.messages_sent\"},\n                    {statistic::message_sent_bytes, \"node.bytes_sent\"},\n\n                    {statistic::pbft_no_primary, \"pbft.liveness.no_primary\"},\n                    {statistic::pbft_primary_alive, \"pbft.liveness.primary_alive\"},\n                    {statistic::pbft_commit, \"pbft.liveness.commit\"},\n                    {statistic::pbft_failure_detected, \"pbft.liveness.failure_detected\"},\n                    {statistic::pbft_commit_conflict, \"pbft.safety.commit_conflict\"},\n                    {statistic::pbft_primary_conflict, \"pbft.safety.primary_conflict\"},\n\n                    {statistic::request_latency, \"total-server-latency\"}\n            }\n    };\n}\n\nmonitor::monitor(std::shared_ptr<bzn::options_base> options, std::shared_ptr<bzn::asio::io_context_base> context, std::shared_ptr<bzn::system_clock_base> clock)\n        : time_last_sent(clock->microseconds_since_epoch())\n        , options(std::move(options))\n        , context(std::move(context))\n        , clock(std::move(clock))\n        , socket(this->context->make_unique_udp_socket())\n        , monitor_endpoint(this->options->get_monitor_endpoint(this->context))\n        , scope_prefix(\"com.bluzelle.\" + this->options->get_stack() + \".\" + this->options->get_swarm_id() + \".swarmdb.\" + this->options->get_uuid())\n{\n    if (this->monitor_endpoint)\n    {\n        LOG(info) << boost::format(\"Will send stats to %1%:%2%\")\n                     % this->monitor_endpoint->address().to_string()\n                     % this->monitor_endpoint->port();\n    }\n    else\n    {\n        LOG(info) << \"No monitor is configured; stats will not be collected\";\n    }\n\n}\n\nvoid\nmonitor::start_timer(std::string timer_id)\n{\n    if (!this->monitor_endpoint)\n    {\n        return;\n    }\n\n    std::lock_guard<std::mutex> lock(this->lock);\n    if (this->start_times.find(timer_id) != this->start_times.end())\n    {\n        return;\n    }\n\n    this->start_times.emplace(std::make_pair(timer_id, this->clock->microseconds_since_epoch()));\n    this->ordered_timers.push_back(timer_id);\n\n    while (this->ordered_timers.size() > this->options->get_simple_options().get<uint64_t>(bzn::option_names::MONITOR_MAX_TIMERS))\n    {\n        this->start_times.erase(this->ordered_timers.front());\n        this->ordered_timers.pop_front();\n    }\n}\n\nvoid\nmonitor::finish_timer(bzn::statistic stat, std::string timer_id)\n{\n    if (!this->monitor_endpoint)\n    {\n        return;\n    }\n\n    uint64_t result;\n    std::lock_guard<std::mutex> lock(this->lock);\n\n    if (this->start_times.find(timer_id) == this->start_times.end())\n    {\n        return;\n    }\n\n    result = this->clock->microseconds_since_epoch() - start_times.at(timer_id);\n    this->start_times.erase(timer_id);\n\n    auto stat_string = this->scope_prefix + \".\" + statistic_names.at(stat) + \":\" + std::to_string(result) + \"|us\";\n    this->send(stat_string);\n}\n\nvoid\nmonitor::send_counter(bzn::statistic stat, uint64_t amount)\n{\n    if (!this->monitor_endpoint)\n    {\n        return;\n    }\n\n    std::lock_guard<std::mutex> lock(this->lock);\n    if (this->options->get_simple_options().get<bool>(option_names::MONITOR_COLLATE))\n    {\n        this->accumulated_stats.insert(std::make_pair(stat, 0)); // silently fails if key exists\n        this->accumulated_stats.insert_or_assign(stat, this->accumulated_stats.at(stat) + amount);\n        this->maybe_send();\n    }\n    else\n    {\n        this->send(this->format_counter(stat, amount));\n    }\n}\n\nstd::string\nmonitor::format_counter(bzn::statistic stat, uint64_t amount)\n{\n    return this->scope_prefix + \".\" + statistic_names.at(stat) + \":\" + std::to_string(amount) + \"|c\";\n}\n\nvoid\nmonitor::send(const std::string& stat)\n{\n    LOG(trace) << \"...\" << (stat.length() <= 30 ? stat : stat.substr(stat.length() - 30));\n    std::shared_ptr<boost::asio::const_buffer> buffer = std::make_shared<boost::asio::const_buffer>(stat.c_str(), stat.size());\n    this->socket->async_send_to(*buffer, *(this->monitor_endpoint),\n            [buffer](const boost::system::error_code& ec, std::size_t /*bytes*/)\n            {\n                if (ec)\n                {\n                    LOG(error) << \"UDP send failed\";\n                }\n            });\n}\n\nvoid\nmonitor::maybe_send()\n{\n    auto threshold = this->time_last_sent + this->options->get_simple_options().get<uint64_t>(option_names::MONITOR_COLLATE_INTERVAL_SECONDS)*1000000;\n    if (this->clock->microseconds_since_epoch() >= threshold)\n    {\n        LOG(trace) << \"Sending batched statistics:\";\n        for (const auto& pair : this->accumulated_stats)\n        {\n            this->send(this->format_counter(pair.first, pair.second));\n        }\n        this->accumulated_stats.clear();\n        this->time_last_sent = this->clock->microseconds_since_epoch();\n    }\n}\n"
  },
  {
    "path": "monitor/monitor.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <monitor/monitor_base.hpp>\n#include <options/options_base.hpp>\n#include <include/boost_asio_beast.hpp>\n#include <include/system_clock.hpp>\n\n#include <list>\n#include <unordered_map>\n\nnamespace bzn\n{\n    class monitor : public monitor_base\n    {\n    public:\n\n        monitor(std::shared_ptr<bzn::options_base> options, std::shared_ptr<bzn::asio::io_context_base> context, std::shared_ptr<bzn::system_clock_base> clock);\n\n        void start_timer(std::string instance_id) override;\n\n        void finish_timer(statistic stat, std::string instance_id) override;\n\n        void send_counter(statistic stat, uint64_t amount = 1) override;\n\n    private:\n\n        void send(const std::string& stat);\n\n        std::string format_counter(statistic stat, uint64_t amount);\n\n        void maybe_send();\n\n        uint64_t time_last_sent;\n        std::unordered_map<statistic, uint64_t> accumulated_stats;\n\n        std::list<std::string> ordered_timers;\n        std::unordered_map<std::string, uint64_t> start_times;\n\n        std::mutex lock;\n\n        std::shared_ptr<bzn::options_base> options;\n        std::shared_ptr<bzn::asio::io_context_base> context;\n        std::shared_ptr<bzn::system_clock_base> clock;\n        std::unique_ptr<bzn::asio::udp_socket_base> socket;\n        const std::optional<boost::asio::ip::udp::endpoint> monitor_endpoint;\n        const std::string scope_prefix;\n    };\n}\n"
  },
  {
    "path": "monitor/monitor_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <include/bluzelle.hpp>\n#include <string>\n\nnamespace bzn\n{\n    enum class statistic\n    {\n        hash_computed,\n        hash_computed_bytes,\n        signature_computed,\n        signature_computed_bytes,\n        signature_verified,\n        signature_verified_bytes,\n        signature_rejected,\n\n        session_opened,\n        message_sent,\n        message_sent_bytes,\n\n        pbft_no_primary,\n        pbft_primary_alive,\n        pbft_failure_detected,\n        pbft_commit_conflict,\n        pbft_primary_conflict,\n\n        pbft_commit,\n\n        request_latency\n    };\n\n    class monitor_base\n    {\n    public:\n\n        /*\n         * Start timing for some statistic (e.g. a request completion). Will be ignored if this is a duplicate of some\n         * other recent timer.\n         * @instance_id some globally unique name for this instance of the timer (such as the request hash)\n         */\n        virtual void start_timer(std::string instance_id) = 0;\n\n        /*\n         * Finish timing for some statistic (e.g. a request completion). Will be ignored if no such timer has been\n         * started.\n         * @instance_id some globally unique name for this instance of the timer (such as the request hash)\n         * @stat the statistic under which to send the measurement\n         */\n        virtual void finish_timer(statistic stat, std::string instance_id) = 0;\n\n        /*\n         * Send a counter statistic\n         * @stat statistic to send\n         * @amount amount of that statistic that has been observed\n         */\n        virtual void send_counter(statistic stat, uint64_t amount = 1) = 0;\n\n        virtual ~monitor_base() = default;\n    };\n}\n"
  },
  {
    "path": "monitor/test/CMakeLists.txt",
    "content": "set(test_srcs monitor_test.cpp)\nset(test_libs monitor options)\n\nadd_gmock_test(monitor)\n"
  },
  {
    "path": "monitor/test/monitor_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <monitor/monitor.hpp>\n#include <mocks/mock_system_clock.hpp>\n#include <include/boost_asio_beast.hpp>\n#include <mocks/mock_system_clock.hpp>\n#include <mocks/mock_boost_asio_beast.hpp>\n#include <options/options.hpp>\n#include <options/simple_options.hpp>\n\n#include <regex>\n#include <gmock/gmock.h>\n#include <mocks/mock_options_base.hpp>\n\nusing namespace ::testing;\n\nclass monitor_test : public Test\n{\npublic:\n    std::shared_ptr<bzn::asio::mock_io_context_base> io_context = std::make_shared<bzn::asio::mock_io_context_base>();\n    std::shared_ptr<bzn::mock_system_clock> clock = std::make_shared<bzn::mock_system_clock>();\n    std::shared_ptr<bzn::mock_options_base> options = std::make_shared<bzn::mock_options_base>();\n    std::shared_ptr<bzn::monitor> monitor;\n\n    uint64_t current_time = 0;\n    std::vector<std::string> sent_messages;\n\n    boost::asio::ip::udp::endpoint ep;\n    bool send_works = true;\n\n    bzn::simple_options soptions;\n\n    monitor_test()\n    {\n        EXPECT_CALL(*(this->options), get_uuid()).WillRepeatedly(Return(\"uuid\"));\n        EXPECT_CALL(*(this->options), get_monitor_endpoint(_)).WillRepeatedly(Invoke([&](auto){return this->ep;}));\n        EXPECT_CALL(*(this->options), get_stack()).WillRepeatedly(Return(\"utest\"));\n        EXPECT_CALL(*(this->options), get_swarm_id()).WillRepeatedly(Return(\"0\"));\n        this->soptions.set(bzn::option_names::MONITOR_MAX_TIMERS, \"100\");\n        this->soptions.set(bzn::option_names::MONITOR_COLLATE, \"false\");\n        EXPECT_CALL(*(this->options), get_simple_options()).WillRepeatedly(Invoke(\n                [&]() -> const bzn::simple_options&\n                {\n                    return this->soptions;\n                }\n                ));\n\n        EXPECT_CALL(*(this->clock), microseconds_since_epoch()).WillRepeatedly(Invoke(\n                [&]()\n                {\n                    return this->current_time;\n                }\n        ));\n\n        EXPECT_CALL(*(this->io_context), make_unique_udp_socket()).WillRepeatedly(Invoke(\n                [&]()\n                {\n                    auto socket = std::make_unique<bzn::asio::mock_udp_socket_base>();\n                    EXPECT_CALL(*socket, async_send_to(_, _, _)).WillRepeatedly(Invoke(\n                            [&](auto buffer, auto /*endpoint*/, auto handler)\n                            {\n                                sent_messages.emplace_back(reinterpret_cast<const char*>(buffer.data()), buffer.size());\n                                if(this->send_works)\n                                {\n                                    handler(boost::system::error_code{}, buffer.size());\n                                }\n                                else\n                                {\n                                    handler(boost::asio::error::connection_refused, 0);\n                                }\n                            }\n                            ));\n                    return socket;\n                }\n                ));\n\n        this->monitor = std::make_shared<bzn::monitor>(this->options, this->io_context, this->clock);\n    }\n\n    std::pair<std::string, uint64_t> parse_counter(const std::string& message)\n    {\n        std::regex counter_regex(\"^(.*):(\\\\d*)\\\\|(.*)$\");\n        std::smatch result;\n\n        EXPECT_TRUE(std::regex_match(message, result, counter_regex));\n        EXPECT_EQ(result[3].str(), \"c\");\n\n        return std::pair(result[1].str(), std::stoull(result[2].str()));\n    };\n\n    std::pair<std::string, uint64_t> parse_timer(const std::string& message)\n    {\n        std::regex timer_regex(\"^(.*):(\\\\d*)\\\\|(.*)$\");\n        std::smatch result;\n\n        EXPECT_TRUE(std::regex_match(message, result, timer_regex));\n        EXPECT_EQ(result[3].str(), \"us\");\n\n        return std::pair(result[1].str(), std::stoull(result[2].str()));\n    };\n};\n\nTEST_F(monitor_test, test_that_counters_emit_metric)\n{\n    this->monitor->send_counter(bzn::statistic::message_sent);\n    this->monitor->send_counter(bzn::statistic::message_sent_bytes, 15u);\n\n    EXPECT_EQ(this->parse_counter(this->sent_messages.at(0)).second, 1u);\n    EXPECT_EQ(this->parse_counter(this->sent_messages.at(1)).second, 15u);\n}\n\nTEST_F(monitor_test, test_that_timers_emit_metric)\n{\n    this->monitor->start_timer(\"hash\");\n    this->current_time = 10;\n    this->monitor->finish_timer(bzn::statistic::request_latency, \"hash\");\n\n    auto res = this->parse_timer(this->sent_messages.at(0));\n\n    EXPECT_EQ(res.second, 10u);\n}\n\nTEST_F(monitor_test, test_concurrent_timers)\n{\n    this->current_time = 10;\n    this->monitor->start_timer(\"A\");\n    this->current_time = 20;\n    this->monitor->start_timer(\"B\");\n\n    this->current_time = 100;\n    this->monitor->finish_timer(bzn::statistic::request_latency, \"A\");\n    this->current_time = 1000;\n    this->monitor->finish_timer(bzn::statistic::request_latency, \"B\");\n\n    EXPECT_EQ(this->parse_timer(this->sent_messages.at(0)).second, 100u - 10u);\n    EXPECT_EQ(this->parse_timer(this->sent_messages.at(1)).second, 1000u - 20u);\n}\n\nTEST_F(monitor_test, test_timer_with_duplicate_triggers)\n{\n    this->current_time = 10;\n    this->monitor->start_timer(\"A\");\n    this->current_time = 21;\n    this->monitor->start_timer(\"A\");\n\n    this->current_time = 30;\n    this->monitor->finish_timer(bzn::statistic::request_latency, \"A\");\n    this->current_time = 43;\n    this->monitor->finish_timer(bzn::statistic::request_latency, \"A\");\n\n    EXPECT_EQ(this->parse_timer(this->sent_messages.at(0)).second, 30u - 10u);\n    EXPECT_EQ(this->sent_messages.size(), 1u);\n}\n\nTEST_F(monitor_test, test_no_endpoint)\n{\n    auto options2 = std::make_shared<NiceMock<bzn::mock_options_base>>();\n    EXPECT_CALL(*options2, get_monitor_endpoint(_)).WillRepeatedly(Return(std::nullopt));\n    auto monitor2 = std::make_shared<bzn::monitor>(options2, io_context, clock);\n\n    \n    monitor2->send_counter(bzn::statistic::message_sent);\n    monitor2->start_timer(\"a\");\n    monitor2->finish_timer(bzn::statistic::request_latency, \"a\");\n\n    EXPECT_EQ(this->sent_messages.size(), 0u);\n}\n\nTEST_F(monitor_test, test_timers_cleanup)\n{\n    for(int i=0; i<200; /*more than we remember at once*/ i++)\n    {\n        this->monitor->start_timer(std::to_string(i));\n    }\n\n    this->monitor->finish_timer(bzn::statistic::request_latency, std::to_string(0));\n\n    EXPECT_EQ(this->sent_messages.size(), 0u);\n}\n\nTEST_F(monitor_test, test_send_fails)\n{\n    this->send_works = false;\n    monitor->send_counter(bzn::statistic::message_sent);\n    monitor->start_timer(\"a\");\n    monitor->finish_timer(bzn::statistic::request_latency, \"a\");\n\n    // just testing for no crash\n}\n\nTEST_F(monitor_test, test_collate_no_messages_sent_before_time_passes)\n{\n    this->soptions.set(bzn::option_names::MONITOR_COLLATE, \"true\");\n    this->soptions.set(bzn::option_names::MONITOR_COLLATE_INTERVAL_SECONDS, \"1\");\n\n    monitor->send_counter(bzn::statistic::message_sent);\n\n    EXPECT_EQ(this->sent_messages.size(), 0u);\n}\n\nTEST_F(monitor_test, test_collate_all_messages_sent)\n{\n    this->soptions.set(bzn::option_names::MONITOR_COLLATE, \"true\");\n    this->soptions.set(bzn::option_names::MONITOR_COLLATE_INTERVAL_SECONDS, \"1\");\n\n    // note that these quantities are chosen such that the sums of any two distinct subsets are distinct; this\n    // is required to make the way we're examining the results work correctly.\n    monitor->send_counter(bzn::statistic::message_sent, 3);\n    monitor->send_counter(bzn::statistic::message_sent, 20);\n    monitor->send_counter(bzn::statistic::message_sent_bytes, 100);\n\n    EXPECT_EQ(this->sent_messages.size(), 0u);\n\n    this->current_time = 2000000;\n    monitor->send_counter(bzn::statistic::hash_computed, 4000);\n\n    std::unordered_map<uint64_t, std::string> result;\n    for(const auto& msg : this->sent_messages)\n    {\n        auto pair = this->parse_counter(msg);\n        result.insert(std::make_pair(pair.second, pair.first));\n    }\n\n    EXPECT_EQ(this->sent_messages.size(), 3u);\n    EXPECT_EQ(result.size(), 3u);\n\n    EXPECT_NE(result.find(23), result.end());\n    EXPECT_NE(result.at(23).find(\"sent\"), std::string::npos);\n    EXPECT_EQ(result.at(23).find(\"bytes\"), std::string::npos);\n\n    EXPECT_NE(result.find(100), result.end());\n    EXPECT_NE(result.at(100).find(\"sent\"), std::string::npos);\n    EXPECT_NE(result.at(100).find(\"bytes\"), std::string::npos);\n\n    EXPECT_NE(result.find(4000), result.end());\n    EXPECT_NE(result.at(4000).find(\"hash\"), std::string::npos);\n\n}\n"
  },
  {
    "path": "node/CMakeLists.txt",
    "content": "add_library(node STATIC\n        ../include/bluzelle.hpp\n        ../include/boost_asio_beast.hpp\n        ../mocks/mock_boost_asio_beast.hpp\n        node_base.hpp\n        node.hpp\n        node.cpp\n        session_base.hpp\n        session.hpp\n        session.cpp\n        ../mocks/mock_session_base.hpp)\n\ntarget_link_libraries(node proto pbft)\nadd_dependencies(node boost proto googletest jsoncpp) # for FRIEND_TEST\ntarget_include_directories(node PRIVATE ${BLUZELLE_STD_INCLUDES})\nadd_subdirectory(test)\n"
  },
  {
    "path": "node/node.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <include/bluzelle.hpp>\n#include <node/node.hpp>\n#include <node/session.hpp>\n#include <utils/make_endpoint.hpp>\n#include <pbft/pbft.hpp>\n\nusing namespace bzn;\n\nnamespace\n{\n    const std::string BZN_API_KEY = \"bzn-api\";\n\n    /* todo: add to generate_key?\n     *\n        openssl dhparam -out dh.pem 2048\n        openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 10000 -out cert.pem -subj \"//C=US\\ST=CA\\L=Los Angeles\\O=Beast\\CN=www.example.com\"\n    */\n}\n\n\nnode::node(std::shared_ptr<bzn::asio::io_context_base> io_context, std::shared_ptr<bzn::beast::websocket_base> websocket, std::shared_ptr<chaos_base> chaos,\n    const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr<bzn::crypto_base> crypto, std::shared_ptr<bzn::options_base> options, std::shared_ptr<bzn::monitor_base> monitor)\n    : tcp_acceptor(io_context->make_unique_tcp_acceptor(ep))\n    , io_context(std::move(io_context))\n    , websocket(std::move(websocket))\n    , chaos(std::move(chaos))\n    , crypto(std::move(crypto))\n    , options(std::move(options))\n    , monitor(std::move(monitor))\n{\n    this->initialize_ssl_contexts();\n}\n\n\nvoid\nnode::start(std::shared_ptr<bzn::pbft_base> pbft)\n{\n    std::call_once(this->start_once, [&]\n        {\n            this->pbft = std::move(pbft);\n            this->do_accept();\n        });\n}\n\n\nbool\nnode::register_for_message(const bzn_envelope::PayloadCase type, bzn::protobuf_handler msg_handler)\n{\n    std::lock_guard<std::shared_mutex> lock(this->message_map_mutex);\n\n    // never allow!\n    if (!msg_handler)\n    {\n        return false;\n    }\n\n    if (this->protobuf_map.find(type) != this->protobuf_map.end())\n    {\n        LOG(debug) << type << \" message type already registered\";\n\n        return false;\n    }\n\n    this->protobuf_map[type] = std::move(msg_handler);\n\n    return true;\n}\n\nvoid\nnode::register_error_handler(std::function<void(const boost::asio::ip::tcp::endpoint& ep\n    , const boost::system::error_code&)> error_handler)\n{\n    this->error_callback = std::move(error_handler);\n}\n\nvoid\nnode::do_accept()\n{\n    std::shared_ptr<bzn::asio::strand_base> strand = this->io_context->make_unique_strand();\n    this->acceptor_socket = this->io_context->make_unique_tcp_socket(*strand);\n\n    this->tcp_acceptor->async_accept(*this->acceptor_socket,\n        [self = shared_from_this(), strand](const boost::system::error_code& ec)\n        {\n            if (ec)\n            {\n                LOG(error) << \"accept failed: \" << ec.message();\n            }\n            else\n            {\n                auto ep = self->acceptor_socket->remote_endpoint();\n                auto key = self->key_from_ep(ep);\n\n                // set tcp_nodelay option...\n                boost::system::error_code option_ec;\n                self->acceptor_socket->get_tcp_socket().set_option(boost::asio::ip::tcp::no_delay(true), option_ec);\n                if (option_ec)\n                {\n                    LOG(warning) << \"failed to set socket option TCP_NODELAY: \" << option_ec.message();\n                }\n#ifndef __APPLE__\n                int flags = 1;\n                if (setsockopt(self->acceptor_socket->get_tcp_socket().native_handle(), SOL_TCP, TCP_QUICKACK, &flags, sizeof(flags)))\n                {\n                    LOG(warning) << \"failed to set socket option TCP_QUICKACK: \" << errno;\n                }\n#endif\n                std::shared_ptr<bzn::beast::websocket_stream_base> ws =\n                    (!self->options->get_wss_enabled()) ? self->websocket->make_websocket_stream(self->acceptor_socket->get_tcp_socket()) :\n                    self->websocket->make_websocket_secure_stream(self->acceptor_socket->get_tcp_socket(), *self->server_ctx);\n\n                auto session = std::make_shared<bzn::session>(\n                        self->io_context\n                        , ++self->session_id_counter\n                        , ep\n                        , self->chaos\n                        , std::bind(&node::priv_protobuf_handler, self, std::placeholders::_1, std::placeholders::_2)\n                        , self->options->get_ws_idle_timeout()\n                        , std::list<bzn::session_shutdown_handler>{[](){}}\n                        , self->crypto\n                        , self->monitor\n                        , self->options\n                        , strand);\n\n                session->accept(std::move(ws));\n\n                LOG(info) << \"accepting new incoming connection with \" << key;\n                // Do not attempt to identify the incoming session; one ip address could be running multiple daemons\n                // and we can't identify them based on the outgoing ports they choose\n            }\n\n            self->do_accept();\n        });\n}\n\n\nvoid\nnode::priv_protobuf_handler(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> session)\n{\n    std::shared_lock<std::shared_mutex> lock(this->message_map_mutex); // lock for read access\n\n    if (msg.swarm_id() != this->options->get_swarm_id())\n    {\n        LOG(error) << \"Dropping message with invalid swarm id: \" << msg.ShortDebugString().substr(0, MAX_MESSAGE_SIZE);\n        return;\n    }\n\n    if (auto it = this->protobuf_map.find(msg.payload_case()); it != this->protobuf_map.end())\n    {\n        it->second(msg, std::move(session));\n    }\n    else\n    {\n        LOG(debug) << \"no handler for message type \" << msg.payload_case();\n    }\n}\n\n\nvoid\nnode::priv_session_shutdown_handler(const ep_key_t& ep_key)\n{\n    std::shared_ptr<bzn::session_base> session;\n    std::lock_guard<std::mutex> lock(this->session_map_mutex);\n    if (this->sessions.find(ep_key) != this->sessions.end() && (session = this->sessions.at(ep_key).lock()) && session->is_open())\n    {\n        // the session may have already been replaced, and we don't want to remove the new one if so\n        return;\n    }\n    this->sessions.erase(ep_key);\n}\n\n\nstd::shared_ptr<bzn::session_base>\nnode::find_session(const boost::asio::ip::tcp::endpoint& ep)\n{\n    std::shared_ptr<bzn::session_base> session;\n    std::lock_guard<std::mutex> lock(this->session_map_mutex);\n    auto key = this->key_from_ep(ep);\n\n    if (this->sessions.find(key) == this->sessions.end() || !(session = this->sessions.at(key).lock()) || session->is_closing())\n    {\n        session = std::make_shared<bzn::session>(\n                this->io_context\n                , ++this->session_id_counter\n                , ep\n                , this->chaos\n                , std::bind(&node::priv_protobuf_handler, shared_from_this(), std::placeholders::_1, std::placeholders::_2)\n                , this->options->get_ws_idle_timeout()\n                , std::list<bzn::session_shutdown_handler>{std::bind(&node::priv_session_shutdown_handler, shared_from_this(), key)}\n                , this->crypto\n                , this->monitor\n                , this->options\n                , std::nullopt\n                , this->client_ctx);\n        session->open(this->websocket, [self = shared_from_this(), ep](const boost::system::error_code& ec)\n        {\n            if (ec && self->error_callback)\n            {\n                self->error_callback(ep, ec);\n            }\n        });\n        this->sessions.insert_or_assign(key, session);\n    }\n    return session;\n}\n\n\nvoid\nnode::send_message_str(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr<bzn::encoded_message> msg)\n{\n    this->find_session(ep)->send_message(msg);\n}\n\n\nvoid\nnode::send_signed_message(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr<bzn_envelope> msg)\n{\n    this->find_session(ep)->send_signed_message(msg);\n}\n\n\nvoid\nnode::multicast_signed_message(std::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> eps, std::shared_ptr<bzn_envelope> msg)\n{\n    this->io_context->post(\n            [self =  shared_from_this(), msg, eps]()\n            {\n                if (msg->signature().empty())\n                {\n                    self->crypto->sign(*msg);\n                }\n\n                for (const auto& ep : *eps)\n                {\n                    self->send_signed_message(ep, msg);\n                }\n            });\n}\n\n\nep_key_t\nnode::key_from_ep(const boost::asio::ip::tcp::endpoint& ep)\n{\n    return ep.address().to_string() + \":\" + std::to_string(ep.port());\n}\n\n\nvoid\nnode::send_signed_message(const bzn::uuid_t& uuid, std::shared_ptr<bzn_envelope> msg)\n{\n    try\n    {\n        auto point_of_contact_address = this->pbft->get_peer_by_uuid(uuid);\n\n        if (const auto endpoint = bzn::make_endpoint(point_of_contact_address))\n        {\n            this->send_signed_message(*endpoint, msg);\n            return;\n        }\n    }\n    catch (const std::runtime_error& err)\n    {\n        LOG(error) << \"Unable to send message to \" << uuid << \": \" << err.what();\n        return;\n    }\n\n    LOG(error) << \"Unable send_signed_message to \" << uuid << \" -- resolver error\";\n}\n\n\nvoid\nnode::send_maybe_signed_message(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr<bzn_envelope> msg)\n{\n    if (this->options->get_peer_message_signing())\n    {\n        this->find_session(ep)->send_signed_message(msg);\n    }\n    else\n    {\n        msg->set_sender(this->options->get_uuid());\n        msg->set_swarm_id(this->options->get_swarm_id());\n        this->find_session(ep)->send_message(std::make_shared<std::string>(msg->SerializeAsString()));\n    }\n}\n\n\nvoid\nnode::multicast_maybe_signed_message(std::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> eps, std::shared_ptr<bzn_envelope> msg)\n{\n    this->io_context->post(\n        [self =  shared_from_this(), msg, eps]()\n        {\n            for (const auto& ep : *eps)\n            {\n                self->send_maybe_signed_message(ep, msg);\n            }\n        });\n}\n\n\nvoid\nnode::send_maybe_signed_message(const bzn::uuid_t& uuid, std::shared_ptr<bzn_envelope> msg)\n{\n    try\n    {\n        auto point_of_contact_address = this->pbft->get_peer_by_uuid(uuid);\n\n        if (const auto endpoint = bzn::make_endpoint(point_of_contact_address))\n        {\n            this->send_maybe_signed_message(*endpoint, msg);\n            return;\n        }\n    }\n    catch (const std::runtime_error& err)\n    {\n        LOG(error) << \"Unable to send message to \" << uuid << \": \" << err.what();\n        return;\n    }\n\n    LOG(error) << \"Unable send_maybe_signed_message to \" << uuid << \" -- resolver error\";\n}\n\n\nvoid\nnode::initialize_ssl_contexts()\n{\n    if (!this->options->get_wss_enabled())\n    {\n        // nothing to do...\n        LOG(info) << \"WSS disabled\";\n        return;\n    }\n\n    LOG(info) << \"WSS enabled\";\n\n    this->server_ctx = std::make_shared<boost::asio::ssl::context>(boost::asio::ssl::context::tlsv12_server);\n\n    // server (inbound)\n    this->server_ctx->set_options(\n        boost::asio::ssl::context::default_workarounds |\n        boost::asio::ssl::context::no_sslv2 |\n        boost::asio::ssl::context::single_dh_use);\n\n    this->server_ctx->use_certificate_chain_file(this->options->get_wss_server_certificate_file());\n\n    this->server_ctx->use_private_key_file(this->options->get_wss_server_private_key_file(),\n        boost::asio::ssl::context::file_format::pem);\n\n    if (!this->options->get_wss_server_dh_params_file().empty())\n    {\n        this->server_ctx->use_tmp_dh_file(this->options->get_wss_server_dh_params_file());\n    }\n\n    // client (outbound)\n    this->client_ctx = std::make_shared<boost::asio::ssl::context>(boost::asio::ssl::context::tlsv12_client);\n\n    // set default paths for finding CA certificates...\n    //this->client_ctx.set_default_verify_paths();\n}\n"
  },
  {
    "path": "node/node.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <chaos/chaos_base.hpp>\n#include <crypto/crypto_base.hpp>\n#include <include/boost_asio_beast.hpp>\n#include <monitor/monitor_base.hpp>\n#include <node/node_base.hpp>\n#include <options/options_base.hpp>\n#include <pbft/pbft_base.hpp>\n#include <atomic>\n#include <json/json.h>\n#include <shared_mutex>\n\n\n#include <gtest/gtest_prod.h>\n\n\nnamespace bzn\n{\n    using ep_key_t = std::string;\n\n    class node final : public bzn::node_base, public std::enable_shared_from_this<node>\n    {\n    public:\n        node(std::shared_ptr<bzn::asio::io_context_base> io_context, std::shared_ptr<bzn::beast::websocket_base> websocket, std::shared_ptr<chaos_base> chaos,\n                   const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr<bzn::crypto_base> crypto, std::shared_ptr<bzn::options_base> options, std::shared_ptr<monitor_base> monitor);\n\n        bool register_for_message(const bzn_envelope::PayloadCase type, bzn::protobuf_handler msg_handler) override;\n\n        void register_error_handler(std::function<void(const boost::asio::ip::tcp::endpoint& ep, const boost::system::error_code&)> error_callback) override;\n\n        void start(std::shared_ptr<bzn::pbft_base> pbft) override;\n\n        void send_signed_message(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr<bzn_envelope> msg) override;\n\n        void multicast_signed_message(std::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> eps, std::shared_ptr<bzn_envelope> msg) override;\n\n        void send_message_str(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr<bzn::encoded_message> msg) override;\n\n        void send_signed_message(const bzn::uuid_t& uuid, std::shared_ptr<bzn_envelope> msg) override;\n\n        void send_maybe_signed_message(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr<bzn_envelope> msg) override;\n\n        void multicast_maybe_signed_message(std::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> eps, std::shared_ptr<bzn_envelope> msg) override;\n\n        void send_maybe_signed_message(const bzn::uuid_t& uuid, std::shared_ptr<bzn_envelope> msg) override;\n\n    private:\n        FRIEND_TEST(node, test_that_registered_message_handler_is_invoked);\n        FRIEND_TEST(node, test_that_wrongly_signed_messages_are_dropped);\n\n        void do_accept();\n\n        void priv_protobuf_handler(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> session);\n        void priv_session_shutdown_handler(const ep_key_t& ep_key);\n\n        void initialize_ssl_contexts();\n\n        std::shared_ptr<bzn::pbft_base> pbft;\n\n        std::shared_ptr<bzn::session_base> find_session(const boost::asio::ip::tcp::endpoint& ep);\n\n        ep_key_t key_from_ep(const boost::asio::ip::tcp::endpoint& ep);\n\n        std::unordered_map<ep_key_t, std::weak_ptr<bzn::session_base>> sessions;\n        std::mutex session_map_mutex;\n\n        std::unique_ptr<bzn::asio::tcp_acceptor_base> tcp_acceptor;\n        std::shared_ptr<bzn::asio::io_context_base>   io_context;\n        std::unique_ptr<bzn::asio::tcp_socket_base>   acceptor_socket;\n        std::shared_ptr<bzn::beast::websocket_base>   websocket;\n        std::shared_ptr<bzn::chaos_base>              chaos;\n\n        std::unordered_map<bzn_envelope::PayloadCase, bzn::protobuf_handler> protobuf_map;\n        std::shared_mutex message_map_mutex;\n\n        std::once_flag start_once;\n\n        std::atomic<bzn::session_id> session_id_counter = 0;\n\n        std::shared_ptr<bzn::crypto_base> crypto;\n        std::shared_ptr<bzn::options_base> options;\n        std::shared_ptr<bzn::monitor_base> monitor;\n\n        std::function<void(const boost::asio::ip::tcp::endpoint& ep, const boost::system::error_code&)> error_callback;\n\n        std::shared_ptr<boost::asio::ssl::context> server_ctx;\n        std::shared_ptr<boost::asio::ssl::context> client_ctx;\n\n    };\n\n} // bzn\n"
  },
  {
    "path": "node/node_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <boost/asio.hpp>\n#include <node/session_base.hpp>\n#include <json/json.h>\n#include <proto/bluzelle.pb.h>\n\n\nnamespace bzn\n{\n    class pbft_base;\n\n    class node_base\n    {\n    public:\n        virtual ~node_base() = default;\n\n        /**\n         * Register for a callback to be execute when a certain message type arrives\n         * @param msg_type      message type (crud, pbft etc.)\n         * @param msg_handler   callback\n         * @return true if registration succeeded\n         */\n        virtual bool register_for_message(const bzn_envelope::PayloadCase type, bzn::protobuf_handler msg_handler) = 0;\n\n        /**\n         * Register for a callback to be executed when a connection error occurs\n         * @param ep                endpoint we tried to connect to\n         * @param ec                error that occurred\n         * @param error_callback    callback to invoke\n         */\n        virtual void register_error_handler(std::function<void(const boost::asio::ip::tcp::endpoint& ep, const boost::system::error_code&)> error_callback) = 0;\n\n        /**\n         * Start server's listener etc.\n         */\n        virtual void start(std::shared_ptr<bzn::pbft_base> pbft) = 0;\n\n        /**\n         * Send a raw string message\n         * @param ep            host to send the message to\n         * @param msg           message to send\n         */\n        virtual void send_message_str(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr<bzn::encoded_message> msg) = 0;\n\n        /**\n         * Send a message to a node identified by endpoint. If the sender field is empty or contains our uuid, the message will be\n         * signed before sending. If the sender field contains something else, an existing signature will be kept intact.\n         * @param ep            host to send the message to\n         * @param msg           message to send\n         */\n        virtual void send_signed_message(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr<bzn_envelope> msg) = 0;\n\n        /**\n         * As send_signed_message, but send the same message to multiple recipients. The signature is computed only once\n         * and the whole operation is async.\n         * @param eps           hosts to send the message to\n         * @param msg           message to send\n         */\n        virtual void multicast_signed_message(std::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> eps, std::shared_ptr<bzn_envelope> msg) = 0;\n\n        /**\n         * Send a message to a node identified by uuid. If the sender field is empty or contains our uuid, the message will be\n         * signed before sending. If the sender field contains something else, an existing signature will be kept intact.\n         * @param uuid            host to send the message to\n         * @param msg           message to send\n         */\n        virtual void send_signed_message(const bzn::uuid_t& uuid, std::shared_ptr<bzn_envelope> msg) = 0;\n\n        /**\n         * Send a message to a node identified by endpoint. If the sender field is empty or contains our uuid, the message will be\n         * signed before sending. If the sender field contains something else, an existing signature will be kept intact.\n         * @param ep            host to send the message to\n         * @param msg           message to send\n         */\n        virtual void send_maybe_signed_message(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr<bzn_envelope> msg) = 0;\n\n        /**\n         * As send_signed_message, but send the same message to multiple recipients. The signature is computed only once\n         * and the whole operation is async.\n         * @param eps           hosts to send the message to\n         * @param msg           message to send\n         */\n        virtual void multicast_maybe_signed_message(std::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> eps, std::shared_ptr<bzn_envelope> msg) = 0;\n\n        /**\n         * Send a message to a node identified by uuid. If the sender field is empty or contains our uuid, the message will be\n         * signed before sending. If the sender field contains something else, an existing signature will be kept intact.\n         * @param uuid            host to send the message to\n         * @param msg           message to send\n         */\n        virtual void send_maybe_signed_message(const bzn::uuid_t& uuid, std::shared_ptr<bzn_envelope> msg) = 0;\n\n    };\n\n} // bzn\n"
  },
  {
    "path": "node/session.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <node/session.hpp>\n#include <node/node.hpp>\n#include <sstream>\n#include <boost/beast/websocket/error.hpp>\n\nusing namespace bzn;\n\nsession::session(\n        std::shared_ptr<bzn::asio::io_context_base> io_context,\n        bzn::session_id session_id,\n        boost::asio::ip::tcp::endpoint ep,\n        std::shared_ptr<bzn::chaos_base> chaos,\n        bzn::protobuf_handler proto_handler,\n        std::chrono::milliseconds ws_idle_timeout,\n        std::list<bzn::session_shutdown_handler> shutdown_handlers,\n        std::shared_ptr<bzn::crypto_base> crypto,\n        std::shared_ptr<bzn::monitor_base> monitor,\n        std::shared_ptr<bzn::options_base> options,\n        std::optional<std::shared_ptr<bzn::asio::strand_base>> strand_opt,\n        std::optional<std::shared_ptr<boost::asio::ssl::context>> ctx_opt\n)\n        : session_id(session_id)\n        , ep(std::move(ep))\n        , io_context(std::move(io_context))\n        , chaos(std::move(chaos))\n        , proto_handler(std::move(proto_handler))\n        , shutdown_handlers(std::move(shutdown_handlers))\n        , idle_timer(this->io_context->make_unique_steady_timer())\n        , ws_idle_timeout(std::move(ws_idle_timeout))\n        , write_buffer(nullptr, 0)\n        , crypto(std::move(crypto))\n        , monitor(std::move(monitor))\n        , options(std::move(options))\n        , strand(strand_opt.has_value() ? *strand_opt : this->io_context->make_unique_strand())\n        , ctx(ctx_opt.has_value() ? *ctx_opt : nullptr)\n\n{\n    LOG(debug) << \"creating session \" << std::to_string(session_id);\n}\n\n\nvoid\nsession::start_idle_timeout()\n{\n    this->activity = false;\n\n    this->idle_timer->expires_from_now(this->ws_idle_timeout);\n    this->idle_timer->async_wait(\n        [self = shared_from_this()](auto ec)\n        {\n            if (!self->activity)\n            {\n                LOG(info) << \"Closing session \" << std::to_string(self->session_id) << \" due to inactivity\";\n                self->close();\n                return;\n            }\n\n            if (self->closing || ec)\n            {\n                LOG(debug) << \"Stopping session \" << std::to_string(self->session_id) << \"'s idle timer\";\n                return;\n            }\n\n            self->start_idle_timeout();\n        });\n}\n\n\nvoid\nsession::open(std::shared_ptr<bzn::beast::websocket_base> ws_factory, std::function<void(const boost::system::error_code&)> callback)\n{\n    this->strand->post([self = shared_from_this(), ws_factory, callback]()\n    {\n        std::shared_ptr<bzn::asio::tcp_socket_base> socket = self->io_context->make_unique_tcp_socket(*(self->strand));\n        socket->async_connect(self->ep,\n            self->strand->wrap([self, socket, ws_factory, callback](const boost::system::error_code& ec)\n            {\n                self->activity = true;\n\n                if (ec)\n                {\n                    LOG(error) << \"failed to connect to: \" << self->ep.address().to_string() << \":\" << self->ep.port() << \" - \" << ec.message();\n                    if (callback)\n                    {\n                        callback(ec);\n                    }\n                    return;\n                }\n\n                // we've completed the connect...\n                \n                // set tcp_nodelay option\n                boost::system::error_code option_ec;\n                socket->get_tcp_socket().set_option(boost::asio::ip::tcp::no_delay(true), option_ec);\n                if (option_ec)\n                {\n                    LOG(warning) << \"failed to set socket option TCP_NODELAY: \" << option_ec.message();\n                }\n#ifndef __APPLE__\n                int flags = 1;\n                if (setsockopt(socket->get_tcp_socket().native_handle(), SOL_TCP, TCP_QUICKACK, &flags, sizeof(flags)))\n                {\n                    LOG(warning) << \"failed to set socket option TCP_QUICKACK: \" << errno;\n                }\n#endif\n                // ctx will always be valid if 'use_wss' is true, otherwise we would not of started...\n                self->websocket = (self->options->get_wss_enabled()) ? ws_factory->make_websocket_secure_stream(socket->get_tcp_socket(), *self->ctx) :\n                                  ws_factory->make_websocket_stream(socket->get_tcp_socket());\n\n                self->websocket->async_handshake(self->ep.address().to_string(), \"/\",\n                    self->strand->wrap([self, ws_factory](const boost::system::error_code& ec)\n                    {\n                        self->activity = true;\n\n                        if (ec)\n                        {\n                            LOG(error) << \"handshake failed: \" << ec.message();\n\n                            return;\n                        }\n\n                        self->start_idle_timeout();\n                        self->do_read();\n                        self->do_write();\n                    }));\n            }));\n    });\n}\n\n\nvoid\nsession::accept(std::shared_ptr<bzn::beast::websocket_stream_base> ws)\n{\n    this->strand->post([self = shared_from_this(), ws]()\n    {\n        self->websocket = std::move(ws);\n        self->websocket->async_accept(\n            self->strand->wrap(\n                [self](boost::system::error_code ec)\n                {\n                    self->activity = true;\n\n                    if (ec)\n                    {\n                        LOG(error) << \"websocket accept failed: \" << ec.message();\n                        return;\n                    }\n\n                    self->monitor->send_counter(statistic::session_opened);\n                    self->start_idle_timeout();\n                    self->do_read();\n                    self->do_write();\n                }\n            )\n       );\n   });\n}\n\n\nvoid\nsession::add_shutdown_handler(const bzn::session_shutdown_handler handler)\n{\n    this->strand->post([handler, self = shared_from_this()]()\n    {\n        self->shutdown_handlers.push_back(handler);\n    });\n}\n\n\nvoid\nsession::do_read()\n{\n    // assume we are invoked inside the strand\n\n    auto buffer = std::make_shared<boost::beast::multi_buffer>();\n\n    if (this->reading || !this->is_open() || this->closing)\n    {\n        return;\n    }\n\n    this->reading = true;\n\n    this->websocket->async_read(*buffer,\n        this->strand->wrap([self = shared_from_this(), buffer](boost::system::error_code ec, auto /*bytes_transferred*/)\n        {\n            self->activity = true;\n\n            if(ec)\n            {\n                // don't log close of websocket...\n                if (ec != boost::beast::websocket::error::closed && ec != boost::asio::error::eof)\n                {\n                    LOG(error) << \"websocket read failed: \" << ec.message();\n                }\n                if (ec != boost::beast::websocket::error::closed)\n                {\n                    self->close();\n                }\n                return;\n            }\n\n            // get the message...\n            bzn_envelope proto_msg;\n            std::stringstream ss;\n            ss << boost::beast::make_printable(buffer->data());\n\n            if (proto_msg.ParseFromIstream(&ss))\n            {\n                self->io_context->post(std::bind(self->proto_handler, proto_msg, self));\n            }\n            else\n            {\n                LOG(error) << \"Failed to parse incoming message\";\n            }\n\n            self->reading = false;\n            self->do_read();\n        })\n    );\n}\n\n\nvoid\nsession::do_write()\n{\n    // assume we are invoked inside the strand\n\n    if(this->writing || !this->is_open() || this->write_queue.empty() || this->closing)\n    {\n        return;\n    }\n\n    this->writing = true;\n\n    auto msg = this->write_queue.front();\n    this->write_queue.pop_front();\n\n    this->websocket->binary(true);\n    this->write_buffer = boost::asio::buffer(*msg);\n    this->websocket->async_write(this->write_buffer,\n        this->strand->wrap([self = shared_from_this(), msg](boost::system::error_code ec, auto bytes_transferred)\n        {\n            self->activity = true;\n\n            if (!ec)\n            {\n                self->monitor->send_counter(statistic::message_sent);\n            }\n            self->monitor->send_counter(statistic::message_sent_bytes, bytes_transferred);\n\n            if(ec)\n            {\n                // don't log close of websocket...\n                if (ec != boost::beast::websocket::error::closed && ec != boost::asio::error::eof)\n                {\n                    LOG(error) << \"websocket read failed: \" << ec.message();\n                }\n\n                self->write_queue.push_front(msg);\n                if (ec != boost::beast::websocket::error::closed)\n                {\n                    self->close();\n                }\n                return;\n            }\n\n            self->writing = false;\n            self->do_write();\n        }));\n}\n\n\nvoid\nsession::send_signed_message(std::shared_ptr<bzn_envelope> msg)\n{\n    msg->set_swarm_id(this->options->get_swarm_id());\n    if (msg->signature().empty())\n    {\n        this->crypto->sign(*msg);\n    }\n\n    this->send_message(std::make_shared<std::string>(msg->SerializeAsString()));\n}\n\n\nvoid\nsession::send_message(std::shared_ptr<bzn::encoded_message> msg)\n{\n    if (this->chaos->is_message_delayed())\n    {\n        LOG(debug) << \"chaos testing delaying message\";\n        this->chaos->reschedule_message(std::bind(static_cast<void(session::*)(std::shared_ptr<std::string>l)>(&session::send_message), shared_from_this(), std::move(msg)));\n        return;\n    }\n\n    if (this->chaos->is_message_dropped())\n    {\n        LOG(debug) << \"chaos testing dropping message\";\n        return;\n    }\n\n    this->strand->post([self = shared_from_this(), msg]()\n    {\n        self->write_queue.push_back(msg);\n        self->do_write();\n    });\n}\n\n\nvoid\nsession::close()\n{\n    this->strand->post(std::bind(&session::private_close, shared_from_this()));\n}\n\n\nvoid\nsession::private_close()\n{\n    // assume we are invoked inside the strand\n\n    // TODO: re-open socket later if we still have messages to send? (KEP-1037)\n    if (this->closing)\n    {\n        return;\n    }\n\n    this->closing = true;\n    LOG(debug) << \"closing session \" << std::to_string(this->session_id);\n\n    for(const auto& handler : this->shutdown_handlers)\n    {\n        this->io_context->post(handler);\n    }\n\n    if (this->websocket && this->websocket->is_open())\n    {\n        this->websocket->async_close(boost::beast::websocket::close_code::normal,\n            this->strand->wrap([self = shared_from_this()](auto ec)\n            {\n                if (ec)\n                {\n                    LOG(error) << \"failed to close websocket: \" << ec.message();\n                }\n            }));\n    }\n\n    this->idle_timer->cancel();\n}\n\n\nbool\nsession::is_open() const\n{\n    return this->websocket && this->websocket->is_open() && !this->closing;\n}\n\nbool\nsession::is_closing() const\n{\n    return this->closing;\n}\n\n\nsession::~session()\n{\n    if (!this->write_queue.empty())\n    {\n        LOG(warning) << \"dropping session with \" << this->write_queue.size() << \" messages left in its write queue\";\n    }\n}\n"
  },
  {
    "path": "node/session.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <include/boost_asio_beast.hpp>\n#include <node/node_base.hpp>\n#include <node/session_base.hpp>\n#include <options/options_base.hpp>\n#include <chaos/chaos.hpp>\n#include <memory>\n#include <mutex>\n#include <list>\n#include <atomic>\n#include <optional>\n#include <node/node.hpp>\n\n#include <gtest/gtest_prod.h>\n\n\nnamespace bzn\n{\n    class session final : public bzn::session_base, public std::enable_shared_from_this<session>\n    {\n    public:\n        session(\n                std::shared_ptr<bzn::asio::io_context_base> io_context,\n                bzn::session_id session_id,\n                boost::asio::ip::tcp::endpoint ep,\n                std::shared_ptr<bzn::chaos_base> chaos,\n                bzn::protobuf_handler proto_handler,\n                std::chrono::milliseconds ws_idle_timeout,\n                std::list<bzn::session_shutdown_handler> shutdown_handlers,\n                std::shared_ptr<bzn::crypto_base> crypto,\n                std::shared_ptr<bzn::monitor_base> monitor,\n                std::shared_ptr<bzn::options_base> options,\n                std::optional<std::shared_ptr<bzn::asio::strand_base>> strand,\n                std::optional<std::shared_ptr<boost::asio::ssl::context>> ctx_opt = std::nullopt\n                );\n\n        ~session();\n\n        void send_message(std::shared_ptr<bzn::encoded_message> msg) override;\n        void send_signed_message(std::shared_ptr<bzn_envelope> msg) override;\n\n        void close() override;\n\n        bzn::session_id get_session_id() override { return this->session_id; }\n\n        bool is_open() const override;\n        bool is_closing() const override;\n\n        void open(std::shared_ptr<bzn::beast::websocket_base> ws_factory, std::function<void(const boost::system::error_code&)> callback) override;\n        void accept(std::shared_ptr<bzn::beast::websocket_stream_base> ws) override;\n\n        void add_shutdown_handler(const bzn::session_shutdown_handler handler) override;\n\n\n    private:\n        void do_read();\n        void do_write();\n\n        void start_idle_timeout();\n\n        void private_close();\n\n        const bzn::session_id session_id;\n        const boost::asio::ip::tcp::endpoint ep;\n\n        std::shared_ptr<bzn::asio::io_context_base> io_context;\n        std::shared_ptr<bzn::beast::websocket_stream_base> websocket;\n        std::shared_ptr<bzn::chaos_base> chaos;\n\n        std::list<std::shared_ptr<bzn::encoded_message>> write_queue;\n\n        bzn::protobuf_handler proto_handler;\n        std::list<bzn::session_shutdown_handler> shutdown_handlers;\n\n        std::unique_ptr<bzn::asio::steady_timer_base> idle_timer;\n        const std::chrono::milliseconds ws_idle_timeout;\n\n        std::atomic<bool> writing = false;\n        std::atomic<bool> reading = false;\n        std::atomic<bool> closing = false;\n        std::atomic<bool> activity = false;\n\n        boost::asio::mutable_buffers_1 write_buffer;\n\n        std::shared_ptr<bzn::crypto_base> crypto;\n        std::shared_ptr<bzn::monitor_base> monitor;\n        std::shared_ptr<bzn::options_base> options;\n        \n        std::shared_ptr<bzn::asio::strand_base> strand;\n\n        std::shared_ptr<boost::asio::ssl::context> ctx; // for wss\n    };\n\n} // blz\n"
  },
  {
    "path": "node/session_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <include/bluzelle.hpp>\n#include <proto/bluzelle.pb.h>\n#include <include/boost_asio_beast.hpp>\n\n\nnamespace bzn\n{\n    // forward declare...\n    class session_base;\n\n    using session_shutdown_handler = std::function<void()>;\n    using message_handler = std::function<void(const bzn::json_message& msg, std::shared_ptr<bzn::session_base> session)>;\n    using protobuf_handler = std::function<void(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> session)>;\n\n    class session_base\n    {\n    public:\n        virtual ~session_base() = default;\n\n        /**\n         * Send a raw string to whatever's on the other end of this session\n         * @param msg message\n         */\n        virtual void send_message(std::shared_ptr<bzn::encoded_message> msg) = 0;\n\n        /**\n         * Send a message to whatever's on the other end of this session. If the sender field is empty or contains\n         * our uuid, the message will be signed before sending. If the sender field contains something else,\n         * an existing signature will be kept intact.\n         * @param msg           message to send\n         */\n        virtual void send_signed_message(std::shared_ptr<bzn_envelope> msg) = 0;\n\n        /**\n         * Perform an orderly shutdown of the websocket.\n         */\n        virtual void close() = 0;\n\n        /**\n         * Is the underlying socket open? (subject to race conditions)\n         */\n        virtual bool is_open() const = 0;\n\n        /**\n         * Is the underlying socket in the process of closing? (subject to race conditions)\n         */\n        virtual bool is_closing() const = 0;\n\n        /**\n         * Get the id associated with this session\n         * @return id\n         */\n        virtual bzn::session_id get_session_id() = 0;\n\n        /**\n         * Create a new websocket connection for this session\n         */\n        virtual void open(std::shared_ptr<bzn::beast::websocket_base> ws_factory, std::function<void(const boost::system::error_code&)> callback) = 0;\n\n        /**\n         * Accept an incoming connection on some websocket\n         */\n        virtual void accept(std::shared_ptr<bzn::beast::websocket_stream_base> ws) = 0;\n\n        /**\n         * Add additional shutdown handlers to the session\n         * @param handler\n         */\n        virtual void add_shutdown_handler(bzn::session_shutdown_handler handler) = 0;\n    };\n\n} // bzn\n"
  },
  {
    "path": "node/test/CMakeLists.txt",
    "content": "set(test_srcs node_test.cpp session_test.cpp)\nset(test_libs node proto options crypto smart_mocks ${Protobuf_LIBRARIES})\n\nadd_gmock_test(node)\n"
  },
  {
    "path": "node/test/node_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <node/node.hpp>\n#include <mocks/mock_boost_asio_beast.hpp>\n\n#include <gmock/gmock.h>\n#include <include/bluzelle.hpp>\n#include <mocks/mock_session_base.hpp>\n#include <mocks/mock_chaos_base.hpp>\n#include <mocks/mock_monitor.hpp>\n#include <mocks/smart_mock_io.hpp>\n\n#include <options/options.hpp>\n#include <chaos/chaos.hpp>\n#include <crypto/crypto.hpp>\n\n#include <proto/bluzelle.pb.h>\n#include <proto/pbft.pb.h>\n\n#include <thread>\n#include <chrono>\n\nusing namespace ::testing;\n\nnamespace\n{\n    const auto TEST_ENDPOINT =\n        boost::asio::ip::tcp::endpoint{boost::asio::ip::address_v4::from_string(\"127.0.0.1\"), 0}; // any port\n    const auto TEST_ENDPOINT_2 =\n            boost::asio::ip::tcp::endpoint{boost::asio::ip::address_v4::from_string(\"127.0.0.2\"), 0}; // any port\n}\n\nclass node_test2 : public Test\n{\npublic:\n    std::shared_ptr<bzn::mock_chaos_base> mock_chaos = std::make_shared<NiceMock<bzn::mock_chaos_base>>();\n    std::shared_ptr<bzn::options_base> options = std::make_shared<bzn::options>();\n    std::shared_ptr<bzn::crypto_base> crypto = std::shared_ptr<bzn::crypto>();\n    std::shared_ptr<bzn::mock_monitor> monitor = std::make_shared<NiceMock<bzn::mock_monitor>>();\n    std::shared_ptr<bzn::asio::smart_mock_io> mock_io = std::make_shared<bzn::asio::smart_mock_io>();\n    std::shared_ptr<bzn::node_base> node = std::make_shared<bzn::node>(mock_io, mock_io->websocket, mock_chaos, TEST_ENDPOINT, crypto, options, monitor);\n\n    bzn_envelope db_msg;\n    uint callback_invoked = 0;\n\n    node_test2()\n    {\n        db_msg.set_database_msg(\"hihi\");\n        this->node->register_for_message(bzn_envelope::kDatabaseMsg, [&](auto, auto){callback_invoked++;});\n    }\n\n    ~node_test2()\n    {\n        this->mock_io->shutdown();\n    }\n};\n\nnamespace  bzn\n{\n\n    TEST(node, test_that_node_constructed_with_invalid_address_throws)\n    {\n        auto io_context = std::make_shared<bzn::asio::io_context>();\n        auto mock_chaos = std::make_shared<NiceMock<bzn::mock_chaos_base>>();\n        auto options = std::shared_ptr<bzn::options>();\n        auto crypto = std::shared_ptr<bzn::crypto>();\n        std::shared_ptr<bzn::mock_monitor> monitor = std::make_shared<NiceMock<bzn::mock_monitor>>();\n\n        EXPECT_THROW(\n            bzn::node(io_context, nullptr, mock_chaos,\n                boost::asio::ip::tcp::endpoint{boost::asio::ip::address_v4::from_string(\"8.8.8.8\"), 8080}, crypto, options, monitor),\n            std::exception\n        );\n    }\n\n    TEST_F(node_test2, test_accept_incoming_connection)\n    {\n        this->node->start(nullptr);\n\n        EXPECT_EQ(mock_io->socket_count, 1u);\n\n        mock_io->do_incoming_connection(0);\n        mock_io->ws_read_closures.at(0)(this->db_msg.SerializeAsString());\n        this->mock_io->yield_until_clear();\n        EXPECT_EQ(callback_invoked, 1u);\n    }\n\n    TEST_F(node_test2, test_make_new_connection)\n    {\n        this->node->start(nullptr);\n\n        this->node->send_message_str(TEST_ENDPOINT, std::make_shared<std::string>(\"test string\"));\n\n        this->mock_io->yield_until_clear();\n        EXPECT_EQ(this->mock_io->ws_write_closures.at(1)(), \"test string\");\n    }\n\n    TEST_F(node_test2, test_reuse_connection)\n    {\n        this->node->start(nullptr);\n\n        this->node->send_message_str(TEST_ENDPOINT, std::make_shared<std::string>(\"test string\"));\n        this->mock_io->yield_until_clear();\n        EXPECT_EQ(this->mock_io->ws_write_closures.at(1)(), \"test string\");\n\n        this->node->send_message_str(TEST_ENDPOINT, std::make_shared<std::string>(\"test string2\"));\n        this->mock_io->yield_until_clear();\n        EXPECT_EQ(this->mock_io->ws_write_closures.at(1)(), \"test string2\");\n\n        this->mock_io->yield_until_clear();\n        EXPECT_EQ(mock_io->socket_count, 2u);\n    }\n\n    TEST_F(node_test2, new_session_for_new_ep)\n    {\n        this->node->start(nullptr);\n\n        this->node->send_message_str(TEST_ENDPOINT, std::make_shared<std::string>(\"test A\"));\n        this->mock_io->yield_until_clear();\n        EXPECT_EQ(this->mock_io->ws_write_closures.at(1)(), \"test A\");\n\n        this->node->send_message_str(TEST_ENDPOINT_2, std::make_shared<std::string>(\"test B\"));\n        this->mock_io->yield_until_clear();\n        EXPECT_EQ(this->mock_io->ws_write_closures.at(2)(), \"test B\");\n\n        this->mock_io->yield_until_clear();\n        EXPECT_EQ(mock_io->socket_count, 3u);\n    }\n\n    TEST_F(node_test2, DISABLED_test_replace_dead_session)\n    {\n        this->node->start(nullptr);\n\n        this->node->send_message_str(TEST_ENDPOINT, std::make_shared<std::string>(\"test string\"));\n        this->mock_io->yield_until_clear();\n        EXPECT_EQ(this->mock_io->ws_write_closures.at(1)(), \"test string\");\n\n        // kill connection\n        this->mock_io->socket_is_open[1] = false;\n\n        this->node->send_message_str(TEST_ENDPOINT, std::make_shared<std::string>(\"test string2\"));\n        this->mock_io->yield_until_clear();\n        EXPECT_EQ(this->mock_io->ws_write_closures.at(2)(), \"test string2\");\n\n        this->mock_io->yield_until_clear();\n        EXPECT_EQ(mock_io->socket_count, 3u);\n    }\n\n    TEST(node, test_that_registering_message_handler_can_only_be_done_once)\n    {\n        auto mock_chaos = std::make_shared<NiceMock<bzn::mock_chaos_base>>();\n        auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n        auto options = std::make_shared<bzn::options>();\n        auto crypto = std::shared_ptr<bzn::crypto>();\n        auto monitor = std::make_shared<NiceMock<bzn::mock_monitor>>();\n\n        auto node = std::make_shared<bzn::node>(mock_io_context, nullptr, mock_chaos, TEST_ENDPOINT, crypto, options, monitor);\n\n        // test that nulls are rejected...\n        ASSERT_FALSE(node->register_for_message(bzn_envelope::kDatabaseMsg, nullptr));\n\n        // test that non-null handler is added...\n        ASSERT_TRUE(node->register_for_message(bzn_envelope::kDatabaseMsg, [](const auto&, auto){}));\n\n        // test that we can't overwrite previous registration...\n        ASSERT_FALSE(node->register_for_message(bzn_envelope::kDatabaseMsg, [](const auto&, auto){}));\n    }\n\n    TEST(node, test_that_node_doesnt_call_error_handler_on_successful_connect)\n    {\n        std::shared_ptr<bzn::mock_chaos_base> mock_chaos = std::make_shared<NiceMock<bzn::mock_chaos_base>>();\n        std::shared_ptr<bzn::options_base> options = std::make_shared<bzn::options>();\n        std::shared_ptr<bzn::crypto_base> crypto = std::shared_ptr<bzn::crypto>();\n        std::shared_ptr<bzn::mock_monitor> monitor = std::make_shared<NiceMock<bzn::mock_monitor>>();\n        std::shared_ptr<bzn::asio::smart_mock_io> mock_io = std::make_shared<bzn::asio::smart_mock_io>();\n        std::shared_ptr<bzn::node_base> node = std::make_shared<bzn::node>(mock_io, mock_io->websocket, mock_chaos, TEST_ENDPOINT, crypto, options, monitor);\n\n        bool called{false};\n        node->register_error_handler([&called](auto &/*ep*/, auto& ec)\n        {\n            ASSERT_NE(ec, boost::system::error_code{});\n            called = true;\n        });\n\n        node->send_message_str(TEST_ENDPOINT_2, std::make_shared<std::string>(\"test string\"));\n        mock_io->yield_until_clear();\n        ASSERT_EQ(called, false);\n        mock_io->shutdown();\n    }\n\n    TEST(node, test_that_node_calls_error_handler_on_no_connect)\n    {\n        std::shared_ptr<bzn::mock_chaos_base> mock_chaos = std::make_shared<NiceMock<bzn::mock_chaos_base>>();\n        std::shared_ptr<bzn::options_base> options = std::make_shared<bzn::options>();\n        std::shared_ptr<bzn::crypto_base> crypto = std::shared_ptr<bzn::crypto>();\n        std::shared_ptr<bzn::mock_monitor> monitor = std::make_shared<NiceMock<bzn::mock_monitor>>();\n        std::shared_ptr<bzn::asio::smart_mock_io> mock_io = std::make_shared<bzn::asio::smart_mock_io>();\n        std::shared_ptr<bzn::node_base> node = std::make_shared<bzn::node>(mock_io, mock_io->websocket, mock_chaos, TEST_ENDPOINT, crypto, options, monitor);\n\n        bool called{false};\n        node->register_error_handler([&called](auto &/*ep*/, auto& ec)\n        {\n            ASSERT_NE(ec, boost::system::error_code{});\n            called = true;\n        });\n\n        mock_io->tcp_connect_works = false;\n        node->send_message_str(TEST_ENDPOINT_2, std::make_shared<std::string>(\"test string\"));\n        mock_io->yield_until_clear();\n        ASSERT_EQ(called, true);\n        mock_io->shutdown();\n    }\n\n#if 0\n    TEST(node, test_that_wrongly_signed_messages_are_dropped)\n    {\n        auto mock_chaos = std::make_shared<NiceMock<bzn::mock_chaos_base>>();\n        auto mock_io_context = std::make_shared<NiceMock<bzn::asio::mock_io_context_base>>();\n        auto options = std::make_shared<bzn::options>();\n        options->get_mutable_simple_options().set(bzn::option_names::CRYPTO_ENABLED_INCOMING, \"true\");\n        auto monitor = std::make_shared<NiceMock<bzn::mock_monitor>>();\n        auto crypto = std::make_shared<bzn::crypto>(options, monitor);\n        auto mock_session = std::make_shared<bzn::mock_session_base>();\n        auto node = std::make_shared<bzn::node>(mock_io_context, nullptr, mock_chaos, TEST_ENDPOINT, crypto, options, monitor);\n\n        // Add our test callback...\n        unsigned int callback_execute = 0u;\n        node->register_for_message(bzn_envelope::kPbft, [&](const auto& /*msg*/, auto)\n        {\n            callback_execute++;\n        });\n\n        bzn_envelope bad_msg;\n        bad_msg.set_pbft(\"some stuff\");\n        bad_msg.set_sender(\"Elizabeth the Second, by the Grace of God of the United Kingdom, Canada and Her other Realms and Territories Queen, Head of the Commonwealth, Defender of the Faith\");\n        bad_msg.set_signature(\"probably not a valid signature\");\n\n        bzn_envelope anon_msg;\n        anon_msg.set_pbft(\"some stuff\");\n        anon_msg.set_sender(\"\");\n        anon_msg.set_signature(\"\");\n\n        node->priv_protobuf_handler(bad_msg, mock_session);\n        EXPECT_EQ(callback_execute, 0u);\n\n        node->priv_protobuf_handler(anon_msg, mock_session);\n        EXPECT_EQ(callback_execute, 1u);\n    }\n#endif\n} // namespace bzn\n"
  },
  {
    "path": "node/test/session_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <node/session.hpp>\n#include <options/options.hpp>\n#include <mocks/mock_boost_asio_beast.hpp>\n#include <boost/asio/buffer.hpp>\n#include <mocks/mock_chaos_base.hpp>\n#include <mocks/smart_mock_io.hpp>\n#include <mocks/mock_monitor.hpp>\n#include <mocks/mock_crypto_base.hpp>\n#include <functional>\n\n#include <gmock/gmock.h>\n#include <proto/bluzelle.pb.h>\n\n#include <list>\n\nusing namespace ::testing;\n\nnamespace\n{\n    const auto TEST_ENDPOINT =\n            boost::asio::ip::tcp::endpoint{boost::asio::ip::address_v4::from_string(\"127.0.0.1\"), 0}; // any port\n    const auto TEST_TIMEOUT = std::chrono::milliseconds(10000);\n\n}\n\nclass session_test : public Test\n{\npublic:\n    std::shared_ptr<bzn::asio::mock_io_context_base> io_context = std::make_shared<bzn::asio::mock_io_context_base>();\n    std::shared_ptr<bzn::mock_chaos_base> mock_chaos = std::make_shared<NiceMock<bzn::mock_chaos_base>>();\n    std::shared_ptr<bzn::mock_monitor> monitor = std::make_shared<NiceMock<bzn::mock_monitor>>();\n\n    bzn::asio::wait_handler timer_expiry;\n\n    session_test()\n    {\n        EXPECT_CALL(*(this->io_context), make_unique_steady_timer()).WillRepeatedly(Invoke(\n                [&]()\n                {\n                    auto timer = std::make_unique<bzn::asio::mock_steady_timer_base>();\n                    EXPECT_CALL(*timer, async_wait(_)).WillRepeatedly(Invoke(\n                            [&](auto wh)\n                            {\n                                this->timer_expiry = wh;\n                            }));\n                    EXPECT_CALL(*timer, expires_from_now(_)).Times(AnyNumber());\n                    return timer;\n                }));\n\n        EXPECT_CALL(*(this->io_context), make_unique_strand()).WillRepeatedly(Invoke(\n                []()\n                {\n                    auto strand = std::make_unique<bzn::asio::mock_strand_base>();\n                    EXPECT_CALL(*strand, wrap(A<bzn::asio::close_handler>())).WillRepeatedly(ReturnArg<0>());\n                    EXPECT_CALL(*strand, wrap(A<bzn::asio::read_handler>())).WillRepeatedly(ReturnArg<0>());\n                    EXPECT_CALL(*strand, wrap(A<bzn::asio::task>())).WillRepeatedly(ReturnArg<0>());\n                    EXPECT_CALL(*strand, post(A<bzn::asio::task>())).WillRepeatedly(Invoke(\n                            [](auto task)\n                            {\n                                task();\n                            }));\n                    return strand;\n                }));\n\n        EXPECT_CALL(*(this->io_context), post(_)).WillRepeatedly(Invoke(\n                [](auto task)\n                {\n                    task();\n                }));\n    }\n};\n\nclass session_test2 : public Test\n{\npublic:\n    std::shared_ptr<bzn::asio::smart_mock_io> mock_io = std::make_shared<bzn::asio::smart_mock_io>();\n    std::shared_ptr<bzn::mock_chaos_base> mock_chaos = std::make_shared<NiceMock<bzn::mock_chaos_base>>();\n    std::shared_ptr<bzn::mock_monitor> monitor = std::make_shared<NiceMock<bzn::mock_monitor>>();\n    std::shared_ptr<bzn::mock_crypto_base> mock_crypto = std::make_shared<NiceMock<bzn::mock_crypto_base>>();\n    std::shared_ptr<bzn::options> options = std::make_shared<bzn::options>();\n\n\n    uint handler_called = 0;\n    std::shared_ptr<bzn::session> session;\n\n    session_test2()\n    {\n        session = std::make_shared<bzn::session>(this->mock_io, 0, TEST_ENDPOINT, this->mock_chaos, [&](auto, auto){this->handler_called++;}, TEST_TIMEOUT, std::list<bzn::session_shutdown_handler>{[](){}}, this->mock_crypto, this->monitor, this->options, std::nullopt);\n    }\n\n    void yield()\n    {\n        // For making sure that async callbacks get a chance to be executed before we assert their result\n        std::this_thread::sleep_for(std::chrono::milliseconds(10));\n    }\n\n    ~session_test2()\n    {\n        this->mock_io->shutdown();\n    }\n};\n\nnamespace bzn\n{\n\n    TEST_F(session_test, test_that_when_session_starts_it_accepts_and_read_is_scheduled)\n    {\n        auto mock_websocket_stream = std::make_shared<bzn::beast::mock_websocket_stream_base>();\n        EXPECT_CALL(*mock_websocket_stream, is_open()).WillRepeatedly(Return(true));\n\n        bzn::asio::accept_handler accept_handler;\n        EXPECT_CALL(*mock_websocket_stream, async_accept(_)).WillRepeatedly(Invoke(\n                [&](auto handler)\n                {\n                    accept_handler = handler;\n                }));\n\n        EXPECT_CALL(*mock_websocket_stream, async_read(_,_));\n\n        auto session = std::make_shared<bzn::session>(this->io_context, bzn::session_id(1), TEST_ENDPOINT, this->mock_chaos, [](auto, auto){}, TEST_TIMEOUT, std::list<bzn::session_shutdown_handler>{[](){}}, nullptr, this->monitor, nullptr, std::nullopt);\n        session->accept(mock_websocket_stream);\n        accept_handler(boost::system::error_code{});\n\n        EXPECT_EQ(bzn::session_id(1), session->get_session_id());\n    }\n\n    TEST_F(session_test2, session_sets_swarm_id_when_sending_a_message)\n    {\n        const bzn::uuid_t TEST_SWARM_UUID{\"0096a9f1-544c-443f-9783-e54b322c1544\"};\n        this->options->get_mutable_simple_options().set(\"swarm_id\", TEST_SWARM_UUID);\n\n        auto msg{std::make_shared<bzn_envelope>()};\n\n        this->session->send_signed_message(msg);\n        this->yield();\n\n        EXPECT_EQ(TEST_SWARM_UUID, msg->swarm_id());\n    }\n\n    TEST_F(session_test2, message_queued_before_handshake_gets_sent)\n    {\n        this->session->send_message(std::make_shared<std::string>(\"hihi\"));\n\n        this->session->accept(this->mock_io->websocket->make_websocket_stream(\n                                this->mock_io->make_unique_tcp_socket()->get_tcp_socket()));\n        this->yield();\n        this->mock_io->ws_accept_handlers.at(0)(boost::system::error_code{});\n\n        this->yield();\n\n        EXPECT_EQ(this->mock_io->ws_write_closures.at(0)(), \"hihi\");\n    }\n\n    TEST_F(session_test2, idle_timeout_closes_session)\n    {\n        this->session->accept(this->mock_io->websocket->make_websocket_stream(\n                                this->mock_io->make_unique_tcp_socket()->get_tcp_socket()));\n        this->yield();\n        this->mock_io->ws_accept_handlers.at(0)(boost::system::error_code{});\n\n        this->mock_io->timer_callbacks.at(0)(boost::system::error_code{});\n        this->yield();\n        this->mock_io->timer_callbacks.at(0)(boost::system::error_code{});\n        this->yield();\n\n        EXPECT_TRUE(this->mock_io->ws_closed.at(0));\n    }\n\n    TEST_F(session_test2, no_idle_timeout_when_connect_rejected)\n    {\n        auto io2 = std::make_shared<bzn::asio::smart_mock_io>();\n        io2->tcp_connect_works = false;\n\n        auto session = std::make_shared<bzn::session>(io2, 0, TEST_ENDPOINT, this->mock_chaos, [](auto, auto){}, TEST_TIMEOUT, std::list<bzn::session_shutdown_handler>{[](){}}, nullptr, this->monitor, nullptr, std::nullopt);\n        session->open(io2->websocket, nullptr);\n\n        this->yield();\n\n        EXPECT_EQ(io2->timer_callbacks.size(), 0u);\n        io2->shutdown();\n    }\n\n    TEST_F(session_test2, additional_shutdown_handlers_can_be_added_to_session)\n    {\n        auto io2 = std::make_shared<bzn::asio::smart_mock_io>();\n\n        std::vector<uint8_t> handler_counters { 0,0,0 };\n        {\n            auto options = std::make_shared<bzn::options>();\n\n            auto session = std::make_shared<bzn::session>(io2\n                    , 0, TEST_ENDPOINT, this->mock_chaos, [](auto, auto){}, TEST_TIMEOUT\n                    , std::list<bzn::session_shutdown_handler>{[&handler_counters]() {\n                        ++handler_counters[0];\n                    }}, nullptr, this->monitor, options, std::nullopt);\n\n            session->add_shutdown_handler([&handler_counters](){++handler_counters[1];});\n            session->add_shutdown_handler([&handler_counters](){++handler_counters[2];});\n\n            session->open(io2->websocket, nullptr);\n\n            io2->yield_until_clear();\n\n            // we are just testing that this doesn't cause a segfault\n            io2->timer_callbacks.at(0)(boost::system::error_code{});\n            io2->timer_callbacks.at(0)(boost::system::error_code{});\n\n        }\n\n        io2->yield_until_clear();\n\n        // each shutdown handler must be called exactly once.\n        for(const auto handler_counter : handler_counters)\n        {\n            EXPECT_EQ(handler_counter, 1);\n        }\n        io2->shutdown();\n    }\n\n} // bzn\n"
  },
  {
    "path": "options/CMakeLists.txt",
    "content": "add_library(options STATIC\n        ../include/bluzelle.hpp\n        options.cpp\n        options.hpp\n        options_base.hpp\n        simple_options.cpp\n        simple_options.hpp\n        )\n\ntarget_link_libraries(options utils)\ntarget_include_directories(options PRIVATE ${BLUZELLE_STD_INCLUDES})\nadd_dependencies(options boost jsoncpp)\n\nadd_subdirectory(test)\n"
  },
  {
    "path": "options/options.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <options/options.hpp>\n#include <boost/lexical_cast.hpp>\n#include <regex>\n#include <cstdint>\n#include <utils/crypto.hpp>\n#include <utils/make_endpoint.hpp>\n#include <chrono>\n\nusing namespace bzn;\nusing namespace bzn::option_names;\n\nbool\noptions::parse_command_line(int argc, const char* argv[])\n{\n    return this->raw_opts.parse(argc, argv);\n}\n\nconst simple_options&\noptions::get_simple_options() const\n{\n    return this->raw_opts;\n}\n\nsimple_options&\noptions::get_mutable_simple_options()\n{\n    return this->raw_opts;\n}\n\nboost::asio::ip::tcp::endpoint\noptions::get_listener() const\n{\n    try\n    {\n        if (auto ep = bzn::make_endpoint(this->raw_opts.get<std::string>(LISTENER_ADDRESS),\n            std::to_string(this->raw_opts.get<uint16_t>(LISTENER_PORT))))\n        {\n            return *ep;\n        }\n        else\n        {\n            throw std::runtime_error(std::string(\"\\nCould not create listener -- resolver error\"));\n        }\n    }\n    catch (std::exception& ex)\n    {\n        throw std::runtime_error(std::string(\"\\nCould not create listener: \") + ex.what());\n    }\n}\n\n\nstd::optional<boost::asio::ip::udp::endpoint>\noptions::get_monitor_endpoint(std::shared_ptr<bzn::asio::io_context_base> context) const\n{\n    if (this->raw_opts.has(MONITOR_PORT) && this->raw_opts.has(MONITOR_ADDRESS))\n    {\n        try\n        {\n            boost::asio::ip::udp::resolver resolver(context->get_io_context());\n            auto eps = resolver.resolve(boost::asio::ip::udp::v4(),\n                                        this->raw_opts.get<std::string>(MONITOR_ADDRESS),\n                                        std::to_string(this->raw_opts.get<uint16_t>(MONITOR_PORT)));\n\n            return std::optional<boost::asio::ip::udp::endpoint>{*eps.begin()};\n        }\n        catch (std::exception& ex)\n        {\n            throw std::runtime_error(std::string(\"\\nCould not create monitor endpoint: \") + ex.what());\n        }\n\n    }\n    else\n    {\n        return std::optional<boost::asio::ip::udp::endpoint>{};\n    }\n}\n\n\nstd::string\noptions::get_bootstrap_peers_file() const\n{\n    //TODO: Remove this\n    return this->raw_opts.get<std::string>(BOOTSTRAP_PEERS_FILE);\n}\n\n\nstd::string\noptions::get_bootstrap_peers_url() const\n{\n    //TODO: Remove this\n    return this->raw_opts.get<std::string>(BOOTSTRAP_PEERS_URL);\n}\n\nbzn::uuid_t\noptions::get_uuid() const\n{\n    if (this->raw_opts.has(NODE_UUID))\n    {\n        return this->raw_opts.get<std::string>(NODE_UUID);\n    }\n\n    static std::string my_uuid{};\n    if (my_uuid.empty())\n    {\n        std::string pubkey_raw = bzn::utils::crypto::read_pem_file(this->raw_opts.get<std::string>(NODE_PUBKEY_FILE)\n            , \"PUBLIC KEY\");\n        my_uuid = boost::beast::detail::base64_encode(pubkey_raw);\n    }\n\n    return my_uuid;\n}\n\nbzn::swarm_id_t\noptions::get_swarm_id() const\n{\n    return this->raw_opts.get<std::string>(SWARM_ID);\n}\n\nbool\noptions::get_debug_logging() const\n{\n    //TODO: Remove this\n    return this->raw_opts.get<bool>(DEBUG_LOGGING);\n}\n\n\nbool\noptions::get_log_to_stdout() const\n{\n    //TODO: Remove this\n    return this->raw_opts.get<bool>(LOG_TO_STDOUT);\n}\n\n\nstd::chrono::milliseconds\noptions::get_ws_idle_timeout() const\n{\n    //TODO: Remove this?\n    return std::chrono::milliseconds(raw_opts.get<uint64_t>(WS_IDLE_TIMEOUT));\n}\n\n\nsize_t\noptions::get_audit_mem_size() const\n{\n    //TODO: Remove this\n    return this->raw_opts.get<size_t>(AUDIT_MEM_SIZE);\n}\n\n\nstd::string\noptions::get_state_dir() const\n{\n    //TODO: Remove this\n    return this->raw_opts.get<std::string>(STATE_DIR);\n}\n\n\nstd::string\noptions::get_logfile_dir() const\n{\n    //TODO: Remove this\n    return this->raw_opts.get<std::string>(LOGFILE_DIR);\n}\n\n\nsize_t\noptions::get_max_swarm_storage() const\n{\n    return this->parse_size(this->raw_opts.get<std::string>(MAX_SWARM_STORAGE));\n}\n\n\nbool\noptions::get_mem_storage() const\n{\n    return this->raw_opts.get<bool>(MEM_STORAGE);\n}\n\n\nsize_t\noptions::get_logfile_rotation_size() const\n{\n    return this->parse_size(this->raw_opts.get<std::string>(LOGFILE_ROTATION_SIZE));\n}\n\n\nsize_t\noptions::get_logfile_max_size() const\n{\n    return this->parse_size(this->raw_opts.get<std::string>(LOGFILE_MAX_SIZE));\n}\n\n\nsize_t\noptions::parse_size(const std::string& max_value) const\n{\n    const std::regex expr{\"(\\\\d+)([K,M,G,T]?[B]?)\"};\n\n    std::smatch base_match;\n    if (std::regex_match(max_value, base_match, expr))\n    {\n        std::string suffix = base_match[2];\n\n        return boost::lexical_cast<size_t>(base_match[1])\n               * utils::BYTE_SUFFIXES.at(suffix.empty() ? 'B' : suffix[0]);\n    }\n\n    throw std::runtime_error(std::string(\"\\nUnable to parse size value from options: \" + max_value));\n}\n\n\nbool \noptions::peer_validation_enabled() const\n{\n    //TODO: Remove this\n    return this->raw_opts.get<bool>(PEER_VALIDATION_ENABLED);\n}\n\n\nstd::string\noptions::get_signed_key() const\n{\n    return this->raw_opts.get<std::string>(SIGNED_KEY);\n}\n\n\nstd::string\noptions::get_owner_public_key() const\n{\n    return this->raw_opts.has(OWNER_PUBLIC_KEY) ? this->raw_opts.get<std::string>(OWNER_PUBLIC_KEY) : \"\";\n}\n\n\nstd::string\noptions::get_swarm_info_esr_address() const\n{\n    return this->raw_opts.get<std::string>(SWARM_INFO_ESR_ADDRESS);\n}\n\n\nstd::string\noptions::get_swarm_info_esr_url() const\n{\n    return this->raw_opts.get<std::string>(SWARM_INFO_ESR_URL);\n}\n\n\nstd::string\noptions::get_stack() const\n{\n    return this->raw_opts.get<std::string>(STACK);\n}\n\n\nbool\noptions::get_wss_enabled() const\n{\n    return this->raw_opts.get<bool>(WSS_ENABLED);\n}\n\n\nstd::string\noptions::get_wss_server_certificate_file() const\n{\n    return this->raw_opts.get<std::string>(WSS_SERVER_CERTIFICATE_FILE);\n}\n\n\nstd::string\noptions::get_wss_server_private_key_file() const\n{\n    return this->raw_opts.get<std::string>(WSS_SERVER_PRIVATE_KEY_FILE);\n}\n\n\nstd::string\noptions::get_wss_server_dh_params_file() const\n{\n    return this->raw_opts.get<std::string>(WSS_SERVER_DH_PARAMS_FILE);\n}\n\nsize_t\noptions::get_admission_window() const\n{\n    return this->raw_opts.get<size_t>(ADMISSION_WINDOW);\n}\n\nbool\noptions::get_peer_message_signing() const\n{\n    return this->raw_opts.get<bool>(PEER_MESSAGE_SIGNING);\n}"
  },
  {
    "path": "options/options.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <options/options_base.hpp>\n#include <json/json.h>\n\n\nnamespace bzn\n{\n    class options final : public bzn::options_base\n    {\n    public:\n        const simple_options& get_simple_options() const override;\n\n        simple_options& get_mutable_simple_options() override;\n\n        bool parse_command_line(int argc, const char* argv[]);\n\n        boost::asio::ip::tcp::endpoint get_listener() const override;\n\n        std::optional<boost::asio::ip::udp::endpoint> get_monitor_endpoint(std::shared_ptr<bzn::asio::io_context_base> context) const override;\n\n        std::string get_bootstrap_peers_file() const override;\n\n        std::string get_bootstrap_peers_url() const override;\n\n        bool get_debug_logging() const override;\n\n        bool get_log_to_stdout() const override;\n\n        bzn::uuid_t get_uuid() const override;\n\n        bzn::swarm_id_t get_swarm_id() const override;\n\n        std::chrono::milliseconds get_ws_idle_timeout() const override;\n\n        size_t get_audit_mem_size() const override;\n\n        std::string get_state_dir() const override;\n\n        std::string get_logfile_dir() const override;\n\n        size_t get_max_swarm_storage() const override;\n\n        bool get_mem_storage() const override;\n\n        size_t get_logfile_rotation_size() const override ;\n\n        size_t get_logfile_max_size() const override;\n\n        bool peer_validation_enabled() const override;\n\n        std::string get_signed_key() const override;\n\n        std::string get_owner_public_key() const override;\n\n        std::string get_swarm_info_esr_address() const override;\n\n        std::string get_swarm_info_esr_url() const override;\n\n        std::string get_stack() const override;\n\n        bool get_wss_enabled() const override;\n\n        std::string get_wss_server_certificate_file() const override;\n\n        std::string get_wss_server_private_key_file() const override;\n\n        std::string get_wss_server_dh_params_file() const override;\n\n\n        size_t get_admission_window() const override;\n\n        bool get_peer_message_signing() const override;\n\n    private:\n        size_t parse_size(const std::string& key) const;\n\n        simple_options raw_opts;\n\n    };\n\n} // bzn\n"
  },
  {
    "path": "options/options_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <boost/asio/ip/tcp.hpp>\n#include <boost/asio/ip/udp.hpp>\n#include <include/bluzelle.hpp>\n#include <include/boost_asio_beast.hpp>\n#include <options/simple_options.hpp>\n#include <string>\n#include <map>\n#include <optional>\n#include <chrono>\n\n\nnamespace bzn\n{\n    // Suffixes for the max size parser.\n    namespace utils\n    {\n        const std::map<char, size_t> BYTE_SUFFIXES = std::map<char, size_t>({{'B', 1},\n                                                                             {'K', 1024},\n                                                                             {'M', 1048576},\n                                                                             {'G', 1073741824},\n                                                                             {'T', 1099511627776}});\n    }\n\n    class options_base\n    {\n    public:\n        virtual ~options_base() = default;\n\n        /**\n         * @return the raw_options container for accessing simple options\n         */\n        virtual const simple_options& get_simple_options() const = 0;\n\n\n        /**\n         * @return the raw_options container for accessing simple options\n         */\n        virtual simple_options& get_mutable_simple_options() = 0;\n\n\n        /**\n         * Get the address and port for the node to listen on\n         * @return endpoint\n         */\n        virtual boost::asio::ip::tcp::endpoint get_listener() const = 0;\n\n\n        /**\n         * The address and port to send stats.d data to, if this is enabled\n         * @return optional<endpoint>\n         */\n        virtual std::optional<boost::asio::ip::udp::endpoint> get_monitor_endpoint(\n            std::shared_ptr<bzn::asio::io_context_base> context) const = 0;\n\n\n        /**\n         * Get the url to fetch initial peers from\n         * @return url\n         */\n        virtual std::string get_bootstrap_peers_url() const = 0;\n\n\n        /**\n         * Get the file to fetch initial peers from\n         * @return filename\n         */\n        virtual std::string get_bootstrap_peers_file() const = 0;\n\n\n        /**\n         * Debug logging level?\n         * @return true if we should log debug entries\n         */\n        virtual bool get_debug_logging() const = 0;\n\n\n        /**\n         * Log to terminal instead of disk.\n         * @return true if we log to stdout\n         */\n        virtual bool get_log_to_stdout() const = 0;\n\n\n        /**\n         * Get the peer's unique id\n         * @return uuid\n         */\n        virtual bzn::uuid_t get_uuid() const = 0;\n\n\n        /**\n         * Get the swarm id this peer belongs to\n         * @return swarm_id\n         */\n        virtual bzn::swarm_id_t get_swarm_id() const = 0;\n\n\n        /**\n         * Get the websocket activity timeout\n         * @return seconds\n         */\n        virtual std::chrono::milliseconds get_ws_idle_timeout() const = 0;\n\n\n        /**\n         * Get the number of entries allowed to be stored in audit's datastructures\n         * @return size\n         */\n        virtual size_t get_audit_mem_size() const = 0;\n\n\n        /**\n         * Get the directory for storing swarm state data\n         * @return directory\n         */\n        virtual std::string get_state_dir() const = 0;\n\n\n        /**\n         * Get the director to log into\n         * @return directory\n         */\n        virtual std::string get_logfile_dir() const = 0;\n\n\n        /**\n         * Get the maximum allowed storage for the daemon.\n         * @return size\n         */\n        virtual size_t get_max_swarm_storage() const = 0;\n\n\n        /**\n         * Database to use\n         * @return true if we are using in memory data\n         */\n        virtual bool get_mem_storage() const = 0;\n\n\n        /**\n         * Get the size of a log file to rotate\n         * @return size\n         */\n        virtual size_t get_logfile_rotation_size() const = 0;\n\n\n        /**\n         * Get the total size of logs before deletion\n         * @return size\n         */\n        virtual size_t get_logfile_max_size() const = 0;\n\n\n         /**\n          * Temporary toggle for the peer validation while in QA. Defaults to false.\n          * @return boolean if the peer_validation member is set to true. Default is false.\n          */\n         virtual bool peer_validation_enabled() const = 0;\n\n\n        /**\n         * Signature for uuid signing verification\n         * @return string containing the signature\n         */\n        virtual std::string get_signed_key() const = 0;\n\n\n        /**\n         * Retrieve the path to the Bluzelle public key pem file\n         * @return string containing the path to the Bluzelle publi key pem file\n         */\n        virtual std::string get_owner_public_key() const = 0;\n\n\n        /**\n         * Retrieve the address of the ESR where the contract to return the swarm info is\n         * @return string containing the address of the swarm info contract\n         */\n        virtual std::string get_swarm_info_esr_address() const = 0;\n\n\n        /**\n         * Retrieve the url of the server where the ESR is served\n         * @return string containing the url of the server\n         */\n        virtual std::string get_swarm_info_esr_url() const = 0;\n\n\n        /**\n         * Retrieve the name of the stack the swarm is using\n         * @return string stack name\n         */\n        virtual std::string get_stack() const = 0;\n\n\n        /**\n         * Retrieve if we should be using tls or not\n         * @return true if ssl should be used\n         */\n        virtual bool get_wss_enabled() const = 0;\n\n\n        /**\n         *\n         * @return certificate file\n         */\n        virtual std::string get_wss_server_certificate_file() const = 0;\n\n\n        /**\n         *\n         * @return private key file\n         */\n        virtual std::string get_wss_server_private_key_file() const = 0;\n\n\n        /**\n         *\n         * @return dh params file\n         */\n        virtual std::string get_wss_server_dh_params_file() const = 0;\n\n\n        // todo: enable/disable peer validation\n\n\n        /**\n         * Get the number of entries allowed to be stored in audit's datastructures\n         * @return size\n         */\n        virtual size_t get_admission_window() const = 0;\n\n        /**\n         * Get whether we should sign/verify messages to peers\n         * @return true/false\n         */\n        virtual bool get_peer_message_signing() const = 0;\n    };\n} // bzn\n"
  },
  {
    "path": "options/simple_options.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <include/bluzelle.hpp>\n#include <options/simple_options.hpp>\n#include <json/json.h>\n#include <swarm_git_commit.hpp>\n#include <boost/algorithm/string.hpp>\n#include <boost/predef.h>\n#include <iostream>\n#include <fstream>\n\nusing namespace bzn;\nusing namespace bzn::option_names;\nnamespace po = boost::program_options;\n\nnamespace\n{\n    const std::string DEFAULT_CONFIG_FILE = \"bluzelle.json\";\n}\n\nsimple_options::simple_options()\n        : options_root(\"Core configuration\")\n        , cmd_opts(&(this->options_root))\n        , config_file_opts(&(this->options_root))\n{\n    this->build_options();\n}\n\nbool\nsimple_options::parse(int argc, const char* argv[])\n{\n    return this->handle_command_line_options(argc, argv) && this->handle_config_file_options() && this->combine_options() && this->validate_options();\n}\n\nvoid\nsimple_options::build_options()\n{\n    po::options_description cmd_only(\"Command line only\");\n    cmd_only.add_options()\n                    (\"help,h\", \"Shows this information\")\n                    (\"version,v\", \"Shows the application's version\")\n                    (\"config,c\", po::value<std::string>()->default_value(DEFAULT_CONFIG_FILE), \"Path to configuration file\");\n    this->options_root.add(cmd_only);\n\n    this->options_root.add_options()\n                (BOOTSTRAP_PEERS_FILE.c_str(),\n                        po::value<std::string>(),\n                        \"file path for bootstrap peers list\")\n                (BOOTSTRAP_PEERS_URL.c_str(),\n                        po::value<std::string>(),\n                        \"url for bootstrap peers list\")\n                (CPR_URL.c_str(),\n                        po::value<std::string>()->default_value(\"https://cpr.bluzelle.com/api/v1\"),\n                        \"api root for centralized peers registry\")\n                (PEERS_REFRESH_INTERVAL_SECONDS.c_str(),\n                        po::value<uint64_t>()->default_value(600),\n                        \"interval at which to check for updates to the peers list\")\n                (LISTENER_ADDRESS.c_str(),\n                        po::value<std::string>()->required(),\n                        \"listener address for consensus node\")\n                (LISTENER_PORT.c_str(),\n                        po::value<uint16_t>()->required(),\n                        \"port for consensus node\")\n                (MAX_SWARM_STORAGE.c_str(),\n                         po::value<std::string>()->default_value(\"0\"),\n                        \"maximum db storage (bytes) in the swarm (default value of zero indicates no limit)\")\n                (MEM_STORAGE.c_str(),\n                         po::value<bool>()->default_value(true),\n                         \"enable in memory storage for debugging\")\n                (NODE_UUID.c_str(),\n                        po::value<std::string>(),\n                        \"uuid of this node\")\n                (SWARM_ID.c_str(),\n                        po::value<std::string>()->required(),\n                        \"swarm id of this node\")\n                (STATE_DIR.c_str(),\n                        po::value<std::string>()->default_value(\"./.state/\"),\n                        \"location for state files\")\n                (OVERRIDE_NUM_THREADS.c_str(),\n                        po::value<size_t>(),\n                        \"number of worker threads to run (default is automatic based on hardware\")\n                (WS_IDLE_TIMEOUT.c_str(),\n                        po::value<uint64_t>()->default_value(300000),\n                        \"websocket idle timeout (ms)\")\n                (SWARM_INFO_ESR_ADDRESS.c_str(),\n                        po::value<std::string>()->default_value(bzn::utils::DEFAULT_SWARM_INFO_ESR_ADDRESS),\n                        \"Address of ESR Swarm Info contract\")\n                (SWARM_INFO_ESR_URL.c_str(),\n                        po::value<std::string>()->default_value(bzn::utils::ROPSTEN_URL),\n                        \"url of ESR Swarm Info contract server\")\n                (IGNORE_ESR.c_str(),\n                        po::value<bool>()->default_value(false),\n                        \"do not use esr as a peer source\")\n                (IGNORE_CPR.c_str(),\n                        po::value<bool>()->default_value(false),\n                        \"do not use cpr as a peer source\")\n                (STACK.c_str(),\n                        po::value<std::string>()->required(),\n                        \"software stack used by swarm\")\n                (ADMISSION_WINDOW.c_str(),\n                    po::value<size_t>()->default_value(500),\n                    \"admission control request window\")\n                (PEER_MESSAGE_SIGNING.c_str(),\n                    po::value<bool>()->default_value(false),\n                    \"should peer messages be signed/verified\");\n\n    po::options_description logging(\"Logging\");\n    logging.add_options()\n                (LOG_TO_STDOUT.c_str(),\n                        po::value<bool>()->default_value(false),\n                        \"log to stdout\")\n                (LOGFILE_DIR.c_str(),\n                        po::value<std::string>()->default_value(\"logs/\"),\n                        \"directory for log files\")\n                (LOGFILE_MAX_SIZE.c_str(),\n                        po::value<std::string>()->default_value(\"512K\"),\n                        \"maximum size for log files\")\n                (LOGFILE_ROTATION_SIZE.c_str(),\n                        po::value<std::string>()->default_value(\"64K\"),\n                        \"size at which to rotate log files\")\n                (DEBUG_LOGGING.c_str(),\n                        po::value<bool>()->default_value(false),\n                        \"enable debug logging\");\n    this->options_root.add(logging);\n\n    po::options_description audit(\"Audit\");\n    audit.add_options()\n                (AUDIT_ENABLED.c_str(),\n                        po::value<bool>()->default_value(true),\n                        \"enable audit module\")\n                (AUDIT_MEM_SIZE.c_str(),\n                        po::value<size_t>()->default_value(10000),\n                        \"max size of audit datastructures\")\n                (MONITOR_ADDRESS.c_str(),\n                        po::value<std::string>(),\n                        \"address of stats.d listener for audit module\")\n                (MONITOR_PORT.c_str(),\n                        po::value<uint16_t>(),\n                        \"port of stats.d listener for audit module\")\n                (MONITOR_COLLATE.c_str(),\n                        po::value<bool>()->default_value(true),\n                        \"send monitor packets at an interval to reduce packet count (and log spam)\")\n                (MONITOR_COLLATE_INTERVAL_SECONDS.c_str(),\n                        po::value<uint64_t>()->default_value(5),\n                        \"interval at which to send monitor packets (if collation is enabled)\")\n                (MONITOR_MAX_TIMERS.c_str(),\n                        po::value<uint64_t>(),\n                        \"maximum number of outstanding monitor timers\");\n    this->options_root.add(audit);\n\n    po::options_description experimental(\"Experimental\");\n    experimental.add_options()\n                (PEER_VALIDATION_ENABLED.c_str(),\n                        po::value<bool>()->default_value(false),\n                        \"require signed key for new peers to join swarm\")\n                (SIGNED_KEY.c_str(),\n                        po::value<std::string>(),\n                        \"signed key for node's uuid\")\n                (OWNER_PUBLIC_KEY.c_str(),\n                        po::value<std::string>(),\n                        \"swarm owner's public key\");\n\n    this->options_root.add(experimental);\n\n    po::options_description crypto(\"Cryptography\");\n    crypto.add_options()\n                (NODE_PUBKEY_FILE.c_str(),\n                        po::value<std::string>()->default_value(\".state/public-key.pem\"),\n                        \"public key of this node\")\n                (NODE_PRIVATEKEY_FILE.c_str(),\n                        po::value<std::string>()->default_value(\".state/private-key.pem\"),\n                        \"private key of this node\")\n                (CRYPTO_ENABLED_INCOMING.c_str(),\n                        po::value<bool>()->default_value(true),\n                        \"check signatures on incoming messages\")\n                (CRYPTO_ENABLED_OUTGOING.c_str(),\n                         po::value<bool>()->default_value(true),\n                        \"attach signatures on outgoing messages\")\n                (CRYPTO_SELF_VERIFY.c_str(),\n                         po::value<bool>()->default_value(true),\n                        \"verify own signatures as a sanity check\");\n\n    this->options_root.add(crypto);\n\n    po::options_description wss(\"Websocket Secure\");\n    wss.add_options()\n                (WSS_ENABLED.c_str(),\n                    po::value<bool>()->default_value(false),\n                    \"enable websocket secure\")\n                (WSS_SERVER_CERTIFICATE_FILE.c_str(),\n                    po::value<std::string>()->default_value(\".state/wss-cert.pem\"),\n                    \"wss server certificate\")\n                (WSS_SERVER_PRIVATE_KEY_FILE.c_str(),\n                    po::value<std::string>()->default_value(\".state/wss-private-key.pem\"),\n                    \"wss server private key\")\n                (WSS_SERVER_DH_PARAMS_FILE.c_str(),\n                    po::value<std::string>(),\n                    \"Diffie–Hellman params\");\n\n    this->options_root.add(wss);\n\n    po::options_description chaos(\"Chaos testing\");\n    chaos.add_options()\n                 (CHAOS_ENABLED.c_str(),\n                         po::value<bool>()->default_value(false),\n                         \"enable chaos testing module\")\n\n                 /*\n                  * With the default parameters specified here,\n                  * 10% of nodes will fail within a couple minutes\n                  * 20% more will fail within the first hour\n                  * 40% will last 1-12 hours\n                  * 20% will last 12-48 hours\n                  * 10% will last 48+ hours\n                  */\n                 (CHAOS_NODE_FAILURE_SHAPE.c_str(),\n                         po::value<double>()->default_value(0.5),\n                         \"shape parameter of Weibull distribution for node lifetime\")\n                 (CHAOS_NODE_FAILURE_SCALE.c_str(),\n                         po::value<double>()->default_value(10),\n                         \"scale parameter of Weibull distribution for node lifetime (expressed in hours)\")\n\n\n                 /*\n                  * These parameters are chosen arbitrarily, but a cursory search suggests that\n                  * an exponential distribution is indeed reasonable for internet packet delay\n                  */\n                 (CHAOS_MESSAGE_DELAY_CHANCE.c_str(),\n                         po::value<double>()->default_value(0.1),\n                         \"chance by which outgoing messages are delayed (independently at random)\")\n                 (CHAOS_MESSAGE_DELAY_TIME.c_str(),\n                         po::value<uint>()->default_value(2500),\n                         \"how long to wait before attempting to resend a delayed message (at which point it can be delayed again, resulting in an exponential distribution on the actual delay)\")\n\n\n                 (CHAOS_MESSAGE_DROP_CHANCE.c_str(),\n                         po::value<double>()->default_value(0.025),\n                         \"chance that outgoing messages are dropped entirely (independently at random)\");\n\n    this->options_root.add(chaos);\n}\n\nbool\nsimple_options::validate_options()\n{\n    this->vm.notify();\n    bool errors = false;\n\n    // Boost will enforce required-ness and types of options, we only need to validate more complex constraints\n\n    auto port = this->get<uint16_t>(LISTENER_PORT);\n    if (port <= 1024)\n    {\n        std::cerr << \"Invalid listener port \" << std::to_string(port);\n        errors = true;\n    }\n\n    if (! (this->has(BOOTSTRAP_PEERS_FILE) || this->has(BOOTSTRAP_PEERS_URL)))\n    {\n        std::cerr << \"Bootstrap peers source not specified\";\n        errors = true;\n    }\n\n    if (!this->vm[NODE_PUBKEY_FILE].defaulted() && this->has(NODE_UUID))\n    {\n        std::cerr << \"You cannot specify both a uuid and a public key; public keys act as uuids\";\n        errors = true;\n    }\n\n    return !errors;\n}\n\nbool\nsimple_options::handle_config_file_options()\n{\n    std::ifstream ifile;\n    ifile.exceptions(std::ios::failbit);\n\n    try\n    {\n        ifile.open(config_file);\n    }\n    catch (const std::exception& /*ex*/)\n    {\n        throw std::runtime_error(\"Failed to load: \" + config_file + \" : \" + strerror(errno));\n    }\n\n    Json::CharReaderBuilder rbuilder;\n    std::string parse_err;\n\n    Json::Value json;\n    if (!Json::parseFromStream(rbuilder, ifile, &json, &parse_err))\n    {\n        throw std::runtime_error(\"Failed to parse: \" + config_file + \" : \" + parse_err);\n    }\n\n    if (!json.isObject())\n    {\n        throw std::runtime_error(\"Config file should be an object\");\n    }\n\n    this->config_file_opts = po::parsed_options{&(this->options_root)};\n\n    for (const auto& name : json.getMemberNames())\n    {\n        const auto& json_val = json[name];\n\n        if (! this->options_root.find_nothrow(name.c_str(), false))\n        {\n            std::cerr << \"Warning: ignoring unknown config file option '\" << name << \"'\\n\";\n            continue;\n        }\n\n        boost::program_options::basic_option<char> opt;\n        opt.string_key = name;\n\n        if (json_val.isString())\n        {\n            opt.value.push_back(json_val.asString());\n        }\n        else\n        {\n            // If it's not a string, then it should be a bool or a number, so we can let boost parse it\n            auto option_value = json_val.toStyledString();\n            boost::trim(option_value); // jsoncpp sometimes includes a trailing newline here\n\n            opt.value.push_back(option_value);\n        }\n\n        this->config_file_opts.options.push_back(opt);\n    }\n\n    return true;\n}\n\nbool\nsimple_options::handle_command_line_options(int argc, const char* argv[])\n{\n    try\n    {\n        this->cmd_opts = po::parse_command_line(argc, argv, this->options_root);\n        po::variables_map early_vm;\n        po::store(this->cmd_opts, early_vm);\n\n        if (early_vm.count(\"version\"))\n        {\n            std::cout << \"swarmdb\" << \": \" << SWARM_GIT_COMMIT << std::endl;\n\n            std::string compiler_name = \"unknown\";\n            if (BOOST_COMP_CLANG)\n            {\n                compiler_name = \"clang\";\n            }\n\n            if (BOOST_COMP_GNUC){\n                compiler_name = \"gcc\";\n            }\n\n            if (BOOST_COMP_LLVM){\n                compiler_name = \"llvm\";\n            }\n\n#ifdef __OPTIMIZE__\n            bool opt = true;\n#else\n            bool opt = false;\n#endif\n\n            std::cout << \"compiled by \" << compiler_name <<  __VERSION__ << \"; optimize=\" << opt << std::endl;\n\n            return false;\n        }\n\n        if (early_vm.count(\"help\") || early_vm.count(\"config\") == 0)\n        {\n            std::cout << \"Usage:\" << '\\n'\n                      << \"  \" << \"bluzelle\" << \" [OPTION]\" << '\\n'\n                      << \"Long form options may be specified on command line or in json object in config file\" << '\\n'\n                      << '\\n' << this->options_root << '\\n';\n\n            return false;\n        }\n\n        this->config_file = early_vm[\"config\"].as<std::string>();\n        return true;\n    }\n    catch (po::error& e)\n    {\n        std::cerr << \"ERROR: \" << e.what() << std::endl << std::endl;\n        return false;\n    }\n    catch (std::exception& e)\n    {\n        std::cerr << \"Unhandled Exception: \" << e.what() << \", application will now exit\" << std::endl;\n        return false;\n    }\n}\n\nbool\nsimple_options::combine_options()\n{\n    boost::program_options::parsed_options override_opts(&(this->options_root));\n    for (const auto& pair : this->overrides)\n    {\n        po::basic_option<char> opt;\n        opt.string_key = pair.first;\n        opt.value.push_back(pair.second);\n        override_opts.options.push_back(opt);\n    }\n\n    this->vm = boost::program_options::variables_map{};\n    po::store(override_opts, this->vm);\n    po::store(this->cmd_opts, this->vm);\n    po::store(this->config_file_opts, this->vm);\n\n    return true;\n}\n\nbool\nsimple_options::has(const std::string& option_name) const\n{\n    return this->vm.count(option_name) > 0;\n}\n\nvoid\nsimple_options::set(const std::string& option_name, const std::string& option_value)\n{\n    std::lock_guard<std::mutex> lock(this->lock);\n    this->overrides[option_name] = option_value;\n    this->combine_options();\n}\n\n"
  },
  {
    "path": "options/simple_options.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <boost/program_options.hpp>\n#include <boost/program_options/variables_map.hpp>\n#include <string>\n#include <mutex>\n#include <unordered_map>\n\nnamespace bzn::option_names\n{\n    const std::string AUDIT_MEM_SIZE = \"audit_mem_size\";\n    const std::string AUDIT_ENABLED = \"audit_enabled\";\n    const std::string PEERS_REFRESH_INTERVAL_SECONDS = \"peers_refresh_interval_seconds\";\n    const std::string BOOTSTRAP_PEERS_FILE = \"bootstrap_file\";\n    const std::string BOOTSTRAP_PEERS_URL = \"bootstrap_url\";\n    const std::string CPR_URL = \"cpr_url\";\n    const std::string DEBUG_LOGGING = \"debug_logging\";\n    const std::string LISTENER_ADDRESS = \"listener_address\";\n    const std::string LISTENER_PORT = \"listener_port\";\n    const std::string LOG_TO_STDOUT = \"log_to_stdout\";\n    const std::string LOGFILE_DIR = \"logfile_dir\";\n    const std::string LOGFILE_MAX_SIZE = \"logfile_max_size\";\n    const std::string LOGFILE_ROTATION_SIZE = \"logfile_rotation_size\";\n    const std::string MAX_SWARM_STORAGE = \"max_swarm_storage\";\n    const std::string MEM_STORAGE = \"mem_storage\";\n    const std::string MONITOR_ADDRESS = \"monitor_address\";\n    const std::string MONITOR_PORT = \"monitor_port\";\n    const std::string MONITOR_COLLATE = \"monitor_collate\";\n    const std::string MONITOR_COLLATE_INTERVAL_SECONDS = \"monitor_collate_interval_seconds\";\n    const std::string NODE_UUID = \"uuid\";\n    const std::string NODE_PUBKEY_FILE = \"public_key_file\";\n    const std::string NODE_PRIVATEKEY_FILE = \"private_key_file\";\n    const std::string STATE_DIR = \"state_dir\";\n    const std::string SWARM_ID = \"swarm_id\";\n    const std::string WS_IDLE_TIMEOUT = \"ws_idle_timeout\";\n    const std::string PEER_VALIDATION_ENABLED = \"peer_validation_enabled\";\n    const std::string SIGNED_KEY = \"signed_key\";\n    const std::string OWNER_PUBLIC_KEY = \"owner_public_key\";\n    const std::string ADMISSION_WINDOW = \"admission_window\";\n    const std::string PEER_MESSAGE_SIGNING = \"peer_message_signing\";\n\n    const std::string CHAOS_ENABLED = \"chaos_testing_enabled\";\n    const std::string CHAOS_NODE_FAILURE_SHAPE = \"chaos_node_failure_shape\";\n    const std::string CHAOS_NODE_FAILURE_SCALE = \"chaos_node_failure_scale_hours\";\n    const std::string CHAOS_MESSAGE_DROP_CHANCE = \"chaos_message_drop_chance\";\n    const std::string CHAOS_MESSAGE_DELAY_CHANCE = \"chaos_message_delay_chance\";\n    const std::string CHAOS_MESSAGE_DELAY_TIME = \"chaos_message_delay_time_milliseconds\";\n\n    const std::string CRYPTO_ENABLED_OUTGOING = \"crypto_enabled_outgoing\";\n    const std::string CRYPTO_ENABLED_INCOMING = \"crypto_enabled_incoming\";\n    const std::string CRYPTO_SELF_VERIFY = \"crypto_self_verify\";\n\n    const std::string MONITOR_MAX_TIMERS = \"monitor_max_timers\";\n    const std::string OVERRIDE_NUM_THREADS = \"override_num_threads\";\n\n    const std::string SWARM_INFO_ESR_ADDRESS = \"swarm_info_esr_address\";\n    const std::string SWARM_INFO_ESR_URL = \"swarm_info_esr_url\";\n    const std::string IGNORE_ESR = \"ignore_esr\";\n    const std::string IGNORE_CPR = \"ignore_cpr\";\n\n    const std::string STACK = \"stack\";\n\n    const std::string WSS_ENABLED = \"wss_enabled\";\n    const std::string WSS_SERVER_CERTIFICATE_FILE = \"wss_server_certificate_file\";\n    const std::string WSS_SERVER_PRIVATE_KEY_FILE = \"wss_server_private_key_file\";\n    const std::string WSS_SERVER_DH_PARAMS_FILE = \"wss_server_dh_params_file\";\n}\n\nnamespace bzn\n{\n    class simple_options\n    {\n    public:\n        simple_options();\n\n        /*\n         * Read command line to find location of config file, read config file for everything else\n         */\n        bool parse(int argc, const char* argv[]);\n\n        /*\n         * Get the value of a particular option (options defined in bzn::options) with a particular type\n         */\n        template<typename T>\n        T\n        get(const std::string& option_name) const\n        {\n            std::lock_guard<std::mutex> lock(this->lock);\n            if (this->has(option_name))\n            {\n                return this->vm[option_name].as<T>();\n            }\n            else\n            {\n                // T is a string and option_name doesn't exist, the lookup will throw an exception\n                return T();\n            }\n        }\n\n        /*\n         * Assign a value to an option at runtime\n         */\n        void set(const std::string& option_name, const std::string& option_value);\n\n        /*\n         * Do we have a value for an option (either explicit or default)\n         */\n        bool has(const std::string& option_name) const;\n\n    private:\n        void build_options();\n        bool validate_options();\n        bool handle_command_line_options(int argc, const char* argv[]);\n        bool handle_config_file_options();\n        bool combine_options();\n\n        std::string config_file;\n        boost::program_options::options_description options_root;\n        boost::program_options::variables_map vm;\n\n        boost::program_options::basic_parsed_options<char> cmd_opts;\n        boost::program_options::basic_parsed_options<char> config_file_opts;\n        std::unordered_map<std::string, std::string> overrides;\n\n        mutable std::mutex lock;\n    };\n}\n"
  },
  {
    "path": "options/test/CMakeLists.txt",
    "content": "set(test_srcs options_test.cpp)\nset(test_libs options utils)\n\nadd_gmock_test(options)\n"
  },
  {
    "path": "options/test/options_test.cpp",
    "content": "// Copyright (c) 2017-2018 Bluzelle Networks\n//\n// This file is part of Bluzelle.\n//\n// Bluzelle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as\n// published by the Free Software Foundation, either version 3 of the\n// License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <include/bluzelle.hpp>\n#include <options/options.hpp>\n#include <boost/lexical_cast.hpp>\n#include <gtest/gtest.h>\n#include <fstream>\n#include <unordered_set>\n\n\nnamespace\n{\n    const char* NO_ARGS[] = {\"config_tests\"};\n\n    const std::string TEST_CONFIG_FILE = \"bluzelle.json\";\n\n    const std::string DEFAULT_CONFIG_CONTENT =\n        \"  \\\"listener_address\\\" : \\\"0.0.0.0\\\",\\n\"\n        \"  \\\"listener_port\\\" : 49152,\\n\"\n        \"  \\\"bootstrap_file\\\" : \\\"peers.json\\\",\\n\"\n        \"  \\\"bootstrap_url\\\"  : \\\"example.org/peers.json\\\",\\n\"\n        \"  \\\"uuid\\\" : \\\"c05c0dff-3c27-4532-96de-36f53d8a278e\\\",\\n\"\n        \"  \\\"swarm_id\\\" : \\\"utest\\\",\\n\"\n        \"  \\\"stack\\\" : \\\"utest\\\", \\n\"\n        \"  \\\"debug_logging\\\" : true,\"\n        \"  \\\"log_to_stdout\\\" : true,\"\n        \"  \\\"state_dir\\\" : \\\"./daemon_state/\\\",\"\n        \"  \\\"logfile_max_size\\\" : \\\"1M\\\",\"\n        \"  \\\"logfile_rotation_size\\\" : \\\"2M\\\",\"\n        \"  \\\"logfile_dir\\\" : \\\".\\\",\"\n        \"  \\\"signed_key\\\" : \\\"Oo8ZlDQcMlZF4hqnhN/2D...hoEgc0jRUl1b9mHSY7E4puk=\\\",\"\n        \"  \\\"owner_public_key\\\" : \\\"MCwwDQYJKoZIhvcNAQEBBQADGwAwGAIRAKb7PX3Pr+LgaqIAyhcXgTMCAwEAAQ==\\\",\"\n        \"  \\\"mem_storage\\\" : false,\"\n        \"  \\\"swarm_info_esr_address\\\" : \\\"this_would_be_a_good_ESR_address\\\",\"\n        \"  \\\"swarm_info_esr_url\\\" : \\\"192.0.0.1:41000\\\",\"\n        \"  \\\"wss_enabled\\\" : false,\"\n        \"  \\\"wss_server_certificate_file\\\" : \\\"cert.pem\\\",\"\n        \"  \\\"wss_server_private_key_file\\\" : \\\"key.pem\\\",\"\n        \"  \\\"wss_server_dh_params_file\\\" : \\\"dhparams.pem\\\"\";\n\n    const std::string DEFAULT_CONFIG_DATA = \"{\" + DEFAULT_CONFIG_CONTENT + \"}\";\n\n    std::string compose_config_data(const std::string& a, const std::string& b)\n    {\n        std::string result = \"{\" + a + \",\\n\" + b + \"}\";\n        return result;\n    }\n\n    const auto DEFAULT_LISTENER = boost::asio::ip::tcp::endpoint{boost::asio::ip::address::from_string(\"0.0.0.0\"), 49152};\n\n    void config_text_to_json(bzn::json_message& json)\n    {\n        std::string config_data{DEFAULT_CONFIG_DATA};\n        std::string errors;\n\n        Json::CharReaderBuilder builder;\n        Json::CharReader* reader = builder.newCharReader();\n        reader->parse(\n                DEFAULT_CONFIG_DATA.c_str()\n                , DEFAULT_CONFIG_DATA.c_str() + DEFAULT_CONFIG_DATA.size()\n                , &json\n                , &errors);\n        delete reader;\n    }\n}\n\nusing namespace ::testing;\n\n\n// create default options and remove when done...\nclass options_file_test : public Test\n{\npublic:\n\n    std::unordered_set<std::string> open_files;\n\n    options_file_test()\n    {\n        this->save_options_file(DEFAULT_CONFIG_DATA);\n    }\n\n    ~options_file_test()\n    {\n        for(const auto& file : this->open_files)\n        {\n            unlink(file.c_str());\n        }\n    }\n\n    void save_file(const std::string& filename, const std::string& content)\n    {\n        if (this->open_files.count(filename) > 0)\n        {\n            unlink(TEST_CONFIG_FILE.c_str());\n        }\n        else\n        {\n            this->open_files.insert(filename);\n        }\n\n        //std::cout << filename;\n\n        std::ofstream ofile(filename.c_str());\n        ofile.exceptions(std::ios::failbit);\n        ofile << content;\n    }\n\n    void\n    save_options_file(const std::string& content)\n    {\n        save_file(TEST_CONFIG_FILE, content);\n    }\n};\n\nTEST_F(options_file_test, test_that_missing_arguments_fail)\n{\n    this->save_options_file(\"{}\");\n\n    bzn::options options;\n\n    EXPECT_THROW(options.parse_command_line(1, NO_ARGS), std::exception);\n}\n\n\nTEST_F(options_file_test, test_that_loading_of_default_config_file)\n{\n    bzn::options options;\n\n    options.parse_command_line(1, NO_ARGS);\n\n    EXPECT_EQ(DEFAULT_LISTENER, options.get_listener());\n    ASSERT_EQ(true, options.get_debug_logging());\n    ASSERT_EQ(true, options.get_log_to_stdout());\n    EXPECT_EQ(\"utest\", options.get_swarm_id());\n    EXPECT_EQ(\"utest\", options.get_stack());\n    EXPECT_EQ(\"./daemon_state/\", options.get_state_dir());\n    EXPECT_EQ(\"peers.json\", options.get_bootstrap_peers_file());\n    EXPECT_EQ(\"example.org/peers.json\", options.get_bootstrap_peers_url());\n    EXPECT_EQ(size_t(0), options.get_max_swarm_storage());\n    EXPECT_EQ(size_t(1048576), options.get_logfile_max_size());\n    EXPECT_EQ(size_t(2097152), options.get_logfile_rotation_size());\n    EXPECT_EQ(\".\", options.get_logfile_dir());\n    EXPECT_FALSE(options.peer_validation_enabled());\n    EXPECT_FALSE(options.get_mem_storage());\n    EXPECT_EQ(\"Oo8ZlDQcMlZF4hqnhN/2D...hoEgc0jRUl1b9mHSY7E4puk=\",options.get_signed_key());\n    EXPECT_EQ(\"MCwwDQYJKoZIhvcNAQEBBQADGwAwGAIRAKb7PX3Pr+LgaqIAyhcXgTMCAwEAAQ==\", options.get_owner_public_key());\n    EXPECT_EQ(\"this_would_be_a_good_ESR_address\", options.get_swarm_info_esr_address());\n    EXPECT_EQ(\"192.0.0.1:41000\", options.get_swarm_info_esr_url());\n    EXPECT_EQ(false, options.get_wss_enabled());\n    EXPECT_EQ(\"cert.pem\", options.get_wss_server_certificate_file());\n    EXPECT_EQ(\"key.pem\", options.get_wss_server_private_key_file());\n    EXPECT_EQ(\"dhparams.pem\", options.get_wss_server_dh_params_file());\n\n    // defaults..\n    {\n        bzn::options options0;\n        this->save_options_file(\"{}\");\n\n        // Will fail without many required arguments, but we can still get default values where they exist\n        EXPECT_THROW(options0.parse_command_line(1, NO_ARGS), std::exception);\n\n        EXPECT_EQ(\"./.state/\", options0.get_state_dir());\n        EXPECT_EQ(size_t(524288), options0.get_logfile_max_size());\n        EXPECT_EQ(size_t(65536), options0.get_logfile_rotation_size());\n        EXPECT_EQ(\"logs/\", options0.get_logfile_dir());\n        EXPECT_TRUE(options0.get_mem_storage());\n        EXPECT_EQ(\"\", options0.get_swarm_id());\n        EXPECT_EQ(bzn::utils::DEFAULT_SWARM_INFO_ESR_ADDRESS, options0.get_swarm_info_esr_address());\n        EXPECT_EQ(bzn::utils::ROPSTEN_URL, options0.get_swarm_info_esr_url());\n        EXPECT_EQ(false, options0.get_wss_enabled());\n        EXPECT_EQ(\".state/wss-cert.pem\", options0.get_wss_server_certificate_file());\n        EXPECT_EQ(\".state/wss-private-key.pem\", options0.get_wss_server_private_key_file());\n        EXPECT_EQ(\"\", options0.get_wss_server_dh_params_file());\n    }\n}\n\n\nTEST(options, test_that_missing_default_config_throws_exception)\n{\n    bzn::options options;\n\n    EXPECT_THROW(options.parse_command_line(1, NO_ARGS), std::runtime_error);\n}\n\n\nTEST_F(options_file_test, test_max_storage_parsing)\n{\n    bzn::json_message json;\n    config_text_to_json(json);\n\n    std::for_each(bzn::utils::BYTE_SUFFIXES.cbegin()\n            , bzn::utils::BYTE_SUFFIXES.cend()\n            , [&](const auto& p)\n                  {\n                      const size_t expected = 3 * 1099511627776; // 3TB in B\n                      {\n                          json[\"max_swarm_storage\"] = boost::lexical_cast<std::string>(expected / p.second) + p.first;\n\n                          this->save_options_file(json.toStyledString());\n\n                          bzn::options options;\n                          options.parse_command_line(1, NO_ARGS);\n\n                          EXPECT_EQ(expected, options.get_max_swarm_storage());\n                      }\n                      {\n                          std::string max_storage{boost::lexical_cast<std::string>(expected / p.second)};\n                          max_storage = max_storage + p.first;\n                          if (p.first!='B')\n                          {\n                              max_storage = max_storage.append(\"B\");\n                          }\n                          json[\"max_swarm_storage\"] = max_storage;\n\n                          this->save_options_file(json.toStyledString());\n\n                          bzn::options options;\n                          options.parse_command_line(1, NO_ARGS);\n\n                          EXPECT_EQ(expected, options.get_max_swarm_storage());\n                      }\n                  });\n\n}\n\n\nTEST_F(options_file_test, test_enable_whitlelist_temporary)\n{\n    bzn::json_message json;\n    config_text_to_json(json);\n    {\n        json[bzn::option_names::PEER_VALIDATION_ENABLED] = false;\n        this->save_options_file(json.toStyledString());\n        bzn::options options;\n        options.parse_command_line(1, NO_ARGS);\n        EXPECT_FALSE(options.peer_validation_enabled());\n    }\n    {\n        json[bzn::option_names::PEER_VALIDATION_ENABLED] = true;\n        this->save_options_file(json.toStyledString());\n        bzn::options options;\n        options.parse_command_line(1, NO_ARGS);\n        EXPECT_TRUE(options.peer_validation_enabled());\n    }\n}\n\n\nTEST_F(options_file_test, test_that_command_line_options_work)\n{\n    bzn::options options;\n    const char* ARGS[] = {\"swarm\", \"-c\", TEST_CONFIG_FILE.c_str()};\n    options.parse_command_line(3, ARGS);\n    std::cout << options.get_bootstrap_peers_file() << std::endl;\n    EXPECT_EQ(DEFAULT_LISTENER, options.get_listener());\n    ASSERT_EQ(true, options.get_debug_logging());\n    ASSERT_EQ(true, options.get_log_to_stdout());\n    EXPECT_EQ(\"./daemon_state/\", options.get_state_dir());\n    EXPECT_EQ(\"peers.json\", options.get_bootstrap_peers_file());\n    EXPECT_EQ(\"example.org/peers.json\", options.get_bootstrap_peers_url());\n    EXPECT_EQ(size_t(0), options.get_max_swarm_storage());\n    EXPECT_EQ(size_t(1048576), options.get_logfile_max_size());\n    EXPECT_EQ(size_t(2097152), options.get_logfile_rotation_size());\n    EXPECT_EQ(\".\", options.get_logfile_dir());\n    EXPECT_FALSE(options.peer_validation_enabled());\n    EXPECT_EQ(\"MCwwDQYJKoZIhvcNAQEBBQADGwAwGAIRAKb7PX3Pr+LgaqIAyhcXgTMCAwEAAQ==\", options.get_owner_public_key());\n    EXPECT_EQ(\"this_would_be_a_good_ESR_address\", options.get_swarm_info_esr_address());\n}\n\nTEST_F(options_file_test, test_that_no_monitor_endpoint_when_not_specified)\n{\n    bzn::options options;\n\n    try\n    {\n        options.parse_command_line(1, NO_ARGS);\n    }\n    catch (const std::exception& e)\n    {\n        // We are missing some required arguments, that's fine, we want to test against defaults\n    }\n\n    auto io_context = std::make_shared<bzn::asio::io_context>();\n\n    EXPECT_EQ(options.get_monitor_endpoint(io_context), std::optional<boost::asio::ip::udp::endpoint>{});\n}\n\nTEST_F(options_file_test, test_that_endpoint_built)\n{\n    bzn::options options;\n    this->save_options_file(\"{\\\"\"\n                            + bzn::option_names::MONITOR_ADDRESS + \"\\\": \\\"localhost\\\", \\\"\"\n                            + bzn::option_names::MONITOR_PORT + \"\\\": 12345}\");\n\n    try\n    {\n        options.parse_command_line(1, NO_ARGS);\n    }\n    catch (const std::exception& e)\n    {\n        // We are missing some required arguments, that's fine, we want to test against what we've specified\n    }\n\n    auto io_context = std::make_shared<bzn::asio::io_context>();\n\n    boost::asio::ip::udp::resolver resolver(io_context->get_io_context());\n    auto eps = resolver.resolve(boost::asio::ip::udp::v4(), \"localhost\", \"12345\");\n    auto expect = std::optional<boost::asio::ip::udp::endpoint>{*eps.begin()};\n\n    EXPECT_EQ(options.get_monitor_endpoint(io_context), expect);\n}\n\nTEST_F(options_file_test, test_that_pubkey_used_for_uuid)\n{\n    bzn::options options;\n    this->save_options_file(\"{\\\"public_key_file\\\": \\\"pkey.pem\\\"}\");\n\n    this->save_file(\"pkey.pem\",\n            \"-----BEGIN PUBLIC KEY-----\\n\"\n            \"hFWG\\n\"\n            \"-----END PUBLIC KEY-----\\n\"\n    );\n\n    try\n    {\n        options.parse_command_line(1, NO_ARGS);\n    }\n    catch (const std::exception& e)\n    {\n    }\n\n    EXPECT_EQ(options.get_uuid(), \"hFWG\");\n}\n\nTEST_F(options_file_test, test_that_uuid_and_pubkey_conflict)\n{\n    bzn::options options;\n    this->save_options_file(compose_config_data(DEFAULT_CONFIG_CONTENT, \"\\\"public_key_file\\\": \\\"somefile\\\"\"));\n    EXPECT_FALSE(options.parse_command_line(1, NO_ARGS));\n}\n\nTEST_F(options_file_test, test_set_option_at_runtime)\n{\n    bzn::options options;\n    this->save_options_file(DEFAULT_CONFIG_DATA);\n    EXPECT_TRUE(options.parse_command_line(1, NO_ARGS));\n\n    options.get_mutable_simple_options().set(bzn::option_names::DEBUG_LOGGING, \"false\");\n    EXPECT_FALSE(options.get_simple_options().get<bool>(bzn::option_names::DEBUG_LOGGING));\n\n    options.get_mutable_simple_options().set(bzn::option_names::DEBUG_LOGGING, \"true\");\n    EXPECT_TRUE(options.get_simple_options().get<bool>(bzn::option_names::DEBUG_LOGGING));\n\n    options.get_mutable_simple_options().set(bzn::option_names::DEBUG_LOGGING, \"false\");\n    EXPECT_FALSE(options.get_simple_options().get<bool>(bzn::option_names::DEBUG_LOGGING));\n}\n"
  },
  {
    "path": "pbft/CMakeLists.txt",
    "content": "add_library(pbft STATIC\n    pbft_base.hpp\n    pbft.hpp\n    pbft.cpp\n    dummy_pbft_service.cpp\n    dummy_pbft_service.hpp\n    pbft_service_base.hpp\n    pbft_checkpoint_manager.cpp\n    pbft_checkpoint_manager.hpp\n    database_pbft_service.cpp\n    database_pbft_service.hpp\n    pbft_persistent_state.cpp)\n\ntarget_link_libraries(pbft utils pbft_operations proto)\ntarget_include_directories(pbft PRIVATE ${BLUZELLE_STD_INCLUDES})\nadd_dependencies(pbft boost openssl)\n\nadd_subdirectory(test)\nadd_subdirectory(operations)\n"
  },
  {
    "path": "pbft/database_pbft_service.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n\n#include <pbft/database_pbft_service.hpp>\n#include <boost/lexical_cast.hpp>\n\n\nusing namespace bzn;\n\nnamespace\n{\n    const std::string NEXT_REQUEST_SEQUENCE_KEY{\"next_request_sequence\"};\n}\n\n\ndatabase_pbft_service::database_pbft_service(\n    std::shared_ptr<bzn::asio::io_context_base> io_context,\n    std::shared_ptr<bzn::storage_base> unstable_storage,\n    std::shared_ptr<bzn::crud_base> crud,\n    std::shared_ptr<bzn::monitor_base> monitor,\n    bzn::uuid_t uuid)\n    : io_context(std::move(io_context))\n    , unstable_storage(std::move(unstable_storage))\n    , crud(std::move(crud))\n    , monitor(std::move(monitor))\n    , uuid(std::move(uuid))\n{\n    this->load_next_request_sequence();\n}\n\ndatabase_pbft_service::~database_pbft_service()\n{\n    this->save_next_request_sequence();\n}\n\n\nvoid\ndatabase_pbft_service::apply_operation(const std::shared_ptr<bzn::pbft_operation>& op)\n{\n    std::lock_guard<std::mutex> lock(this->lock);\n\n    // store op...\n    if (auto result = this->unstable_storage->create(this->uuid, std::to_string(op->get_sequence()), op->get_database_msg().SerializeAsString());\n        result != bzn::storage_result::ok)\n    {\n        if (result == bzn::storage_result::exists)\n        {\n            // KEP-899 - We do not want to throw a runtime error for duplicates, as it is possible that\n            // during a view change we may try to perform duplicate operatiosn that have already been\n            // done in previous views.\n            LOG(warning) << \"failed to store pbft request, possible duplicate? : \"\n                << op->get_database_msg().DebugString().substr(0, MAX_MESSAGE_SIZE) << \", \" << uint32_t(result);\n            return;\n        }\n\n        LOG(fatal) << \"failed to store pbft request: \"\n            << op->get_database_msg().DebugString().substr(0, MAX_MESSAGE_SIZE) << \", \" << uint32_t(result);\n\n        // these are fatal... something bad is going on.\n        throw std::runtime_error(\"Failed to store pbft request! (\" + std::to_string(uint8_t(result)) + \")\");\n    }\n\n    // store requester session for eventual response...\n    this->operations_awaiting_result[op->get_sequence()] = op;\n\n    this->process_awaiting_operations();\n}\n\n\nbool\ndatabase_pbft_service::apply_operation_now(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> session)\n{\n    database_msg db_msg;\n\n    if (db_msg.ParseFromString(msg.database_msg()))\n    {\n        if (const auto msg_case = db_msg.msg_case();\n            msg_case == database_msg::kQuickRead ||\n            msg_case == database_msg::kSubscribe ||\n            msg_case == database_msg::kUnsubscribe)\n        {\n            LOG(debug) << \"handling: \" << msg_case;\n\n            this->crud->handle_request(msg.sender(), db_msg, session);\n\n            return true;\n        }\n    }\n\n    return false;\n}\n\n\nvoid\ndatabase_pbft_service::process_awaiting_operations()\n{\n    while (this->unstable_storage->has(this->uuid, std::to_string(this->next_request_sequence)))\n    {\n        const key_t key{std::to_string(this->next_request_sequence)};\n\n        auto result = this->unstable_storage->read(this->uuid, key);\n\n        if (!result)\n        {\n            // these are fatal... something bad is going on.\n            throw std::runtime_error(\"Failed to store pbft request!\");\n        }\n\n        database_msg request;\n\n        if (!request.ParseFromString(*result))\n        {\n            // these are fatal... something bad is going on.\n            throw std::runtime_error(\"Failed to create pbft_request from database read!\");\n        }\n\n        LOG(info) << \"Executing request \" << request.DebugString().substr(0, MAX_MESSAGE_SIZE) << \"..., sequence: \" << key;\n\n        if (auto op_it = this->operations_awaiting_result.find(this->next_request_sequence); op_it != this->operations_awaiting_result.end())\n        {\n            // set request hash field for responses...\n            request.mutable_header()->set_request_hash(op_it->second->get_request_hash());\n\n            if (op_it->second->has_session() && op_it->second->session()->is_open())\n            {\n                this->crud->handle_request(op_it->second->get_request().sender(), request, op_it->second->session());\n            }\n            else\n            {\n                // session not found then this was probably loaded from the database...\n                LOG(info) << \"We do not have a pending operation for this request\";\n\n                this->crud->handle_request(op_it->second->get_request().sender(), request, nullptr);\n            }\n\n            // update stats...\n            this->monitor->finish_timer(bzn::statistic::request_latency, op_it->second->get_request_hash());\n\n            if (this->next_request_sequence == this->next_checkpoint)\n            {\n                if (this->crud->save_state())\n                {\n                    this->last_checkpoint = this->next_request_sequence;\n                }\n            }\n\n            this->io_context->post(std::bind(this->execute_handler, (*op_it).second));\n        }\n\n        if (auto result = this->unstable_storage->remove(this->uuid, key); result != bzn::storage_result::ok)\n        {\n            // these are fatal... something bad is going on.\n            throw std::runtime_error(\"Failed to remove pbft_request from database! (\" + std::to_string(uint8_t(result)) + \")\");\n        }\n\n        ++this->next_request_sequence;\n\n        this->save_next_request_sequence();\n    }\n}\n\nbzn::hash_t\ndatabase_pbft_service::service_state_hash(uint64_t /*sequence_number*/) const\n{\n    // TODO: not sure how this works... (KEP-1203)\n\n    return \"\";\n}\n\nstd::shared_ptr<bzn::service_state_t>\ndatabase_pbft_service::get_service_state(uint64_t sequence_number) const\n{\n    if (sequence_number == this->last_checkpoint)\n    {\n        return this->crud->get_saved_state();\n    }\n\n    return nullptr;\n}\n\nbool\ndatabase_pbft_service::set_service_state(uint64_t sequence_number, const bzn::service_state_t& data)\n{\n    std::lock_guard<std::mutex> lock(this->lock);\n\n    if (this->next_request_sequence > sequence_number)\n    {\n        LOG(debug) << \"No need to apply service state\";\n        return true;\n    }\n\n    // initialize database state from checkpoint data\n    if (!this->crud->load_state(data))\n    {\n        return false;\n    }\n    this->last_checkpoint = sequence_number;\n\n    // remove all backlogged requests prior to checkpoint\n    uint64_t seq = this->next_request_sequence;\n    while (seq <= sequence_number)\n    {\n        const key_t key{std::to_string(seq)};\n        this->unstable_storage->remove(uuid, key);\n        seq++;\n    }\n\n    this->next_request_sequence = seq;\n    this->process_awaiting_operations();\n    return true;\n}\n\nvoid\ndatabase_pbft_service::save_service_state_at(uint64_t sequence_number)\n{\n    this->next_checkpoint = sequence_number;\n}\n\nvoid\ndatabase_pbft_service::consolidate_log(uint64_t sequence_number)\n{\n    LOG(info) << \"TODO: consolidating log at sequence number \" << sequence_number;\n}\n\nvoid\ndatabase_pbft_service::register_execute_handler(bzn::execute_handler_t handler)\n{\n    this->execute_handler = std::move(handler);\n}\n\n\nuint64_t\ndatabase_pbft_service::applied_requests_count() const\n{\n    return this->next_request_sequence - 1;\n}\n\n\nvoid\ndatabase_pbft_service::load_next_request_sequence()\n{\n    if (auto result = this->unstable_storage->read(this->uuid, NEXT_REQUEST_SEQUENCE_KEY); result)\n    {\n        LOG(debug) << \"read: next_request_sequence: \" << *result;\n\n        this->next_request_sequence = boost::lexical_cast<uint64_t>(*result);\n        return;\n    }\n\n    if (auto result = this->unstable_storage->create(this->uuid, NEXT_REQUEST_SEQUENCE_KEY,\n        std::to_string(this->next_request_sequence)); result != bzn::storage_result::ok)\n    {\n        LOG(fatal) << \"failed to create \\\"\" << NEXT_REQUEST_SEQUENCE_KEY << \"\\\": \" << uint32_t(result);\n\n        throw std::runtime_error(\"Failed to create: \" + NEXT_REQUEST_SEQUENCE_KEY);\n    }\n\n    LOG(debug) << \"next_request_sequence: \" << this->next_request_sequence;\n}\n\n\nvoid\ndatabase_pbft_service::save_next_request_sequence()\n{\n    if (auto result = this->unstable_storage->update(this->uuid, NEXT_REQUEST_SEQUENCE_KEY,\n        std::to_string(this->next_request_sequence)); result != bzn::storage_result::ok)\n    {\n        LOG(error) << \"failed to save next_request_sequence: \" << uint32_t(result);\n        return;\n    }\n\n    LOG(debug) << \"updated: next_request_sequence: \" << this->next_request_sequence;\n}\n"
  },
  {
    "path": "pbft/database_pbft_service.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <include/boost_asio_beast.hpp>\n#include <crud/crud_base.hpp>\n#include <pbft/pbft_service_base.hpp>\n#include <monitor/monitor_base.hpp>\n#include <storage/storage_base.hpp>\n#include <memory>\n\n\nnamespace bzn\n{\n    class database_pbft_service final : public bzn::pbft_service_base, public std::enable_shared_from_this<database_pbft_service>\n    {\n    public:\n        database_pbft_service(std::shared_ptr<bzn::asio::io_context_base> io_context,\n                              std::shared_ptr<bzn::storage_base> unstable_storage,\n                              std::shared_ptr<bzn::crud_base> crud,\n                              std::shared_ptr<bzn::monitor_base> monitor,\n                              bzn::uuid_t uuid);\n\n        virtual ~database_pbft_service();\n\n        void apply_operation(const std::shared_ptr<bzn::pbft_operation>& op) override;\n\n        bool apply_operation_now(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> session) override;\n\n        bzn::hash_t service_state_hash(uint64_t sequence_number) const override;\n\n        std::shared_ptr<bzn::service_state_t> get_service_state(uint64_t sequence_number) const override;\n\n        bool set_service_state(uint64_t sequence_number, const bzn::service_state_t& data) override;\n\n        void save_service_state_at(uint64_t sequence_number) override;\n\n        void consolidate_log(uint64_t sequence_number) override;\n\n        void register_execute_handler(bzn::execute_handler_t handler) override;\n\n        uint64_t applied_requests_count() const;\n\n    private:\n        void process_awaiting_operations();\n\n        void load_next_request_sequence();\n        void save_next_request_sequence();\n\n        std::shared_ptr<bzn::asio::io_context_base> io_context;\n        std::shared_ptr<bzn::storage_base> unstable_storage;\n        std::shared_ptr<bzn::crud_base> crud;\n        std::shared_ptr<bzn::monitor_base> monitor;\n        uint64_t next_request_sequence = 1;\n        const bzn::uuid_t uuid;\n\n        std::unordered_map<uint64_t, std::shared_ptr<bzn::pbft_operation>> operations_awaiting_result;\n\n        bzn::execute_handler_t execute_handler;\n\n        std::once_flag start_once;\n        std::mutex lock;\n        uint64_t next_checkpoint = 0;\n        uint64_t last_checkpoint = 0;\n    };\n\n} // bzn\n"
  },
  {
    "path": "pbft/dummy_pbft_service.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include \"pbft/dummy_pbft_service.hpp\"\n\nusing namespace bzn;\n\n\ndummy_pbft_service::dummy_pbft_service(std::shared_ptr<bzn::asio::io_context_base> io_context)\n    : io_context(std::move(io_context))\n{\n\n}\n\nvoid\ndummy_pbft_service::apply_operation(const std::shared_ptr<pbft_operation>& op)\n{\n    std::lock_guard<std::mutex> lock(this->lock);\n\n    this->waiting_operations[op->get_sequence()] = std::move(op);\n\n    while (this->waiting_operations.count(this->next_request_sequence) > 0)\n    {\n        auto op = waiting_operations[this->next_request_sequence];\n\n        LOG(info) << \"Executing request sequence \" << this->next_request_sequence\n                  << \"\\n\";\n\n        this->send_execute_response(op);\n\n        // todo: use shared from this as post could act on a long gone dummy_pbft_service?\n        this->io_context->post(std::bind(this->execute_handler, op));\n\n        this->waiting_operations.erase(this->next_request_sequence);\n        this->next_request_sequence++;\n    }\n}\n\nbool\ndummy_pbft_service::apply_operation_now(const bzn_envelope& /*msg*/, std::shared_ptr<bzn::session_base> /*session*/)\n{\n    return false;\n}\n\nvoid\ndummy_pbft_service::consolidate_log(uint64_t sequence_number)\n{\n    LOG(info) << \"Consolidating log at sequence number \" << sequence_number;\n}\n\n\nuint64_t\ndummy_pbft_service::applied_requests_count()\n{\n    return this->next_request_sequence - 1;\n}\n\nvoid\ndummy_pbft_service::register_execute_handler(execute_handler_t handler)\n{\n    this->execute_handler = std::move(handler);\n}\n\nbzn::hash_t\ndummy_pbft_service::service_state_hash(uint64_t sequence_number) const\n{\n    return \"I don't actually have a database [\" + std::to_string(sequence_number) + \"]\";\n}\n\nstd::shared_ptr<bzn::service_state_t>\ndummy_pbft_service::get_service_state(uint64_t sequence_number) const\n{\n    return std::make_shared<std::string>(\"I don't actually have a database [\" + std::to_string(sequence_number) + \"]\");\n}\n\nbool\ndummy_pbft_service::set_service_state(uint64_t /*sequence_number*/, const bzn::service_state_t& /*data*/)\n{\n    return true;\n}\n\nvoid\ndummy_pbft_service::save_service_state_at(uint64_t /*sequence_number*/)\n{\n}\n\nvoid\ndummy_pbft_service::send_execute_response(const std::shared_ptr<pbft_operation>& op)\n{\n    database_response resp;\n    resp.mutable_read()->set_value(\"dummy database execution of sequence \" + std::to_string(op->get_sequence()));\n\n    LOG(debug) << \"Sending request result \" << resp.ShortDebugString();\n    op->session()->send_message(std::make_shared<std::string>(resp.SerializeAsString()));\n}\n"
  },
  {
    "path": "pbft/dummy_pbft_service.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <pbft/pbft_service_base.hpp>\n#include <include/boost_asio_beast.hpp>\n#include <unordered_map>\n\nnamespace bzn\n{\n    // This is a placeholder implementation! Eventually, a pbft_service will\n    // wrap crud. It needs to be that way around (rather than crud calling\n    // pbft) because pbft needs to decide when crud gets to see messages.\n\n    class dummy_pbft_service : public bzn::pbft_service_base\n    {\n    public:\n        dummy_pbft_service(std::shared_ptr<bzn::asio::io_context_base> io_context);\n        void apply_operation(const std::shared_ptr<pbft_operation>& op) override;\n        bool apply_operation_now(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> session) override;\n        void consolidate_log(uint64_t sequence_number) override;\n        void register_execute_handler(execute_handler_t handler) override;\n        bzn::hash_t service_state_hash(uint64_t sequence_number) const override;\n        std::shared_ptr<bzn::service_state_t> get_service_state(uint64_t sequence_number) const override;\n        bool set_service_state(uint64_t sequence_number, const bzn::service_state_t& data) override;\n        void save_service_state_at(uint64_t sequence_number) override;\n\n        uint64_t applied_requests_count();\n\n    private:\n        execute_handler_t execute_handler;\n        std::shared_ptr<bzn::asio::io_context_base> io_context;\n        void send_execute_response(const std::shared_ptr<pbft_operation>& op);\n\n        uint64_t next_request_sequence = 1;\n\n        std::unordered_map<uint64_t, std::shared_ptr<pbft_operation>> waiting_operations;\n\n        std::mutex lock;\n    };\n\n}\n"
  },
  {
    "path": "pbft/operations/CMakeLists.txt",
    "content": "add_library(pbft_operations STATIC\n    pbft_operation.hpp\n    pbft_operation.cpp\n    pbft_memory_operation.hpp\n    pbft_memory_operation.cpp\n    pbft_persistent_operation.cpp\n    pbft_persistent_operation.cpp\n    pbft_operation_manager.hpp\n    pbft_operation_manager.cpp\n    )\n\ntarget_link_libraries(pbft_operations utils proto pbft)\ntarget_include_directories(pbft_operations PRIVATE ${BLUZELLE_STD_INCLUDES})\n\nadd_subdirectory(test)\n"
  },
  {
    "path": "pbft/operations/pbft_memory_operation.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <pbft/operations/pbft_memory_operation.hpp>\n#include <boost/format.hpp>\n#include <string>\n#include <pbft/pbft.hpp>\n\nusing namespace bzn;\n\npbft_memory_operation::pbft_memory_operation(uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash)\n        : pbft_operation(view, sequence, request_hash)\n{\n}\n\nbool\npbft_memory_operation::has_request() const\n{\n    return this->request_saved;\n}\n\nbool\npbft_memory_operation::has_db_request() const\n{\n    return this->has_request() && this->request.payload_case() == bzn_envelope::kDatabaseMsg;\n}\n\nbool\npbft_memory_operation::has_config_request() const\n{\n    return this->has_request() && this->request.payload_case() == bzn_envelope::kPbftInternalRequest;\n}\n\nconst bzn_envelope&\npbft_memory_operation::get_request() const\n{\n    if (!this->request_saved)\n    {\n        throw std::runtime_error(\"Tried to get a request that is not saved\");\n    }\n\n    return this->request;\n}\n\nconst pbft_config_msg&\npbft_memory_operation::get_config_request() const\n{\n    if (!this->has_config_request())\n    {\n        throw std::runtime_error(\"Tried to get a config request that is not saved\");\n    }\n\n    return this->parsed_config;\n}\n\nconst database_msg&\npbft_memory_operation::get_database_msg() const\n{\n    if (!this->has_db_request())\n    {\n        throw std::runtime_error(\"Tried to get a db request that is not saved\");\n    }\n\n    return this->parsed_db;\n}\n\nvoid\npbft_memory_operation::record_request(const bzn_envelope& wrapped_request)\n{\n\n    if (wrapped_request.payload_case() == bzn_envelope::kDatabaseMsg)\n    {\n        if (!this->parsed_db.ParseFromString(wrapped_request.database_msg()))\n        {\n            LOG(error) << \"Failed to parse database request\";\n            LOG(error) << wrapped_request.database_msg();\n            return;\n        }\n    }\n    else if (wrapped_request.payload_case() == bzn_envelope::kPbftInternalRequest)\n    {\n        if (!this->parsed_config.ParseFromString(wrapped_request.pbft_internal_request()))\n        {\n            LOG(error) << \"Failed to parse pbft internal request\";\n            return;\n        }\n    }\n    else\n    {\n        LOG(error) << \"Tried to record request as envelope that does not actually contain a request type\";\n        return;\n    }\n\n    this->request = wrapped_request;\n    this->request_saved = true;\n\n}\n\nvoid pbft_memory_operation::record_pbft_msg(const pbft_msg& message, const bzn_envelope& original_message)\n{\n    switch(message.type())\n    {\n        case pbft_msg_type::PBFT_MSG_PREPREPARE :\n            this->preprepare_seen = true;\n            this->preprepare_message = original_message;\n            break;\n        case pbft_msg_type::PBFT_MSG_PREPARE :\n            this->prepares_seen.emplace(original_message.sender());\n            this->prepare_messages[original_message.sender()] = original_message;\n            break;\n        case pbft_msg_type::PBFT_MSG_COMMIT :\n            this->commits_seen.emplace(original_message.sender());\n            break;\n        default:\n            throw std::runtime_error(\"this is not an appropriate pbft_msg_type\");\n    }\n\n    //TODO: save original message\n}\n\nbool\npbft_memory_operation::is_preprepared() const\n{\n    return this->preprepare_seen;\n}\n\nbool\npbft_memory_operation::is_ready_for_commit(const std::shared_ptr<bzn::peers_beacon_base>& peers) const\n{\n    // TODO: may have to count based only on uuids that are still in the peers list\n    return this->has_request() && this->is_preprepared() && this->prepares_seen.size() >= pbft::honest_majority_size(peers->current()->size());\n}\n\nbool\npbft_memory_operation::is_ready_for_execute(const std::shared_ptr<bzn::peers_beacon_base>& peers) const\n{\n    // TODO: may have to count based only on uuids that are still in the peers list\n    return this->is_prepared() && this->commits_seen.size() >= pbft::honest_majority_size(peers->current()->size());\n}\n\nbool\npbft_memory_operation::is_prepared() const\n{\n    return this->stage != pbft_operation_stage::prepare;\n}\n\nbool\npbft_memory_operation::is_committed() const\n{\n    return this->stage == pbft_operation_stage::execute;\n}\n\nvoid\npbft_memory_operation::advance_operation_stage(bzn::pbft_operation_stage new_stage, const std::shared_ptr<bzn::peers_beacon_base>& peers)\n{\n    switch(new_stage)\n    {\n        case pbft_operation_stage::prepare :\n            throw std::runtime_error(\"cannot advance to initial stage\");\n        case pbft_operation_stage::commit :\n            if (!this->is_ready_for_commit(peers) || this->stage != pbft_operation_stage::prepare)\n            {\n                throw std::runtime_error(\"illegal move to commit phase\");\n            }\n            break;\n        case pbft_operation_stage::execute :\n            if (!this->is_ready_for_execute(peers) || this->stage != pbft_operation_stage::commit)\n            {\n                throw std::runtime_error(\"illegal move to execute phase\");\n            }\n            break;\n        default:\n            throw std::runtime_error(\"unknown pbft_operation_stage\");\n    }\n\n    this->stage = new_stage;\n}\n\npbft_operation_stage\npbft_memory_operation::get_stage() const\n{\n    return this->stage;\n}\n\nbzn_envelope\npbft_memory_operation::get_preprepare() const\n{\n    return this->preprepare_message;\n}\n\nstd::map<bzn::uuid_t, bzn_envelope>\npbft_memory_operation::get_prepares() const\n{\n    return this->prepare_messages;\n}\n"
  },
  {
    "path": "pbft/operations/pbft_memory_operation.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <pbft/operations/pbft_operation.hpp>\n#include <peers_beacon/peer_address.hpp>\n\nnamespace bzn\n{\n    class pbft_memory_operation : public pbft_operation\n    {\n    public:\n\n        pbft_memory_operation(uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash);\n\n        pbft_operation_stage get_stage() const override;\n\n        void record_pbft_msg(const pbft_msg& msg, const bzn_envelope& encoded_msg) override;\n\n        bool is_preprepared() const override;\n        bool is_prepared() const override;\n        bool is_committed() const override;\n\n        bool is_ready_for_commit(const std::shared_ptr<bzn::peers_beacon_base>& peers) const override;\n        bool is_ready_for_execute(const std::shared_ptr<bzn::peers_beacon_base>& peers) const override;\n\n        void advance_operation_stage(pbft_operation_stage new_stage, const std::shared_ptr<bzn::peers_beacon_base>& peers) override;\n\n        void record_request(const bzn_envelope& encoded_request) override;\n        bool has_request() const override;\n        bool has_db_request() const override;\n        bool has_config_request() const override;\n\n        const bzn_envelope& get_request() const override;\n        const pbft_config_msg& get_config_request() const override;\n        const database_msg& get_database_msg() const override;\n\n        bzn_envelope get_preprepare() const override ;\n        std::map<uuid_t, bzn_envelope> get_prepares() const override;\n\n    private:\n        bzn_envelope preprepare_message;\n        std::map<bzn::uuid_t, bzn_envelope> prepare_messages;\n\n        pbft_operation_stage stage = pbft_operation_stage::prepare;\n\n        bool preprepare_seen = false;\n        std::set<bzn::uuid_t> prepares_seen;\n        std::set<bzn::uuid_t> commits_seen;\n\n        bzn_envelope request;\n        database_msg parsed_db;\n        pbft_config_msg parsed_config;\n\n        bool request_saved = false;\n\n        const std::shared_ptr<peers_beacon_base> peers;\n    };\n}\n"
  },
  {
    "path": "pbft/operations/pbft_operation.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <pbft/operations/pbft_operation.hpp>\n\nusing namespace bzn;\n\npbft_operation::pbft_operation(uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash)\n        : view(view)\n        , sequence(sequence)\n        , request_hash(request_hash)\n{\n}\n\noperation_key_t\npbft_operation::get_operation_key() const\n{\n    return {this->view, this->sequence, this->request_hash};\n}\n\nvoid\npbft_operation::set_session(std::shared_ptr<bzn::session_base> session)\n{\n    this->listener_session = std::move(session);\n    this->session_saved = true;\n}\n\nstd::shared_ptr<bzn::session_base>\npbft_operation::session() const\n{\n    return this->listener_session;\n}\n\nbool\npbft_operation::has_session() const\n{\n    return this->session_saved;\n}\n\nuint64_t\npbft_operation::get_sequence() const\n{\n    return this->sequence;\n}\n\nuint64_t\npbft_operation::get_view() const\n{\n    return this->view;\n}\n\nconst hash_t&\npbft_operation::get_request_hash() const\n{\n    return this->request_hash;\n}\n"
  },
  {
    "path": "pbft/operations/pbft_operation.hpp",
    "content": "// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <include/bluzelle.hpp>\n#include <node/session_base.hpp>\n#include <proto/database.pb.h>\n#include <proto/pbft.pb.h>\n#include <cstdint>\n#include <peers_beacon/peers_beacon_base.hpp>\n\nnamespace bzn\n{\n    // View, sequence, hash\n    using operation_key_t = std::tuple<uint64_t, uint64_t, hash_t>;\n\n    // View, sequence\n    using log_key_t = std::tuple<uint64_t, uint64_t>;\n\n    enum class pbft_operation_stage\n    {\n        prepare, commit, execute\n    };\n\n    class pbft_operation\n    {\n    public:\n\n        pbft_operation(uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash);\n\n        /**\n         * Store a session that waits on the result of the operation (will not persist across crashes)\n         * @param session shared_ptr to session\n         */\n        virtual void set_session(std::shared_ptr<bzn::session_base> session);\n\n        /**\n         * @return the saved session, if any\n         */\n        virtual std::shared_ptr<bzn::session_base> session() const;\n\n        /**\n         * @return do we have a session\n         */\n        virtual bool has_session() const;\n\n        /**\n         * @return the operation_key_t that uniquely identifies this operation\n         */\n        virtual operation_key_t get_operation_key() const;\n\n        virtual uint64_t get_sequence() const;\n        virtual uint64_t get_view() const;\n        virtual const hash_t& get_request_hash() const;\n\n        /**\n         * @return the current stage of the operation, defined as\n         * pbft_operation_stage::prepare: waiting for preprepare and 2f+1 prepares\n         * pbft_operation_stage::commit: prepared, waiting for 2f+1 commits\n         * pbft_operation_stage::execute: committed-local, ready to be executed\n         */\n        virtual pbft_operation_stage get_stage() const = 0;\n\n        /**\n         * Save a pbft_message about this operation\n         * @param msg preprepare/prepare/commit\n         * @param encoded_msg the original message containing this message, signature intact.\n         */\n        virtual void record_pbft_msg(const pbft_msg& msg, const bzn_envelope& encoded_msg) = 0;\n\n        /**\n         * @return has this operation moved to the prepare phase\n         */\n        virtual bool is_preprepared() const = 0;\n\n        /**\n         * @return has this operation moved to the commit phase\n         */\n        virtual bool is_prepared() const = 0;\n\n        /**\n         * @return has this operation moved to the execute phase\n         */\n        virtual bool is_committed() const = 0;\n\n        /**\n         * @return is this operation ready to move to the commit phase\n         */\n        virtual bool is_ready_for_commit(const std::shared_ptr<bzn::peers_beacon_base>& peers) const = 0;\n\n        /**\n         * @return is this operation ready to move to the execute phase\n         */\n        virtual bool is_ready_for_execute(const std::shared_ptr<bzn::peers_beacon_base>& peers) const = 0;\n\n        /**\n         * record the request that this operation is for. caller is responsible for checking that the request's hash\n         * actually matches this operation's hash.\n         * @param encoded_request original message containing the request, signature intact\n         */\n        virtual void record_request(const bzn_envelope& encoded_request) = 0;\n\n        /**\n         * advance the operation to the next stage, checking that doing so is legal\n         * @param new_stage\n         */\n        virtual void advance_operation_stage(pbft_operation_stage new_stage, const std::shared_ptr<bzn::peers_beacon_base>& peers) = 0;\n\n        /**\n         * @return do we know the full request associated with this operation?\n         */\n        virtual bool has_request() const = 0;\n\n        /**\n         * @return do we know the full request associated with this operation, and is it a database request?\n         */\n        virtual bool has_db_request() const = 0;\n\n        /**\n         * @return do we know the full request associated with this operation, and is it a new configuration?\n         */\n        virtual bool has_config_request() const = 0;\n\n        /**\n         * @return the signed envelope containing the request associated with this operation\n         */\n        virtual const bzn_envelope& get_request() const = 0;\n\n        /**\n         * @return the parsed new configuration associated with this operation\n         */\n        virtual const pbft_config_msg& get_config_request() const = 0;\n\n        /**\n         * @return the parsed database_msg associated wtih this operation\n         */\n        virtual const database_msg& get_database_msg() const = 0;\n\n        /**\n         * @return the recorded preprepare envelope\n         */\n        virtual bzn_envelope get_preprepare() const = 0;\n\n        /**\n         * @return the collection of saved prepare envelopes as a map of sender -> envelope\n         */\n        virtual std::map<uuid_t, bzn_envelope> get_prepares() const = 0;\n\n        virtual ~pbft_operation() = default;\n\n    private:\n        bool session_saved = false;\n        std::shared_ptr<bzn::session_base> listener_session;\n\n        const uint64_t view;\n        const uint64_t sequence;\n        const bzn::hash_t request_hash;\n    };\n}\n"
  },
  {
    "path": "pbft/operations/pbft_operation_manager.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <pbft/operations/pbft_operation_manager.hpp>\n#include <pbft/operations/pbft_memory_operation.hpp>\n#include <pbft/operations/pbft_persistent_operation.hpp>\n#include <utils/bytes_to_debug_string.hpp>\n#include <boost/format.hpp>\n\nusing namespace bzn;\n\npbft_operation_manager::pbft_operation_manager(std::shared_ptr<bzn::peers_beacon_base> peers, std::optional<std::shared_ptr<bzn::storage_base>> storage)\n    : peers(peers)\n    , storage(storage)\n{\n    if (!storage)\n    {\n        LOG(warning) << \"pbft operation operation manager constructed without a storage backend; operations will not be persistent\";\n    }\n}\n\nstd::shared_ptr<pbft_operation>\npbft_operation_manager::find_or_construct(uint64_t view, uint64_t sequence, const bzn::hash_t &request_hash)\n{\n    std::lock_guard<std::mutex> lock(this->pbft_lock);\n\n    auto key = bzn::operation_key_t(view, sequence, request_hash);\n\n    auto lookup = this->held_operations.find(key);\n    if (lookup == this->held_operations.end())\n    {\n        LOG(debug) << \"Creating operation for seq \" << sequence << \" view \" << view << \" req \" << bytes_to_debug_string(request_hash);\n\n        std::shared_ptr<pbft_operation> op;\n        if (this->storage)\n        {\n            op = std::make_shared<pbft_persistent_operation>(view, sequence, request_hash, *(this->storage));\n        }\n        else\n        {\n            op = std::make_shared<pbft_memory_operation>(view, sequence, request_hash);\n        }\n\n        bool added;\n        std::tie(std::ignore, added) = this->held_operations.emplace(std::piecewise_construct, std::forward_as_tuple(std::move(key)), std::forward_as_tuple(op));\n        assert(added);\n\n        return op;\n    }\n\n    return lookup->second;\n}\n\nstd::shared_ptr<pbft_operation>\npbft_operation_manager::find_or_construct(const pbft_msg& msg)\n{\n    return this->find_or_construct(msg.view(), msg.sequence(), msg.request_hash());\n}\n\nvoid\npbft_operation_manager::delete_operations_until(uint64_t sequence)\n{\n    std::lock_guard<std::mutex> lock(this->pbft_lock);\n\n    size_t ops_removed = 0;\n    auto it = this->held_operations.begin();\n    while (it != this->held_operations.end())\n    {\n        if (it->second->get_sequence() <= sequence)\n        {\n            it = this->held_operations.erase(it);\n            ops_removed++;\n        }\n        else\n        {\n            it++;\n        }\n    }\n\n    LOG(debug) << boost::format(\"Cleared %1% old operation records\") % ops_removed;\n\n    if (this->storage)\n    {\n        LOG(debug) << \"cleaning up operation state from storage\";\n        pbft_persistent_operation::remove_range(*this->storage, 0, sequence);\n    }\n}\n\nstd::map<uint64_t, std::shared_ptr<pbft_operation>>\npbft_operation_manager::prepared_operations_since(uint64_t sequence)\n{\n    // If there are multiple operations for a sequence number, we may return arbitrarily one of them, so long as we\n    // choose one thats prepared. We choose the one in the most recent view, which maximizes the likelihood of some\n    // simpleness with respect to dynamic peering. There cannot be multiple prepared operations with distinct\n    // request hashes because we wouldn't accept the preprepares.\n\n    std::map<uint64_t, std::shared_ptr<pbft_operation>> result;\n    const auto maybe_store = [&](const std::shared_ptr<pbft_operation>& op)\n    {\n        const auto search = result.find(op->get_sequence());\n        if (search == result.end() || result[op->get_sequence()]->get_view() < op->get_view())\n        {\n            result[op->get_sequence()] = op;\n        }\n    };\n\n    if (this->storage)\n    {\n        for (const auto& op : pbft_persistent_operation::prepared_operations_in_range(*this->storage, sequence + 1))\n        {\n            maybe_store(op);\n        }\n    }\n    else\n    {\n        for (const auto& pair : this->held_operations)\n        {\n            if (pair.second->get_sequence() > sequence && pair.second->is_prepared())\n            {\n                maybe_store(pair.second);\n            }\n        }\n    }\n\n    return result;\n}\n\nsize_t\npbft_operation_manager::held_operations_count()\n{\n    return this->held_operations.size();\n}\n"
  },
  {
    "path": "pbft/operations/pbft_operation_manager.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n#include <pbft/operations/pbft_operation.hpp>\n#include <include/bluzelle.hpp>\n#include <storage/storage_base.hpp>\n#include <optional>\n#include <mutex>\n#include <peers_beacon/peer_address.hpp>\n#include <peers_beacon/peers_beacon_base.hpp>\n\nnamespace bzn\n{\n    class pbft_operation_manager\n    {\n    public:\n        pbft_operation_manager(std::shared_ptr<bzn::peers_beacon_base> peers, std::optional<std::shared_ptr<bzn::storage_base>> storage = std::nullopt);\n\n        /*\n         * Returns a (possibly freshly constructed) pbft_operation for a particular view/sequence/request_hash.\n         * Guarenteed to consistently return the same pbft_operation instance over the lifetime of the\n         * pbft_operations_manager - this is important because pbft_operation only stores sessions in memory\n         */\n        std::shared_ptr<pbft_operation> find_or_construct(uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash);\n\n        std::shared_ptr<pbft_operation> find_or_construct(const pbft_msg& msg);\n\n        std::map<uint64_t, std::shared_ptr<pbft_operation>> prepared_operations_since(uint64_t sequence);\n\n        size_t held_operations_count();\n\n        void delete_operations_until(uint64_t sequence);\n\n    private:\n        std::mutex pbft_lock;\n        std::shared_ptr<bzn::peers_beacon_base> peers;\n        const std::optional<std::shared_ptr<bzn::storage_base>> storage;\n\n        std::map<bzn::operation_key_t, std::shared_ptr<pbft_operation>> held_operations;\n    };\n}\n"
  },
  {
    "path": "pbft/operations/pbft_persistent_operation.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <pbft/operations/pbft_persistent_operation.hpp>\n#include <boost/format.hpp>\n#include <include/bluzelle.hpp>\n#include <utils/bytes_to_debug_string.hpp>\n#include <pbft/pbft.hpp>\n#include <regex>\n#include <limits>\n\nusing namespace bzn;\n\nnamespace {\n    const std::string STAGE_KEY = \"stage\";\n    const std::string REQUEST_KEY = \"request\";\n    const std::string OPERATIONS_UUID = \"pbft_operations_data\";\n}\n\nstd::string\npbft_persistent_operation::generate_prefix(uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash)\n{\n    // Integers formatted to 20 digits, which is the maximum length of a 64 bit uint- they need to have constant length\n    // to be sorted correctly for prefix searches and the like\n    return (boost::format(\"%020u_%s_%020u\") % sequence % request_hash % view).str();\n}\n\nstd::string\npbft_persistent_operation::generate_key(const std::string& prefix, const std::string& key)\n{\n    // Integers formatted to 20 digits, which is the maximum length of a 64 bit uint- they need to have constant length\n    // to be sorted correctly for prefix searches and the like\n    return prefix + \"_\" + key;\n}\n\nstd::string\npbft_persistent_operation::prefix_for_sequence(uint64_t sequence)\n{\n    return (boost::format(\"%020u_\") % sequence).str();                // This is an inefficient search, but we can fix it if it matters\n\n}\n\nbool\npbft_persistent_operation::parse_prefix(const std::string& prefix, uint64_t& view, uint64_t& sequence, bzn::hash_t& hash)\n{\n    auto hash_start = prefix.find_first_of('_');\n    auto hash_end = prefix.find_last_of('_');\n    if (hash_end >= (prefix.size() - 1) || hash_start >= hash_end)\n    {\n        return false;\n    }\n\n    sequence = std::stoul(prefix.substr(0, hash_start));\n    view = std::stoul(prefix.substr(hash_end + 1));\n    hash = prefix.substr(hash_start + 1, hash_end - hash_start - 1);\n    return true;\n}\n\nconst std::string&\npbft_persistent_operation::get_uuid()\n{\n    return OPERATIONS_UUID;\n}\n\npbft_persistent_operation::pbft_persistent_operation(uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash, std::shared_ptr<bzn::storage_base> storage)\n        : pbft_operation(view, sequence, request_hash)\n        , storage(std::move(storage))\n        , prefix(pbft_persistent_operation::generate_prefix(view, sequence, request_hash))\n{\n    const auto response = this->storage->create(get_uuid(), generate_key(this->prefix, STAGE_KEY)\n        , std::to_string(static_cast<unsigned int>(pbft_operation_stage::prepare)));\n    switch (response)\n    {\n        case storage_result::ok:\n            LOG(trace) << \"created persistent operation with prefix \" << bzn::bytes_to_debug_string(this->prefix) << \"; this is our first record of it\";\n            break;\n        case storage_result::exists:\n            LOG(trace) << \"created persistent operation with prefix \" << bzn::bytes_to_debug_string(this->prefix) << \"; using existing records\";\n            break;\n        default:\n            throw std::runtime_error(\"failed to write stage of new persistent operation \" + storage_result_msg.at(response));\n    }\n}\n\n// constructs operation already in storage without re-adding to storage\npbft_persistent_operation::pbft_persistent_operation(std::shared_ptr<bzn::storage_base> storage, uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash)\n    : pbft_operation(view, sequence, request_hash)\n    , storage(std::move(storage))\n    , prefix(pbft_persistent_operation::generate_prefix(view, sequence, request_hash))\n{\n    assert(this->storage->read(get_uuid(), generate_key(this->prefix, STAGE_KEY)));\n    LOG(trace) << \"re-hydrated operation with prefix \" << bzn::bytes_to_debug_string(this->prefix);\n}\n\nvoid\npbft_persistent_operation::record_pbft_msg(const pbft_msg& msg, const bzn_envelope& encoded_msg)\n{\n    if (msg.type() != pbft_msg_type::PBFT_MSG_PREPREPARE\n       && msg.type() != pbft_msg_type::PBFT_MSG_PREPARE\n       && msg.type() != pbft_msg_type::PBFT_MSG_COMMIT)\n    {\n        LOG(error) << \"tried to record a pbft message with inappropriate type: \" << pbft_msg_type_Name(msg.type());\n        return;\n    }\n\n    const auto response = this->storage->create(get_uuid()\n        , generate_key(this->typed_prefix(msg.type()), encoded_msg.sender()), encoded_msg.SerializeAsString());\n\n    switch (response)\n    {\n        case storage_result::ok:\n            LOG(debug) << \"saved \" << pbft_msg_type_Name(msg.type()) << \" from \" << encoded_msg.sender() << \" for operation \" << bzn::bytes_to_debug_string(this->prefix);\n            break;\n        case storage_result::exists:\n            LOG(debug) << \"ignored duplicate \" << pbft_msg_type_Name(msg.type()) << \" from \" << encoded_msg.sender() << \" for operation \" << bzn::bytes_to_debug_string(this->prefix);\n            break;\n        default:\n            throw std::runtime_error(\"failed to write pbft_msg \" + storage_result_msg.at(response));\n    }\n}\n\npbft_operation_stage\npbft_persistent_operation::get_stage() const\n{\n    const auto response = this->storage->read(get_uuid(), generate_key(this->prefix, STAGE_KEY));\n    if (!response)\n    {\n        throw std::runtime_error(\"failed to read stage of pbft_operation \" + bzn::bytes_to_debug_string(this->prefix) + \" from storage\");\n    }\n    return static_cast<pbft_operation_stage>(std::stoi(*response));\n}\n\nvoid\npbft_persistent_operation::advance_operation_stage(pbft_operation_stage new_stage, const std::shared_ptr<bzn::peers_beacon_base>& peers)\n{\n    switch (new_stage)\n    {\n        case pbft_operation_stage::prepare :\n            throw std::runtime_error(\"cannot advance to initial stage\");\n        case pbft_operation_stage::commit :\n            if (!this->is_ready_for_commit(peers) || this->get_stage() != pbft_operation_stage::prepare)\n            {\n                throw std::runtime_error(\"illegal move to commit phase\");\n            }\n            break;\n        case pbft_operation_stage::execute :\n            if (!this->is_ready_for_execute(peers) || this->get_stage() != pbft_operation_stage::commit)\n            {\n                throw std::runtime_error(\"illegal move to execute phase\");\n            }\n            break;\n        default:\n            throw std::runtime_error(\"unknown pbft_operation_stage: \" + std::to_string(static_cast<int>(new_stage)));\n    }\n\n    const auto response = this->storage->update(get_uuid(), generate_key(this->prefix, STAGE_KEY)\n        , std::to_string(static_cast<int>(new_stage)));\n    if (response != storage_result::ok)\n    {\n        throw std::runtime_error(\"failed to write operation stage update: \" + storage_result_msg.at(response));\n    }\n}\n\nbool\npbft_persistent_operation::is_preprepared() const\n{\n    // TODO: maybe check if the sender of the preprepare is still in the peers list\n    auto prefix = this->typed_prefix(pbft_msg_type::PBFT_MSG_PREPREPARE);\n    return this->storage->get_keys_if(get_uuid(), prefix, this->increment_prefix(prefix)).size() > 0;\n}\n\nbool\npbft_persistent_operation::is_prepared() const\n{\n    return this->get_stage() != pbft_operation_stage::prepare;\n}\n\nbool\npbft_persistent_operation::is_committed() const\n{\n    return this->get_stage() == pbft_operation_stage::execute;\n}\n\nbool\npbft_persistent_operation::is_ready_for_commit(const std::shared_ptr<bzn::peers_beacon_base>& peers) const\n{\n    auto prefix = this->typed_prefix(pbft_msg_type::PBFT_MSG_PREPARE);\n    return this->storage->get_keys_if(get_uuid(), prefix, this->increment_prefix(prefix)).size()\n        >= pbft::honest_majority_size(peers->current()->size()) && this->is_preprepared() && this->has_request();\n}\n\nbool\npbft_persistent_operation::is_ready_for_execute(const std::shared_ptr<bzn::peers_beacon_base>& peers) const\n{\n    auto prefix = this->typed_prefix(pbft_msg_type::PBFT_MSG_COMMIT);\n    return this->storage->get_keys_if(get_uuid(), prefix, this->increment_prefix(prefix)).size()\n        >= pbft::honest_majority_size(peers->current()->size()) && this->is_prepared();\n}\n\nvoid\npbft_persistent_operation::record_request(const bzn_envelope& encoded_request)\n{\n    if (this->transient_request_available)\n    {\n        LOG(trace) << \"ignoring record of request for operation \" << bzn::bytes_to_debug_string(this->prefix) << \" because we already have one\";\n        return;\n    }\n\n    const auto response = this->storage->create(get_uuid(), generate_key(this->prefix, REQUEST_KEY)\n        , encoded_request.SerializeAsString());\n    switch (response)\n    {\n        case storage_result::ok:\n            LOG(trace) << \"recorded request for operation \" << bzn::bytes_to_debug_string(this->prefix);\n            break;\n        case storage_result::exists:\n            LOG(trace) << \"ignoring record of request for operation \" << bzn::bytes_to_debug_string(this->prefix) << \" because we already have one\";\n            break;\n        case storage_result::value_too_large:\n            LOG(debug) << \"request too large to store: \" << encoded_request.SerializeAsString().size() << \" bytes, \" << bzn::bytes_to_debug_string(this->prefix);\n            break;\n        default:\n            throw std::runtime_error(\"failed to write request for operation \" + bzn::bytes_to_debug_string(this->prefix));\n    }\n\n    // this will allow future calls to record_request to short circuit\n    this->load_transient_request();\n}\n\nbool\npbft_persistent_operation::has_request() const\n{\n    this->load_transient_request();\n    return this->transient_request_available;\n}\n\nvoid\npbft_persistent_operation::load_transient_request() const\n{\n    if (this->transient_request_available)\n    {\n        return;\n    }\n\n    const auto response = this->storage->read(get_uuid(), generate_key(this->prefix, REQUEST_KEY));\n    if (!response.has_value())\n    {\n        return;\n    }\n\n    this->transient_request.ParseFromString(*response);\n    this->transient_request_available = true;\n\n    if (this->transient_request.payload_case() == bzn_envelope::kDatabaseMsg)\n    {\n        this->transient_database_request.ParseFromString(this->transient_request.database_msg());\n    }\n    else if (this->transient_request.payload_case() == bzn_envelope::kPbftInternalRequest)\n    {\n        this->transient_config_request.ParseFromString(this->transient_request.pbft_internal_request());\n    }\n}\n\nbool\npbft_persistent_operation::has_db_request() const\n{\n    return this->has_request() && this->get_request().payload_case() == bzn_envelope::kDatabaseMsg;\n}\n\nbool\npbft_persistent_operation::has_config_request() const\n{\n    return this->has_request() && this->get_request().payload_case() == bzn_envelope::kPbftInternalRequest;\n}\n\nconst bzn_envelope&\npbft_persistent_operation::get_request() const\n{\n    if (!this->has_request())\n    {\n        throw std::runtime_error(\"tried to get request of operation \" + bzn::bytes_to_debug_string(this->prefix) + \"; we have no such request\");\n    }\n\n    return this->transient_request;\n}\n\nconst pbft_config_msg&\npbft_persistent_operation::get_config_request() const\n{\n    if (!this->has_config_request())\n    {\n        throw std::runtime_error(\"tried to get config request of operation \" + bzn::bytes_to_debug_string(this->prefix) + \"; we have no such request\");\n    }\n\n    return this->transient_config_request;\n\n}\n\nconst database_msg&\npbft_persistent_operation::get_database_msg() const\n{\n    if (!this->has_db_request())\n    {\n        throw std::runtime_error(\"tried to get database request of operation \" + bzn::bytes_to_debug_string(this->prefix) + \"; we have no such request\");\n    }\n\n    return this->transient_database_request;\n}\n\nstd::string\npbft_persistent_operation::typed_prefix(pbft_msg_type pbft_type) const\n{\n    return this->prefix + \"_\" + std::to_string(pbft_type);\n}\n\nbzn_envelope\npbft_persistent_operation::get_preprepare() const\n{\n    auto keys = this->storage->get_keys_if(get_uuid(), this->typed_prefix(pbft_msg_type::PBFT_MSG_PREPREPARE)\n        , this->typed_prefix(pbft_msg_type::PBFT_MSG_PREPARE));\n    if (keys.size() == 0)\n    {\n        throw std::runtime_error(\"tried to fetch a preprepare that we don't have for operation \" + bzn::bytes_to_debug_string(this->prefix));\n    }\n\n    bzn_envelope env;\n    if (!env.ParseFromString(this->storage->read(get_uuid(), keys.at(0)).value_or(\"\")))\n    {\n        throw std::runtime_error(\"failed to parse or fetch preprepare that we supposedly have? \" + bzn::bytes_to_debug_string(this->prefix));\n    }\n\n    return env;\n}\n\nstd::map<bzn::uuid_t, bzn_envelope>\npbft_persistent_operation::get_prepares() const\n{\n    auto keys = this->storage->get_keys_if(get_uuid(), this->typed_prefix(pbft_msg_type::PBFT_MSG_PREPARE)\n        , this->typed_prefix(pbft_msg_type::PBFT_MSG_COMMIT));\n    std::map<uuid_t, bzn_envelope> result;\n\n    for (const auto& key : keys)\n    {\n        if (!result[key].ParseFromString(this->storage->read(get_uuid(), key).value_or(\"\")))\n        {\n            throw std::runtime_error(\"failed to parse or fetch prepare that we supposedly have? \" + bzn::bytes_to_debug_string(this->prefix));\n        }\n    }\n\n    return result;\n}\n\nstd::vector<std::shared_ptr<pbft_persistent_operation>>\npbft_persistent_operation::prepared_operations_in_range(std::shared_ptr<bzn::storage_base> storage, uint64_t start\n    , std::optional<uint64_t> end)\n{\n    static const std::regex pattern(STAGE_KEY + \"$\");\n\n    auto first = (boost::format(\"%020u_\") % start).str();\n    auto last = end ? (boost::format(\"%020u_\") % *end).str() : \"\";\n    auto matches = storage->read_if(get_uuid(), first, last, [](const std::string& key, const std::string& value)->bool\n    {\n        return (value == std::to_string(static_cast<unsigned int>(pbft_operation_stage::commit))\n            || value == std::to_string(static_cast<unsigned int>(pbft_operation_stage::execute)))\n            && std::regex_search(key, pattern);\n    });\n\n    std::vector<std::shared_ptr<pbft_persistent_operation>> results;\n    for (const auto& m : matches)\n    {\n        auto prefix = m.first.substr(0, m.first.find(\"_\" + STAGE_KEY));\n        auto key = generate_key(prefix, REQUEST_KEY);\n        auto res = storage->read(get_uuid(), key);\n        if (res)\n        {\n            uint64_t view;\n            uint64_t sequence;\n            bzn::hash_t hash;\n            if (parse_prefix(prefix, view, sequence, hash))\n            {\n                auto op = std::make_shared<pbft_persistent_operation>(storage, view, sequence, hash);\n                results.push_back(op);\n            }\n            else\n            {\n                LOG(error) << boost::format(\"Unable to parse stored operation at view:%1% sequence:%2% hash:%3%\")\n                    % view % sequence % hash;\n            }\n        }\n    }\n\n    return results;\n}\n\nvoid\npbft_persistent_operation::remove_range(std::shared_ptr<bzn::storage_base> storage, uint64_t first, uint64_t last)\n{\n    storage->remove_range(get_uuid(), prefix_for_sequence(first), prefix_for_sequence(last));\n}\n\nstd::string\npbft_persistent_operation::increment_prefix(const std::string& prefix) const\n{\n    auto result = prefix;\n    if (result.back() < std::numeric_limits<char>::max())\n    {\n        result.back()++;\n    }\n    else\n    {\n        result += char(0x1);\n    }\n\n    return result;\n}\n"
  },
  {
    "path": "pbft/operations/pbft_persistent_operation.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <pbft/operations/pbft_operation.hpp>\n#include <storage/storage_base.hpp>\n#include <proto/pbft.pb.h>\n\nnamespace bzn\n{\n    class pbft_persistent_operation : public pbft_operation\n    {\n    public:\n        pbft_persistent_operation(uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash, std::shared_ptr<bzn::storage_base> storage);\n\n        // constructs operation already in storage\n        pbft_persistent_operation(std::shared_ptr<bzn::storage_base> storage, uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash);\n\n        void record_pbft_msg(const pbft_msg& msg, const bzn_envelope& encoded_msg) override;\n\n        pbft_operation_stage get_stage() const override;\n        void advance_operation_stage(pbft_operation_stage new_stage, const std::shared_ptr<bzn::peers_beacon_base>& peers) override;\n        bool is_preprepared() const override;\n        bool is_prepared() const override;\n        bool is_committed() const override;\n\n        bool is_ready_for_commit(const std::shared_ptr<bzn::peers_beacon_base>& peers) const override;\n        bool is_ready_for_execute(const std::shared_ptr<bzn::peers_beacon_base>& peers) const override;\n\n        void record_request(const bzn_envelope& encoded_request) override;\n        bool has_request() const override;\n        bool has_db_request() const override;\n        bool has_config_request() const override;\n\n        const bzn_envelope& get_request() const override;\n        const pbft_config_msg& get_config_request() const override;\n        const database_msg& get_database_msg() const override;\n\n        bzn_envelope get_preprepare() const override;\n        std::map<bzn::uuid_t, bzn_envelope> get_prepares() const override;\n\n        static std::string generate_prefix(uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash);\n        static const std::string& get_uuid();\n\n        static std::vector<std::shared_ptr<pbft_persistent_operation>> prepared_operations_in_range(\n            std::shared_ptr<bzn::storage_base> storage, uint64_t start, std::optional<uint64_t> end = std::nullopt);\n        static void remove_range(std::shared_ptr<bzn::storage_base> storage, uint64_t first, uint64_t last);\n\n    private:\n        std::string typed_prefix(pbft_msg_type pbft_type) const;\n        void load_transient_request() const;\n\n        static std::string prefix_for_sequence(uint64_t sequence);\n        static std::string generate_key(const std::string& prefix, const std::string& key);\n        static bool parse_prefix(const std::string& prefix, uint64_t& view, uint64_t& sequence, bzn::hash_t& hash);\n        std::string increment_prefix(const std::string& prefix) const;\n\n        const std::shared_ptr<bzn::storage_base> storage;\n        const std::string prefix;\n\n        mutable bool transient_request_available = false;\n        mutable bzn_envelope transient_request;\n        mutable database_msg transient_database_request;\n        mutable pbft_config_msg transient_config_request;\n    };\n\n}\n"
  },
  {
    "path": "pbft/operations/test/CMakeLists.txt",
    "content": "set(test_srcs\n        pbft_operation_test_common.cpp\n        pbft_persistent_operation_test.cpp\n        pbft_operation_manager_test.cpp\n    )\nset(test_libs pbft_operations storage pbft smart_mocks ${Protobuf_LIBRARIES})\n\nadd_gmock_test(pbft_operation)\n"
  },
  {
    "path": "pbft/operations/test/pbft_operation_manager_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <gtest/gtest.h>\n#include <peers_beacon/peer_address.hpp>\n#include <pbft/operations/pbft_operation_manager.hpp>\n#include <proto/pbft.pb.h>\n#include <mocks/smart_mock_peers_beacon.hpp>\n\nusing namespace ::testing;\n\nnamespace\n{\n    const std::vector<bzn::peer_address_t> TEST_PEER_LIST{{  \"127.0.0.1\", 8081, \"name1\", \"uuid0\"}\n                                           , {\"127.0.0.1\", 8082, \"name2\", \"uuid2\"}\n                                           , {\"127.0.0.1\", 8083, \"name3\", \"uuid3\"}\n                                           , {\"127.0.0.1\", 8084, \"name4\", \"uuid4\"}};\n\n    const auto peers_ptr = std::make_shared<std::vector<bzn::peer_address_t>>(TEST_PEER_LIST);\n\n    void make_prepared(const std::shared_ptr<bzn::pbft_operation>& op)\n    {\n        bzn_envelope outer;\n        pbft_msg inner;\n\n        inner.set_type(PBFT_MSG_PREPREPARE);\n        op->record_pbft_msg(inner, outer);\n\n        inner.set_type(PBFT_MSG_PREPARE);\n        for (const auto& peer : TEST_PEER_LIST)\n        {\n            outer.set_sender(peer.uuid);\n            op->record_pbft_msg(inner, outer);\n        }\n\n        database_msg req;\n        outer.set_database_msg(req.SerializeAsString());\n\n        op->record_request(outer);\n\n        op->advance_operation_stage(bzn::pbft_operation_stage::commit, static_peers_beacon_for(TEST_PEER_LIST));\n        EXPECT_TRUE(op->is_prepared());\n    }\n\n\n    TEST(pbft_operation_manager_test, returned_operation_matches_key)\n    {\n        bzn::pbft_operation_manager manager{static_peers_beacon_for(TEST_PEER_LIST)};\n        auto op = manager.find_or_construct(1, 6, \"hash\");\n        EXPECT_EQ(op->get_view(), 1u);\n        EXPECT_EQ(op->get_sequence(), 6u);\n        EXPECT_EQ(op->get_request_hash(), \"hash\");\n    }\n\n    TEST(pbft_operation_manager_test, returns_same_operation_instance)\n    {\n        bzn::pbft_operation_manager manager{static_peers_beacon_for(TEST_PEER_LIST)};\n        auto op1 = manager.find_or_construct(1, 6, \"hash\");\n        auto op2 = manager.find_or_construct(2, 6, \"hash\");\n        auto op3 = manager.find_or_construct(1, 6, \"hash\");\n\n        EXPECT_NE(op1, op2);\n        EXPECT_EQ(op1, op3);\n    }\n\n    TEST(pbft_operation_manager_test, prepared_operations_since_only_prepared_ops)\n    {\n        bzn::pbft_operation_manager manager{static_peers_beacon_for(TEST_PEER_LIST)};\n        auto op1 = manager.find_or_construct(1, 1, \"hash\");\n        auto op2 = manager.find_or_construct(1, 2, \"hash\");\n\n        make_prepared(op1);\n\n        auto prepared = manager.prepared_operations_since(0);\n        EXPECT_EQ(prepared.size(), 1u);\n        EXPECT_EQ(prepared.begin()->second, op1);\n    }\n\n    TEST(pbft_operation_manager_test, prepared_operations_since_prefers_prepared_ops_when_duplicate)\n    {\n        bzn::pbft_operation_manager manager{static_peers_beacon_for(TEST_PEER_LIST)};\n        auto op1 = manager.find_or_construct(1, 1, \"hash\");\n        auto op2 = manager.find_or_construct(2, 1, \"hash\");\n\n        make_prepared(op2);\n\n        auto prepared = manager.prepared_operations_since(0);\n        EXPECT_EQ(prepared.begin()->second, op2);\n    }\n\n    TEST(pbft_operation_manager_test, prepared_operations_since_no_duplicates)\n    {\n        bzn::pbft_operation_manager manager{static_peers_beacon_for(TEST_PEER_LIST)};\n        auto op1 = manager.find_or_construct(1, 1, \"hash\");\n        auto op2 = manager.find_or_construct(2, 1, \"hash\");\n        auto op3 = manager.find_or_construct(3, 1, \"hash\");\n        auto op4 = manager.find_or_construct(4, 1, \"hash\");\n\n        make_prepared(op1);\n        make_prepared(op2);\n\n        auto prepared = manager.prepared_operations_since(0);\n        EXPECT_EQ(prepared.size(), 1u);\n\n    }\n\n    TEST(pbft_operation_manager_test, delete_clears_operations)\n    {\n        bzn::pbft_operation_manager manager{static_peers_beacon_for(TEST_PEER_LIST)};\n        auto op1 = manager.find_or_construct(1, 1, \"hash\");\n        auto op2 = manager.find_or_construct(2, 2, \"hash\");\n        auto op3 = manager.find_or_construct(3, 3, \"hash\");\n        auto op4 = manager.find_or_construct(4, 4, \"hash\");\n\n        EXPECT_EQ(manager.held_operations_count(), 4u);\n        manager.delete_operations_until(2);\n        EXPECT_EQ(manager.held_operations_count(), 2u);\n        manager.delete_operations_until(4);\n        EXPECT_EQ(manager.held_operations_count(), 0u);\n\n    }\n}\n"
  },
  {
    "path": "pbft/operations/test/pbft_operation_test_common.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n\n#include <gtest/gtest.h>\n#include <include/bluzelle.hpp>\n#include <pbft/operations/pbft_memory_operation.hpp>\n#include <proto/bluzelle.pb.h>\n#include <peers_beacon/peer_address.hpp>\n#include <pbft/operations/pbft_persistent_operation.hpp>\n#include <storage/mem_storage.hpp>\n#include <mocks/smart_mock_peers_beacon.hpp>\n\nusing namespace ::testing;\n\nnamespace\n{\n\n    const bzn::uuid_t TEST_NODE_UUID{\"uuid4\"};\n\n    const std::vector<bzn::peer_address_t> TEST_PEER_LIST{{  \"127.0.0.1\", 8081, \"name1\", \"uuid1\"}\n                                           , {\"127.0.0.1\", 8082, \"name2\", \"uuid2\"}\n                                           , {\"127.0.0.1\", 8083, \"name3\", \"uuid3\"}\n                                           , {\"127.0.0.1\", 8084, \"name4\", TEST_NODE_UUID}};\n\n    const std::vector<bzn::peer_address_t> TEST_2F_PEER_LIST{{  \"127.0.0.1\", 8081, \"name1\", \"uuid1\"}\n                                              , {\"127.0.0.1\", 8084, \"name4\", TEST_NODE_UUID}};\n\n    const std::vector<bzn::peer_address_t> TEST_2F_PLUS_1_PEER_LIST{{  \"127.0.0.1\", 8081, \"name1\", \"uuid1\"}\n                                                     , {\"127.0.0.1\", 8082, \"name2\", \"uuid2\"}\n                                                     , {\"127.0.0.1\", 8084, \"name4\", TEST_NODE_UUID}};\n\n\n    class pbft_operation_test_common : public Test\n    {\n    public:\n        bzn_envelope request;\n        bzn::hash_t request_hash = \"somehash\";\n        uint64_t view = 6;\n        uint64_t sequence = 19;\n        std::shared_ptr<bzn::peers_beacon_base> static_beacon = static_peers_beacon_for(TEST_PEER_LIST);\n\n        std::shared_ptr<bzn::storage_base> storage = std::make_shared<bzn::mem_storage>();\n\n        std::vector<std::shared_ptr<bzn::pbft_operation>> operations{\n            std::make_shared<bzn::pbft_memory_operation>(view, sequence, request_hash),\n            std::make_shared<bzn::pbft_persistent_operation>(view, sequence, request_hash, this->storage)\n        };\n\n        bzn_envelope empty_original_msg;\n\n        pbft_msg preprepare;\n        pbft_msg prepare;\n        pbft_msg commit;\n\n        pbft_operation_test_common()\n        {\n            database_msg msg;\n            request.set_database_msg(msg.SerializeAsString());\n\n            this->preprepare.set_type(pbft_msg_type::PBFT_MSG_PREPREPARE);\n            this->prepare.set_type(pbft_msg_type::PBFT_MSG_PREPARE);\n            this->commit.set_type(pbft_msg_type::PBFT_MSG_COMMIT);\n        }\n    };\n\n\n    TEST_F(pbft_operation_test_common, initially_unprepared)\n    {\n        for (const auto& op : this->operations){\n            EXPECT_FALSE(op->is_prepared());\n        }\n    }\n\n\n    TEST_F(pbft_operation_test_common, prepared_after_all_msgs)\n    {\n        for (const auto& op : this->operations)\n        {\n            op->record_pbft_msg(this->preprepare, this->empty_original_msg);\n            op->record_request(this->request);\n\n            for (const auto& peer : TEST_PEER_LIST)\n            {\n                bzn_envelope msg;\n                msg.set_sender(peer.uuid);\n                op->record_pbft_msg(this->prepare, msg);\n            }\n\n            EXPECT_TRUE(op->is_ready_for_commit(this->static_beacon));\n        }\n    }\n\n    TEST_F(pbft_operation_test_common, not_prepared_without_request)\n    {\n        for (const auto& op : this->operations)\n        {\n            op->record_pbft_msg(this->preprepare, this->empty_original_msg);\n\n            for (const auto& peer : TEST_PEER_LIST)\n            {\n                bzn_envelope msg;\n                msg.set_sender(peer.uuid);\n                op->record_pbft_msg(this->prepare, msg);\n            }\n\n            EXPECT_FALSE(op->is_ready_for_commit(this->static_beacon));\n        }\n    }\n\n\n    TEST_F(pbft_operation_test_common, not_prepared_without_preprepare)\n    {\n        for (const auto& op : this->operations)\n        {\n            for (const auto& peer : TEST_PEER_LIST)\n            {\n                bzn_envelope msg;\n                msg.set_sender(peer.uuid);\n                op->record_pbft_msg(this->prepare, msg);\n            }\n\n            EXPECT_FALSE(op->is_ready_for_commit(this->static_beacon));\n        }\n    }\n\n\n    TEST_F(pbft_operation_test_common, not_prepared_with_2f)\n    {\n        for (const auto& op : this->operations)\n        {\n            op->record_pbft_msg(this->preprepare, this->empty_original_msg);\n\n            for (const auto& peer : TEST_2F_PEER_LIST)\n            {\n                bzn_envelope msg;\n                msg.set_sender(peer.uuid);\n                op->record_pbft_msg(this->prepare, msg);\n            }\n\n            EXPECT_FALSE(op->is_ready_for_commit(this->static_beacon));\n        }\n    }\n\n\n    TEST_F(pbft_operation_test_common, prepared_with_2f_PLUS_1)\n    {\n        for (const auto& op : this->operations)\n        {\n            op->record_pbft_msg(this->preprepare, this->empty_original_msg);\n            op->record_request(this->request);\n\n            for (const auto& peer : TEST_2F_PLUS_1_PEER_LIST)\n            {\n                bzn_envelope msg;\n                msg.set_sender(peer.uuid);\n                op->record_pbft_msg(this->prepare, msg);\n            }\n\n            EXPECT_TRUE(op->is_ready_for_commit(this->static_beacon));\n        }\n    }\n\n    TEST_F(pbft_operation_test_common, remembers_preprepare)\n    {\n        for (const auto& op : this->operations)\n        {\n            bzn_envelope env;\n            env.set_sender(\"alice\");\n            op->record_pbft_msg(this->preprepare, env);\n\n            EXPECT_EQ(op->get_preprepare().sender(), \"alice\");\n        }\n    }\n\n    TEST_F(pbft_operation_test_common, remembers_multiple_distinct_prepares)\n    {\n        for (const auto& op : this->operations)\n        {\n            bzn_envelope env;\n\n            env.set_sender(\"alice\");\n            op->record_pbft_msg(this->prepare, env);\n\n            env.set_sender(\"bob\");\n            op->record_pbft_msg(this->prepare, env);\n\n            env.set_sender(\"carlos\");\n            op->record_pbft_msg(this->prepare, env);\n\n            EXPECT_EQ(op->get_prepares().size(), 3u);\n        }\n    }\n\n    TEST_F(pbft_operation_test_common, ignores_duplicate_prepares)\n    {\n        for (const auto& op : this->operations)\n        {\n            bzn_envelope env;\n\n            op->record_request(this->request);\n            op->record_pbft_msg(this->preprepare, env);\n\n            env.set_sender(\"alice\");\n            op->record_pbft_msg(this->prepare, env);\n\n            env.set_sender(\"mallory\");\n            op->record_pbft_msg(this->prepare, env);\n            op->record_pbft_msg(this->prepare, env);\n            op->record_pbft_msg(this->prepare, env);\n\n            EXPECT_EQ(op->get_prepares().size(), 2u);\n            EXPECT_FALSE(op->is_ready_for_commit(this->static_beacon));\n        }\n    }\n}\n"
  },
  {
    "path": "pbft/operations/test/pbft_persistent_operation_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <gtest/gtest.h>\n#include <storage/mem_storage.hpp>\n#include <proto/pbft.pb.h>\n#include <proto/database.pb.h>\n#include <pbft/operations/pbft_persistent_operation.hpp>\n#include <pbft/operations/pbft_operation.hpp>\n#include <boost/range/irange.hpp>\n#include <mocks/smart_mock_peers_beacon.hpp>\n\nusing namespace ::testing;\n\nnamespace\n{\n    const std::vector<bzn::uuid_t> UUIDS{\"alice\", \"bob\", \"cindy\", \"dave\"};\n    const std::vector<bzn::peer_address_t> TEST_PEER_LIST{{  \"127.0.0.1\", 8081, \"name1\", \"alice\"}\n                                                          , {\"127.0.0.1\", 8082, \"name2\", \"bob\"}\n                                                          , {\"127.0.0.1\", 8083, \"name3\", \"cindy\"}\n                                                          , {\"127.0.0.1\", 8084, \"name4\", \"dave\"}};\n\n    void record_pbft_messages(int from, int until, pbft_msg_type type, std::shared_ptr<bzn::pbft_operation> op)\n    {\n        pbft_msg message;\n        message.set_view(op->get_view());\n        message.set_sequence(op->get_sequence());\n        message.set_request_hash(op->get_request_hash());\n        message.set_type(type);\n\n        for (; from<until; from++)\n        {\n            bzn_envelope message_env;\n\n            message_env.set_pbft(message.SerializeAsString());\n            message_env.set_sender(UUIDS.at(from));\n\n            op->record_pbft_msg(message, message_env);\n        }\n    }\n\n    void record_request(std::shared_ptr<bzn::pbft_operation> op, uint64_t nonce = 6)\n    {\n        database_msg request;\n        bzn_envelope request_env;\n\n        request.mutable_header()->set_nonce(nonce);\n\n        request_env.set_database_msg(request.SerializeAsString());\n        request_env.set_sender(\"a client\");\n\n        op->record_request(request_env);\n    }\n\n    class persistent_operation_test : public Test\n    {\n    public:\n\n        const uint64_t view = 1;\n        const uint64_t sequence = 2;\n        const std::string request_hash = \"a very hashy hash\";\n        const size_t peers_size = 4;\n\n        std::shared_ptr<bzn::peers_beacon_base> static_beacon = static_peers_beacon_for(TEST_PEER_LIST);\n\n        std::shared_ptr<bzn::storage_base> storage = std::make_shared<bzn::mem_storage>();\n        std::shared_ptr<bzn::pbft_operation> operation = std::make_shared<bzn::pbft_persistent_operation>(this->view, this->sequence, this->request_hash, this->storage);\n\n    };\n\n    TEST_F(persistent_operation_test, remembers_state_after_rehydrate)\n    {\n        record_request(this->operation);\n        record_pbft_messages(0, 1, PBFT_MSG_PREPREPARE, this->operation);\n        record_pbft_messages(0, 4, PBFT_MSG_PREPARE, this->operation);\n        this->operation->advance_operation_stage(bzn::pbft_operation_stage::commit, static_peers_beacon_for(TEST_PEER_LIST));\n\n        EXPECT_TRUE(this->operation->is_ready_for_commit(this->static_beacon));\n        EXPECT_EQ(this->operation->get_stage(), bzn::pbft_operation_stage::commit);\n\n        this->operation = nullptr;\n        auto op2 = std::make_shared<bzn::pbft_persistent_operation>(this->view, this->sequence, this->request_hash, this->storage);\n        EXPECT_TRUE(op2->is_ready_for_commit(this->static_beacon));\n        EXPECT_EQ(op2->get_stage(), bzn::pbft_operation_stage::commit);\n\n        auto op3 = std::make_shared<bzn::pbft_persistent_operation>(this->view, this->sequence+1, this->request_hash, this->storage);\n        EXPECT_FALSE(op3->is_ready_for_commit(this->static_beacon));\n        EXPECT_EQ(op3->get_stage(), bzn::pbft_operation_stage::prepare);\n    }\n\n    TEST_F(persistent_operation_test, remembers_request_after_rehydrate)\n    {\n        record_request(this->operation, 9999u);\n        EXPECT_TRUE(this->operation->has_db_request());\n        EXPECT_EQ(this->operation->get_database_msg().header().nonce(), 9999u);\n\n        this->operation = nullptr;\n        auto op2 = std::make_shared<bzn::pbft_persistent_operation>(this->view, this->sequence, this->request_hash, this->storage);\n        EXPECT_TRUE(op2->has_db_request());\n        EXPECT_EQ(op2->get_database_msg().header().nonce(), 9999u);\n\n        auto op3 = std::make_shared<bzn::pbft_persistent_operation>(this->view+1, this->sequence, this->request_hash, this->storage);\n        EXPECT_FALSE(op3->has_db_request());\n    }\n\n    TEST_F(persistent_operation_test, continue_progressing_state_after_rehydrate)\n    {\n        record_request(this->operation);\n        record_pbft_messages(0, 1, PBFT_MSG_PREPREPARE, this->operation);\n        record_pbft_messages(0, 2, PBFT_MSG_PREPARE, this->operation);\n\n        EXPECT_EQ(this->operation->get_stage(), bzn::pbft_operation_stage::prepare);\n        EXPECT_TRUE(this->operation->is_preprepared());\n        EXPECT_TRUE(this->operation->has_request());\n\n        this->operation = nullptr;\n        auto op2 = std::make_shared<bzn::pbft_persistent_operation>(this->view, this->sequence, this->request_hash, this->storage);\n\n        EXPECT_EQ(op2->get_stage(), bzn::pbft_operation_stage::prepare);\n        EXPECT_TRUE(op2->is_preprepared());\n        EXPECT_TRUE(op2->has_request());\n\n        record_pbft_messages(2, 4, PBFT_MSG_PREPARE, op2);\n        EXPECT_TRUE(op2->is_ready_for_commit(this->static_beacon));\n        op2->advance_operation_stage(bzn::pbft_operation_stage::commit, this->static_beacon);\n\n        record_pbft_messages(0, 4, PBFT_MSG_COMMIT, op2);\n        EXPECT_TRUE(op2->is_ready_for_execute(this->static_beacon));\n        op2->advance_operation_stage(bzn::pbft_operation_stage::execute, this->static_beacon);\n    }\n\n    TEST_F(persistent_operation_test, no_contamination_from_different_request)\n    {\n        auto op2 = std::make_shared<bzn::pbft_persistent_operation>(this->view, this->sequence, this->request_hash, this->storage);\n        auto op3 = std::make_shared<bzn::pbft_persistent_operation>(this->view+1, this->sequence, this->request_hash, this->storage);\n        auto op4 = std::make_shared<bzn::pbft_persistent_operation>(this->view, this->sequence, this->request_hash+\"xx\", this->storage);\n\n        //op2 gets just a preprepare, op3 gets 2f prepares, op4 gets 2f+1 prepares\n\n        for (const auto& op : std::vector<std::shared_ptr<bzn::pbft_persistent_operation>>{op2, op3, op4})\n        {\n            record_request(op);\n            record_pbft_messages(0, 1, PBFT_MSG_PREPREPARE, op);\n        }\n\n        record_pbft_messages(0, 2, PBFT_MSG_PREPARE, op3);\n        record_pbft_messages(0, 3, PBFT_MSG_PREPARE, op4);\n\n        op4->advance_operation_stage(bzn::pbft_operation_stage::commit, this->static_beacon);\n\n        EXPECT_FALSE(op2->is_ready_for_commit(this->static_beacon));\n        EXPECT_FALSE(op3->is_ready_for_commit(this->static_beacon));\n        EXPECT_TRUE(op4->is_ready_for_commit(this->static_beacon));\n    }\n\n    TEST_F(persistent_operation_test, remembers_messages_after_rehydrate)\n    {\n        record_request(this->operation);\n        record_pbft_messages(0, 1, PBFT_MSG_PREPREPARE, this->operation);\n        record_pbft_messages(0, 2, PBFT_MSG_PREPARE, this->operation);\n\n        this->operation = nullptr;\n        auto op2 = std::make_shared<bzn::pbft_persistent_operation>(this->view, this->sequence, this->request_hash, this->storage);\n\n        record_pbft_messages(2, 4, PBFT_MSG_PREPARE, op2);\n        op2->advance_operation_stage(bzn::pbft_operation_stage::commit, this->static_beacon);\n\n        EXPECT_TRUE(op2->is_ready_for_commit(this->static_beacon));\n        EXPECT_EQ(op2->get_preprepare().sender(), UUIDS.at(0));\n        EXPECT_EQ(op2->get_prepares().size(), 4u);\n    }\n\n    TEST_F(persistent_operation_test, test_prepared_in_range)\n    {\n        for (auto i : boost::irange(0, 100))\n        {\n            auto op = std::make_shared<bzn::pbft_persistent_operation>(1, i, \"some_hash\", this->storage);\n            record_request(op);\n            record_pbft_messages(0, 1, PBFT_MSG_PREPREPARE, op);\n\n            // record 1-4 prepares\n            record_pbft_messages(0, (i % 4) + 1, PBFT_MSG_PREPARE, op);\n            if ((i % 4 + 1) > 2)\n            {\n                op->advance_operation_stage(bzn::pbft_operation_stage::commit, this->static_beacon);\n            }\n        }\n\n        EXPECT_EQ(bzn::pbft_persistent_operation::prepared_operations_in_range(this->storage, 0, 100).size(), 50u);\n    }\n\n    TEST_F(persistent_operation_test, test_remove_range)\n    {\n        for (auto i : boost::irange(0, 100))\n        {\n            auto op = std::make_shared<bzn::pbft_persistent_operation>(1, i, \"some_hash\", this->storage);\n            record_request(op);\n            record_pbft_messages(0, 1, PBFT_MSG_PREPREPARE, op);\n        }\n\n        // note - there's an extra operation in there from the constructor\n        EXPECT_EQ(this->storage->get_size(bzn::pbft_persistent_operation::get_uuid()).first, 301u);\n        bzn::pbft_persistent_operation::remove_range(this->storage, 50, 60);\n        EXPECT_EQ(this->storage->get_size(bzn::pbft_persistent_operation::get_uuid()).first, 271u);\n\n        bzn::pbft_persistent_operation::remove_range(this->storage, 0, 10);\n        EXPECT_EQ(this->storage->get_size(bzn::pbft_persistent_operation::get_uuid()).first, 240u);\n    }\n}\n"
  },
  {
    "path": "pbft/pbft.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <pbft/pbft.hpp>\n#include <pbft/operations/pbft_memory_operation.hpp>\n#include <pbft/operations/pbft_operation_manager.hpp>\n#include <utils/make_endpoint.hpp>\n#include <utils/bytes_to_debug_string.hpp>\n#include <google/protobuf/text_format.h>\n#include <boost/beast/core/detail/base64.hpp>\n#include <boost/format.hpp>\n#include <cstdint>\n#include <memory>\n#include <algorithm>\n#include <numeric>\n#include <optional>\n#include <iterator>\n#include <crud/crud_base.hpp>\n#include <random>\n#include <chrono>\n\nusing namespace bzn;\n\n\npbft::pbft(\n    std::shared_ptr<bzn::node_base> node\n    , std::shared_ptr<bzn::asio::io_context_base> io_context\n    , std::shared_ptr<bzn::peers_beacon_base> peers\n    , std::shared_ptr<bzn::options_base> options\n    , std::shared_ptr<pbft_service_base> service\n    , std::shared_ptr<bzn::crypto_base> crypto\n    , std::shared_ptr<bzn::pbft_operation_manager> operation_manager\n    , std::shared_ptr<bzn::storage_base> storage\n    , std::shared_ptr<bzn::monitor_base> monitor\n    )\n    : storage(storage)\n    , node(std::move(node))\n    , uuid(options->get_uuid())\n    , options(options)\n    , service(std::move(service))\n    , io_context(io_context)\n    , audit_heartbeat_timer(this->io_context->make_unique_steady_timer())\n    , crypto(std::move(crypto))\n    , operation_manager(std::move(operation_manager))\n    , peers_beacon(std::move(peers))\n    , checkpoint_manager(std::make_shared<pbft_checkpoint_manager>(this->io_context, this->storage, this->peers_beacon, this->node))\n    , monitor(std::move(monitor))\n{\n    if (this->peers_beacon->current()->empty())\n    {\n        throw std::runtime_error(\"No peers found!\");\n    }\n\n    this->initialize_persistent_state();\n\n    this->service->save_service_state_at(((this->next_issued_sequence_number.value() / CHECKPOINT_INTERVAL) + 1) * CHECKPOINT_INTERVAL);\n}\n\nvoid\npbft::start()\n{\n    std::call_once(this->start_once,\n        [this]()\n        {\n            this->node->register_for_message(bzn_envelope::kPbft,\n                std::bind(&pbft::handle_bzn_message, shared_from_this(), std::placeholders::_1, std::placeholders::_2));\n\n            this->node->register_for_message(bzn_envelope::kPbftMembership,\n                std::bind(&pbft::handle_membership_message, shared_from_this(), std::placeholders::_1, std::placeholders::_2));\n\n            this->node->register_for_message(bzn_envelope::kDatabaseMsg,\n                std::bind(&pbft::handle_database_message, shared_from_this(), std::placeholders::_1, std::placeholders::_2));\n\n            this->node->register_for_message(bzn_envelope::kDatabaseResponse,\n                std::bind(&pbft::handle_database_response_message, shared_from_this(), std::placeholders::_1, std::placeholders::_2));\n\n            this->node->register_for_message(bzn_envelope::kSwarmError, [weak_this = weak_from_this()](auto msg, auto session)\n                {\n                    if (auto strong_this = weak_this.lock())\n                    {\n                        strong_this->handle_swarm_error_response_message(msg, session);\n                    }\n                });\n\n            this->node->register_error_handler([weak_this = this->weak_from_this()](const boost::asio::ip::tcp::endpoint& ep, const boost::system::error_code& ec)\n            {\n                if (auto strong_this = weak_this.lock())\n                {\n                    auto prim = strong_this->get_current_primary();\n                    if (ec && prim.has_value() && ep == bzn::make_endpoint(*prim))\n                    {\n                        strong_this->handle_failure();\n                    }\n                }\n            });\n\n            this->checkpoint_manager->start();\n\n            this->audit_heartbeat_timer->expires_from_now(HEARTBEAT_INTERVAL);\n            this->audit_heartbeat_timer->async_wait(\n                std::bind(&pbft::handle_audit_heartbeat_timeout, shared_from_this(), std::placeholders::_1));\n\n            this->service->register_execute_handler(\n                [weak_this = this->weak_from_this()]\n                (std::shared_ptr<pbft_operation> op)\n                {\n                    auto strong_this = weak_this.lock();\n                    if (strong_this)\n                    {\n                        strong_this->last_executed_sequence_number = op->get_sequence();\n                        if (op->get_sequence() % CHECKPOINT_INTERVAL == 0)\n                        {\n                            // tell service to save the next checkpoint after this one\n                            strong_this->service->save_service_state_at(op->get_sequence() + CHECKPOINT_INTERVAL);\n\n                            checkpoint_t chk{op->get_sequence(), strong_this->service->service_state_hash(\n                                op->get_sequence())};\n                            strong_this->checkpoint_manager->local_checkpoint_reached(chk);\n\n                            const auto safe_delete_bound = std::min(\n                                strong_this->checkpoint_manager->get_latest_stable_checkpoint().first\n                                , strong_this->checkpoint_manager->get_latest_local_checkpoint().first);\n\n                            strong_this->operation_manager->delete_operations_until(safe_delete_bound);\n                        }\n                    }\n                    else\n                    {\n                        throw std::runtime_error(\"pbft_service callback failed because pbft does not exist\");\n                    }\n                }\n            );\n\n            auto peers = this->peers_beacon->ordered();\n            this->pinned_primary = peers->at(this->view.value() % peers->size());\n        });\n}\n\nvoid\npbft::handle_audit_heartbeat_timeout(const boost::system::error_code& ec)\n{\n    if (ec)\n    {\n        LOG(error) << \"pbft audit heartbeat canceled? \" << ec.message();\n        return;\n    }\n\n    if (this->is_primary() && this->audit_enabled)\n    {\n        audit_message msg;\n        msg.mutable_primary_status()->set_view(this->view.value());\n        msg.mutable_primary_status()->set_primary(this->uuid);\n\n        this->async_signed_broadcast(msg);\n    }\n\n    this->audit_heartbeat_timer->expires_from_now(HEARTBEAT_INTERVAL);\n    this->audit_heartbeat_timer->async_wait(std::bind(&pbft::handle_audit_heartbeat_timeout, shared_from_this(), std::placeholders::_1));\n}\n\nvoid\npbft::handle_bzn_message(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> /*session*/)\n{\n    if (msg.payload_case() != bzn_envelope::kPbft)\n    {\n        LOG(error) << \"Got misdirected message \" << msg.DebugString().substr(0, MAX_MESSAGE_SIZE);\n    }\n\n    pbft_msg inner_msg;\n    if (!inner_msg.ParseFromString(msg.pbft()))\n    {\n        LOG(error) << \"Failed to parse payload of wrapped message \" << msg.DebugString().substr(0, MAX_MESSAGE_SIZE);\n        return;\n    }\n\n    this->handle_message(inner_msg, msg);\n}\n\nvoid\npbft::handle_membership_message(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> session)\n{\n    LOG(debug) << \"Received membership message: \" << msg.ShortDebugString().substr(0, MAX_MESSAGE_SIZE);\n\n    pbft_membership_msg inner_msg;\n    if (!inner_msg.ParseFromString(msg.pbft_membership()))\n    {\n        LOG(error) << \"Failed to parse payload of wrapped message \" << msg.DebugString().substr(0, MAX_MESSAGE_SIZE);\n        return;\n    }\n\n    if ((!msg.sender().empty()) && this->options->get_peer_message_signing() && (!this->crypto->verify(msg)))\n    {\n        LOG(error) << \"Dropping message with invalid signature: \" << msg.ShortDebugString().substr(0, MAX_MESSAGE_SIZE);\n        return;\n    }\n\n    const auto hash = this->crypto->hash(msg);\n\n    std::lock_guard<std::mutex> lock(this->pbft_lock);\n\n    switch (inner_msg.type())\n    {\n        case PBFT_MMSG_GET_STATE:\n            this->handle_get_state(inner_msg, std::move(session));\n            break;\n        case PBFT_MMSG_SET_STATE:\n            this->handle_set_state(inner_msg);\n            break;\n        default:\n            LOG(error) << \"Invalid membership message received \"\n                << inner_msg.DebugString().substr(0, MAX_MESSAGE_SIZE);\n    }\n}\n\nvoid\npbft::handle_message(const pbft_msg& msg, const bzn_envelope& original_msg)\n{\n    LOG(debug) << \"Received message: \" << msg.ShortDebugString().substr(0, MAX_MESSAGE_SIZE) << \"\\nFrom: \" << original_msg.sender();\n\n    std::lock_guard<std::mutex> lock(this->pbft_lock);\n\n    auto peers = this->peers_beacon->current();\n    auto find = std::find_if(peers->begin(), peers->end(),\n            [&](const auto& peer)\n            {\n                return peer.uuid == original_msg.sender();\n            });\n    if (find == std::end(*peers))\n    {\n        LOG(debug) << \"Dropping message because it is not from a peer\";\n        return;\n    }\n\n    if (!this->preliminary_filter_msg(msg))\n    {\n        return;\n    }\n\n    if ((!original_msg.sender().empty()) && this->options->get_peer_message_signing() && (!this->crypto->verify(original_msg)))\n    {\n        LOG(error) << \"Dropping message with invalid signature: \" << original_msg.ShortDebugString().substr(0, MAX_MESSAGE_SIZE);\n        return;\n    }\n\n    switch (msg.type())\n    {\n        case PBFT_MSG_PREPREPARE :\n            this->handle_preprepare(msg, original_msg);\n            break;\n        case PBFT_MSG_PREPARE :\n            this->handle_prepare(msg, original_msg);\n            break;\n        case PBFT_MSG_COMMIT :\n            this->handle_commit(msg, original_msg);\n            break;\n        case PBFT_MSG_VIEWCHANGE :\n            this->handle_viewchange(msg, original_msg);\n            break;\n        case PBFT_MSG_NEWVIEW :\n            this->handle_newview(msg, original_msg);\n            break;\n\n        default :\n            throw std::runtime_error(\"Unsupported message type\");\n    }\n}\n\nbool\npbft::preliminary_filter_msg(const pbft_msg& msg)\n{\n    if (!this->is_view_valid() && !(msg.type() == PBFT_MSG_VIEWCHANGE || msg.type() == PBFT_MSG_NEWVIEW))\n    {\n        LOG(debug) << \"Dropping message because local view is invalid\";\n        return false;\n    }\n\n    if (auto t = msg.type();t == PBFT_MSG_PREPREPARE || t == PBFT_MSG_PREPARE || t == PBFT_MSG_COMMIT)\n    {\n        if (msg.view() != this->view.value())\n        {\n            LOG(debug) << \"Dropping message because it has the wrong view number\";\n            return false;\n        }\n    }\n\n    return true;\n}\n\nstd::shared_ptr<pbft_operation>\npbft::setup_request_operation(const bzn_envelope& request_env, const bzn::hash_t& request_hash)\n{\n    const uint64_t request_seq = this->next_issued_sequence_number.value();\n    this->next_issued_sequence_number = request_seq + 1;\n    auto op = this->operation_manager->find_or_construct(this->view.value(), request_seq, request_hash);\n    op->record_request(request_env);\n\n    return op;\n}\n\nvoid\npbft::send_error_response(const bzn_envelope& request_env, const std::shared_ptr<session_base>& session\n    , const std::string& hash, const std::string& msg) const\n{\n    database_msg req;\n    if (session && req.ParseFromString(request_env.database_msg()))\n    {\n        swarm_error err;\n        *err.mutable_message() = msg;\n        *err.mutable_data() = std::to_string(req.header().nonce());\n        *err.mutable_hash() = hash;\n\n        bzn_envelope response;\n        response.set_swarm_error(err.SerializeAsString());\n        response.set_sender(this->uuid);\n        response.set_timestamp(this->now());\n        response.set_swarm_id(this->options->get_swarm_id());\n\n        session->send_message(std::make_shared<std::string>(response.SerializeAsString()));\n    }\n}\n\nvoid\npbft::handle_request(const bzn_envelope& request_env, const std::shared_ptr<session_base>& session)\n{\n    const auto hash = this->crypto->hash(request_env);\n\n    if (request_env.timestamp() < (this->now() - MAX_REQUEST_AGE_MS) || request_env.timestamp() > (this->now() + MAX_REQUEST_AGE_MS))\n    {\n        this->send_error_response(request_env, session, hash, TIMESTAMP_ERROR_MSG);\n\n        LOG(info) << \"Rejecting request because it is outside allowable timestamp range: \"\n                << request_env.ShortDebugString();\n        return;\n    }\n\n    // Allowing the maximum size to simply be bzn::MAX_VALUE_SIZE does not take into account the overhead that the\n    // primary peer will add to the message when it re-broadcasts the request to the other peers in the swarm. This\n    // additional overhead has been experimentally determined, on MacOS, to be 245 bytes. For now we shall use the magic\n    // number overhead size of 512 when we limit\n    const size_t OVERHEAD_SIZE{512};\n    if (!request_env.database_msg().empty() && request_env.database_msg().size() >= (bzn::MAX_VALUE_SIZE - OVERHEAD_SIZE))\n    {\n        this->send_error_response(request_env, session, hash, TOO_LARGE_ERROR_MSG);\n\n        LOG(warning) << \"Rejecting request because it is too large [\" << request_env.database_msg().size() << \" bytes]\";\n        return;\n    }\n\n    if (session)\n    {\n        if (this->sessions_waiting_on_forwarded_requests.find(hash) == this->sessions_waiting_on_forwarded_requests.end())\n        {\n            this->add_session_to_sessions_waiting(hash, session);\n        }\n    }\n\n    this->monitor->start_timer(hash);\n\n    if (!this->is_primary())\n    {\n        this->forward_request_to_primary(request_env);\n        return;\n    }\n\n    if ((this->next_issued_sequence_number.value()) - this->last_executed_sequence_number > this->options->get_admission_window())\n    {\n        LOG(debug) << \"Rejecting request because we're too busy\";\n        this->send_error_response(request_env, session, hash, TOO_BUSY_ERROR_MSG);\n        return;\n    }\n\n    // keep track of what requests we've seen based on timestamp and only send preprepares once\n    if (this->already_seen_request(request_env, hash))\n    {\n        LOG(debug) << \"Rejecting duplicate request: \" << request_env.ShortDebugString().substr(0, MAX_MESSAGE_SIZE);\n        this->send_error_response(request_env, session, hash, DUPLICATE_ERROR_MSG);\n        return;\n    }\n\n    if ((!request_env.sender().empty()) && (!this->crypto->verify(request_env)))\n    {\n        LOG(error) << \"Dropping message with invalid signature: \" << request_env.ShortDebugString().substr(0, MAX_MESSAGE_SIZE);\n        return;\n    }\n\n    this->saw_request(request_env, hash);\n    auto op = setup_request_operation(request_env, hash);\n    this->do_preprepare(op);\n}\n\nvoid\npbft::forward_request_to_primary(const bzn_envelope& request_env)\n{\n    auto primary = this->get_current_primary();\n    if (!primary.has_value())\n    {\n        LOG(error) << \"Would forward request to primary, but we don't know the primary so we can't\";\n        return;\n    }\n\n    if (const auto endpoint = bzn::make_endpoint(*primary))\n    {\n        this->node->send_signed_message(*endpoint, std::make_shared<bzn_envelope>(request_env));\n    }\n    else\n    {\n        LOG(error) << \"Unable to forward request to primary: \" << (*primary).uuid << \" -- resolver error\";\n        return;\n    }\n\n    const bzn::hash_t req_hash = this->crypto->hash(request_env);\n    LOG(info) << \"Forwarded request to primary, \" << bzn::bytes_to_debug_string(req_hash);\n}\n\n\nvoid\npbft::maybe_record_request(const bzn_envelope &request_env, const std::shared_ptr<pbft_operation> &op)\n{\n    if (request_env.payload_case() == bzn_envelope::PayloadCase::PAYLOAD_NOT_SET || this->crypto->hash(request_env) != op->get_request_hash())\n    {\n        LOG(trace) << \"Not recording request because hashes do not match\";\n        return;\n    }\n    op->record_request(request_env);\n}\n\n\nvoid\npbft::handle_preprepare(const pbft_msg& msg, const bzn_envelope& original_msg)\n{\n    // If we've already accepted a preprepare for this view+sequence, and it's not this one, then we should reject this one\n    // Note that if we get the same preprepare more than once, we can still accept it\n    const log_key_t log_key(msg.view(), msg.sequence());\n\n    if (auto lookup = this->accepted_preprepares.find(log_key);\n        lookup != this->accepted_preprepares.end()\n        && std::get<2>(lookup->second.value()) != msg.request_hash())\n    {\n        LOG(debug) << \"Rejecting preprepare: already accepted a conflicting one\";\n        return;\n    }\n    else\n    {\n        auto op = this->operation_manager->find_or_construct(msg);\n        auto env_copy{original_msg};\n        env_copy.clear_piggybacked_requests();\n        op->record_pbft_msg(msg, env_copy);\n\n        this->maybe_record_request(msg.request(), op);\n        if (original_msg.piggybacked_requests_size())\n        {\n            this->maybe_record_request(original_msg.piggybacked_requests(0), op);\n        }\n\n        // This assignment will be redundant if we've seen this preprepare before, but that's fine\n        accepted_preprepares[log_key] = persistent<bzn::operation_key_t>{this->storage, op->get_operation_key()\n            , ACCEPTED_PREPREPARES_KEY, log_key};\n\n\n        this->do_preprepared(op);\n        this->maybe_advance_operation_state(op);\n    }\n}\n\nvoid\npbft::handle_prepare(const pbft_msg& msg, const bzn_envelope& original_msg)\n{\n    // Prepare messages are never rejected, assuming the sanity checks passed\n    auto op = this->operation_manager->find_or_construct(msg);\n\n    op->record_pbft_msg(msg, original_msg);\n    this->maybe_advance_operation_state(op);\n}\n\nvoid\npbft::handle_commit(const pbft_msg& msg, const bzn_envelope& original_msg)\n{\n    // Commit messages are never rejected, assuming  the sanity checks passed\n    auto op = this->operation_manager->find_or_construct(msg);\n\n    op->record_pbft_msg(msg, original_msg);\n    this->maybe_advance_operation_state(op);\n}\n\nvoid\npbft::handle_get_state(const pbft_membership_msg& msg, std::shared_ptr<bzn::session_base> session) const\n{\n    LOG(debug) << boost::format(\"Got request for state data for checkpoint: seq: %1%, hash: %2%\")\n                  % msg.sequence() % msg.state_hash();\n\n    // get stable checkpoint for request\n    checkpoint_t req_cp(msg.sequence(), msg.state_hash());\n    std::shared_ptr<std::string> state;\n    if (this->checkpoint_manager->get_latest_stable_checkpoint() != req_cp || !(state = this->get_checkpoint_state(req_cp)))\n    {\n        LOG(debug) << boost::format(\"I'm missing data for checkpoint: seq: %1%, hash: %2%\")\n                      % msg.sequence() % msg.state_hash();\n        // TODO: send error response\n        return;\n    }\n\n    if (this->get_view() > 1 && this->saved_newview.payload_case() != bzn_envelope::kPbft)\n    {\n        LOG(warning) << \"No saved NEWVIEW message to send for state message. Not responding\";\n        return;\n    }\n\n    pbft_membership_msg reply;\n    reply.set_type(PBFT_MMSG_SET_STATE);\n    reply.set_sequence(req_cp.first);\n    reply.set_state_hash(req_cp.second);\n    reply.set_state_data(*state);\n\n    // TODO: the latest stable checkpoint may have advanced by the time we pull it here, which will cause the receiver\n    // to reject this message. This is innocuous, but we could avoid the awkwardness by requesting a specific checkpoint\n    // proof from the manager instead of the latest.\n    for (const auto& pair : this->checkpoint_manager->get_latest_stable_checkpoint_proof())\n    {\n        bzn_envelope checkpoint_claim;\n        checkpoint_claim.ParseFromString(pair.second);\n        *(reply.add_checkpoint_proof()) = checkpoint_claim;\n    }\n\n    if (this->saved_newview.payload_case() == bzn_envelope::kPbft)\n    {\n        reply.set_allocated_newview_msg(new bzn_envelope(this->saved_newview));\n    }\n\n    auto msg_ptr = std::make_shared<bzn::encoded_message>(this->wrap_message(reply).SerializeAsString());\n    session->send_message(msg_ptr);\n}\n\nvoid\npbft::handle_set_state(const pbft_membership_msg& msg)\n{\n    checkpoint_t cp(msg.sequence(), msg.state_hash());\n\n    for (size_t i{0}; i < static_cast<uint64_t>(msg.checkpoint_proof_size()); i++)\n    {\n        this->checkpoint_manager->handle_checkpoint_message(msg.checkpoint_proof(i));\n    }\n\n    if (this->checkpoint_manager->get_latest_stable_checkpoint() != cp)\n    {\n        LOG(info) << boost::format(\"Ignoring state message at %1% because it does not match latest stable checkpoint\") % msg.sequence();\n        return;\n    }\n\n    if (this->checkpoint_manager->get_latest_local_checkpoint() == cp)\n    {\n        LOG(info) << boost::format(\"Ignoring state message at %1% because we already have that state\") % msg.sequence();\n        return;\n    }\n\n    if (this->checkpoint_manager->get_latest_local_checkpoint().first > msg.sequence())\n    {\n        LOG(info) << boost::format(\"Ignoring state message at %1% because we have a newer state\") % msg.sequence();\n        return;\n    }\n\n    LOG(info) << boost::format(\"Adopting checkpoint %1% at seq %2%\")\n        % cp.second % cp.first;\n\n    // TODO: validate the state data\n    this->set_checkpoint_state(cp, msg.state_data());\n\n    // TODO: This should maybe use normal newview handling\n    if (msg.has_newview_msg())\n    {\n        pbft_msg newview;\n        if (newview.ParseFromString(msg.newview_msg().pbft()))\n        {\n            this->view = newview.view();\n            LOG(info) << \"setting view to \" << this->view.value();\n            this->set_primary_from_newview(msg.newview_msg());\n        }\n    }\n}\n\nvoid\npbft::broadcast(const bzn_envelope& msg)\n{\n    auto msg_ptr = std::make_shared<bzn_envelope>(msg);\n\n    for (const auto& peer : *this->peers_beacon->current())\n    {\n        if (const auto endpoint = bzn::make_endpoint(peer))\n        {\n            this->node->send_maybe_signed_message(*endpoint, msg_ptr);\n        }\n        else\n        {\n            LOG(error) << \"Unable to broadcast to \" << uuid << \" -- resolver error\";\n        }\n    }\n}\n\nvoid\npbft::async_signed_broadcast(const pbft_membership_msg& msg)\n{\n    auto msg_env = std::make_shared<bzn_envelope>();\n    msg_env->set_pbft_membership(msg.SerializeAsString());\n    this->async_signed_broadcast(std::move(msg_env));\n}\n\nvoid\npbft::async_signed_broadcast(const pbft_msg& msg)\n{\n    auto msg_env = std::make_shared<bzn_envelope>();\n    msg_env->set_pbft(msg.SerializeAsString());\n    this->async_signed_broadcast(std::move(msg_env));\n}\n\nvoid\npbft::async_signed_broadcast(const audit_message& msg)\n{\n    auto msg_env = std::make_shared<bzn_envelope>();\n    msg_env->set_audit(msg.SerializeAsString());\n    this->async_signed_broadcast(std::move(msg_env));\n}\n\nvoid\npbft::async_signed_broadcast(std::shared_ptr<bzn_envelope> msg_env)\n{\n    msg_env->set_timestamp(this->now());\n\n    auto targets = std::make_shared<std::vector<boost::asio::ip::tcp::endpoint>>();\n    for (const auto& peer : *this->peers_beacon->current())\n    {\n        if (const auto endpoint = bzn::make_endpoint(peer))\n        {\n            targets->emplace_back(*endpoint);\n        }\n        else\n        {\n            LOG(error) << \"Unable to async_signed_broadcast to \" << peer.uuid << \"-- resolver error\";\n        }\n    }\n\n    this->node->multicast_maybe_signed_message(std::move(targets), msg_env);\n}\n\nvoid\npbft::maybe_advance_operation_state(const std::shared_ptr<pbft_operation>& op)\n{\n    if (op->get_stage() == pbft_operation_stage::prepare && op->is_ready_for_commit(this->peers_beacon))\n    {\n        this->do_prepared(op);\n    }\n\n    if (op->get_stage() == pbft_operation_stage::commit && op->is_ready_for_execute(this->peers_beacon))\n    {\n        this->do_committed(op);\n    }\n}\n\npbft_msg\npbft::common_message_setup(const std::shared_ptr<pbft_operation>& op, pbft_msg_type type)\n{\n    pbft_msg msg;\n    msg.set_view(op->get_view());\n    msg.set_sequence(op->get_sequence());\n    msg.set_request_hash(op->get_request_hash());\n    msg.set_type(type);\n\n    return msg;\n}\n\nvoid\npbft::do_preprepare(const std::shared_ptr<pbft_operation>& op)\n{\n    LOG(debug) << \"Doing preprepare for operation \" << op->get_sequence();\n\n    pbft_msg msg = this->common_message_setup(op, PBFT_MSG_PREPREPARE);\n\n    const bzn_envelope& req_env = op->get_request();\n    auto msg_env = std::make_shared<bzn_envelope>();\n    if (req_env.payload_case() == bzn_envelope::kPbftInternalRequest)\n    {\n        msg.set_allocated_request(new bzn_envelope(req_env));\n        msg.set_request_type(pbft_request_type::PBFT_REQUEST_INTERNAL);\n    }\n    else\n    {\n        *(msg_env->add_piggybacked_requests()) = req_env;\n    }\n\n    msg_env->set_pbft(msg.SerializeAsString());\n    this->async_signed_broadcast(std::move(msg_env));\n}\n\nvoid\npbft::do_preprepared(const std::shared_ptr<pbft_operation>& op)\n{\n    LOG(debug) << \"Entering prepare phase for operation \" << op->get_sequence();\n\n    pbft_msg msg = this->common_message_setup(op, PBFT_MSG_PREPARE);\n\n    this->async_signed_broadcast(msg);\n}\n\nvoid\npbft::do_prepared(const std::shared_ptr<pbft_operation>& op)\n{\n    LOG(debug) << \"Entering commit phase for operation \" << op->get_sequence();\n    op->advance_operation_stage(pbft_operation_stage::commit, this->peers_beacon);\n\n    pbft_msg msg = this->common_message_setup(op, PBFT_MSG_COMMIT);\n\n    this->async_signed_broadcast(msg);\n}\n\nvoid\npbft::do_committed(const std::shared_ptr<pbft_operation>& op)\n{\n    LOG(debug) << \"Operation \" << op->get_sequence() << \" \" << bzn::bytes_to_debug_string(op->get_request_hash()) << \" is committed-local\";\n    op->advance_operation_stage(pbft_operation_stage::execute, this->peers_beacon);\n\n    // If we have a pending session for this request, attach to the operation just before we pass off to the service.\n    // If we were to do that before this moment, then maybe the pbft_operation we attached it to never gets executed and\n    // it gets executed in a different view (earlier or later), so the client never gets a response. If we do it here,\n    // then the only reason this pbft_operation instance wouldn't be executed eventually is if the service already has\n    // a pbft_operation for this sequence, meaning we committed this before we got the request, or if we crash, which\n    // kills the session anyway.\n\n    const auto session = this->sessions_waiting_on_forwarded_requests.find(op->get_request_hash());\n    if (session != this->sessions_waiting_on_forwarded_requests.end() && !op->has_session())\n    {\n        LOG(debug) << \"Found pending session for this operation\";\n        op->set_session(session->second);\n    }\n    else\n    {\n        LOG(debug) << \"No pending session for this operation\";\n    }\n\n    if (this->audit_enabled)\n    {\n        audit_message msg;\n        msg.mutable_pbft_commit()->set_operation(op->get_request_hash());\n        msg.mutable_pbft_commit()->set_sequence_number(op->get_sequence());\n        msg.mutable_pbft_commit()->set_sender_uuid(this->uuid);\n\n        this->async_signed_broadcast(msg);\n    }\n\n    // TODO: this needs to be refactored to be service-agnostic\n    if (op->has_db_request())\n    {\n        LOG(debug) << \"Posting operation \" << op->get_sequence() << \" for execution\";\n        this->io_context->post(std::bind(&pbft_service_base::apply_operation, this->service, op));\n    }\n    else\n    {\n        LOG(debug) << \"No db_request for operation \" << op->get_sequence();\n\n        // the service needs sequentially sequenced operations. post a null request to fill in this hole\n        database_msg msg;\n        msg.mutable_nullmsg();\n        bzn_envelope request;\n        request.set_database_msg(msg.SerializeAsString());\n        auto new_op = std::make_shared<pbft_memory_operation>(op->get_view(), op->get_sequence()\n            , this->crypto->hash(request));\n        new_op->record_request(request);\n        this->io_context->post(std::bind(&pbft_service_base::apply_operation, this->service, new_op));\n    }\n}\n\nbool\npbft::is_primary() const\n{\n    auto primary = this->get_current_primary();\n    return primary.has_value() && (*primary).uuid == this->uuid;\n}\n\nstd::optional<peer_address_t>\npbft::get_current_primary() const\n{\n    return this->pinned_primary;\n}\n\nstd::optional<peer_address_t>\npbft::predict_primary(uint64_t view) const\n{\n    if (view == this->view.value())\n    {\n        return this->get_current_primary();\n    }\n\n    auto peers = this->peers_beacon->ordered();\n    if (peers->size() == 0)\n    {\n        return std::nullopt;\n    }\n\n    return peers->at(view % peers->size());\n}\n\nbzn_envelope\npbft::wrap_message(bzn_envelope& env) const\n{\n    env.set_sender(this->uuid);\n    env.set_timestamp(this->now());\n    env.set_swarm_id(this->options->get_swarm_id());\n    this->crypto->sign(env);\n\n    return env;\n}\n\nbzn_envelope\npbft::wrap_message(const pbft_msg& msg) const\n{\n    bzn_envelope result;\n    result.set_pbft(msg.SerializeAsString());\n    return this->wrap_message(result);\n}\n\nbzn_envelope\npbft::wrap_message(const pbft_membership_msg& msg) const\n{\n    bzn_envelope result;\n    result.set_pbft_membership(msg.SerializeAsString());\n    return this->wrap_message(result);\n}\n\nbzn_envelope\npbft::wrap_message(const database_response& msg) const\n{\n    bzn_envelope result;\n    result.set_database_response(msg.SerializeAsString());\n    return this->wrap_message(result);\n}\n\nconst bzn::uuid_t&\npbft::get_uuid() const\n{\n    return this->uuid;\n}\n\nvoid\npbft::set_audit_enabled(bool setting)\n{\n    this->audit_enabled = setting;\n}\n\nvoid\npbft::notify_audit_failure_detected()\n{\n    if (this->audit_enabled)\n    {\n        audit_message msg;\n        msg.mutable_failure_detected()->set_sender_uuid(this->uuid);\n        this->async_signed_broadcast(msg);\n    }\n}\n\nvoid\npbft::handle_failure()\n{\n    std::lock_guard<std::mutex> lock(this->pbft_lock);\n    LOG (error) << \"handle_failure - PBFT failure - invalidating current view and sending VIEWCHANGE to view: \"\n        << this->view.value() + 1;\n    this->notify_audit_failure_detected();\n    this->initiate_viewchange();\n}\n\nvoid\npbft::initiate_viewchange(std::optional<uint64_t> opt_view)\n{\n    uint64_t view_to_set = opt_view.has_value() ? *opt_view : this->view.value() + 1;\n    if (view_to_set > this->last_view_sent.value())\n    {\n        pbft_msg view_change;\n        std::vector<bzn_envelope> requests;\n\n        this->view_is_valid = false;\n        auto msg_env = pbft::make_viewchange(view_to_set\n            , this->checkpoint_manager->get_latest_stable_checkpoint().first\n            , this->checkpoint_manager->get_latest_stable_checkpoint_proof()\n            , this->operation_manager->prepared_operations_since(\n                this->checkpoint_manager->get_latest_stable_checkpoint().first));\n\n        LOG(debug) << \"Sending VIEWCHANGE for view \" << view_to_set << \" (currently at \" << this->view.value() << \")\";\n\n        this->async_signed_broadcast(std::move(msg_env));\n        this->last_view_sent = view_to_set;\n    }\n    else\n    {\n        LOG(debug) << \"Not sending VIEWCHANGE for view \" << view_to_set;\n    }\n}\n\nstd::shared_ptr<std::string>\npbft::get_checkpoint_state(const checkpoint_t& cp) const\n{\n    // call service to retrieve state at this checkpoint\n    return this->service->get_service_state(cp.first);\n}\n\nvoid\npbft::set_checkpoint_state(const checkpoint_t& cp, const std::string& data)\n{\n    // set the service state at the given checkpoint sequence\n    // the service is expected to load the state and discard any pending operations\n    // prior to the sequence number, then execute any subsequent operations sequentially\n    this->service->set_service_state(cp.first, data);\n}\n\nsize_t\npbft::quorum_size() const\n{\n    return 1 + (2*this->max_faulty_nodes());\n}\n\nsize_t\npbft::max_faulty_nodes() const\n{\n    return (this->peers_beacon->current()->size()-1)/3;\n}\n\nvoid\npbft::handle_database_message(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> session)\n{\n    LOG(debug) << \"got database message\";\n\n    if (!this->service->apply_operation_now(msg, session))\n    {\n        std::lock_guard<std::mutex> lock(this->pbft_lock);\n\n        if (msg.timestamp() == 0)\n        {\n            bzn_envelope mutable_msg(msg);\n            mutable_msg.set_timestamp(this->now());\n            this->handle_request(mutable_msg, session);\n        }\n        else\n        {\n            this->handle_request(msg, session);\n        }\n    }\n}\n\n\nvoid\npbft::handle_database_response_message(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> /*session*/)\n{\n    database_msg db_msg;\n\n    std::lock_guard<std::mutex> lock(this->pbft_lock);\n\n    if (db_msg.ParseFromString(msg.database_response()))\n    {\n        if (const auto session_it = this->sessions_waiting_on_forwarded_requests.find(db_msg.header().request_hash());\n            session_it != this->sessions_waiting_on_forwarded_requests.end())\n        {\n            session_it->second->send_message(std::make_shared<bzn::encoded_message>(msg.SerializeAsString()));\n            this->monitor->finish_timer(bzn::statistic::request_latency, db_msg.header().request_hash());\n            return;\n        }\n\n        LOG(warning) << \"session not found for database response\";\n        return;\n    }\n\n    LOG(error) << \"failed to read database response\";\n}\n\nvoid\npbft::handle_swarm_error_response_message(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> /*session*/)\n{\n    swarm_error err;\n\n    std::lock_guard<std::mutex> lock(this->pbft_lock);\n\n    if (err.ParseFromString(msg.swarm_error()))\n    {\n        if (const auto session_it = this->sessions_waiting_on_forwarded_requests.find(err.hash());\n            session_it != this->sessions_waiting_on_forwarded_requests.end())\n        {\n            session_it->second->send_message(std::make_shared<bzn::encoded_message>(msg.SerializeAsString()));\n            this->monitor->finish_timer(bzn::statistic::request_latency, err.hash());\n            return;\n        }\n\n        LOG(warning) << \"session not found for swarm error response\";\n        return;\n    }\n\n    LOG(error) << \"failed to read swarm error response\";\n}\n\nuint64_t\npbft::get_low_water_mark()\n{\n    return this->checkpoint_manager->get_latest_stable_checkpoint().first;\n}\n\nuint64_t\npbft::get_high_water_mark()\n{\n    return this->checkpoint_manager->get_latest_stable_checkpoint().first + HIGH_WATER_INTERVAL_IN_CHECKPOINTS * CHECKPOINT_INTERVAL;\n}\n\nbool\npbft::is_view_valid() const\n{\n    return this->view_is_valid.value();\n}\n\nuint64_t\npbft::get_view() const\n{\n    return this->view.value();\n}\n\nstd::shared_ptr<bzn::node_base>\npbft::get_node()\n{\n    return this->node;\n}\n\nbool\npbft::is_peer(const bzn::uuid_t& sender) const\n{\n    auto ptr = this->peers_beacon->current();\n    return std::find_if (ptr->begin(), ptr->end(), [&](const auto& address)\n    {\n        return sender == address.uuid;\n    }) != ptr->end();\n}\n\nstd::map<bzn::checkpoint_t, std::set<bzn::uuid_t>>\npbft::validate_and_extract_checkpoint_hashes(const pbft_msg &viewchange_message) const\n{\n    std::map<bzn::checkpoint_t , std::set<bzn::uuid_t>> checkpoint_hashes;\n    for (size_t i{0}; i < static_cast<uint64_t>(viewchange_message.checkpoint_messages_size()); ++i)\n    {\n        const bzn_envelope& envelope{viewchange_message.checkpoint_messages(i)};\n        checkpoint_msg checkpoint_message;\n\n        if ((this->options->get_peer_message_signing() && !this->crypto->verify(envelope))\n            || !this->is_peer(envelope.sender()) || !checkpoint_message.ParseFromString(envelope.checkpoint_msg()))\n        {\n            LOG (error) << \"Checkpoint validation failure - unable to verify envelope\";\n            continue;\n        }\n        checkpoint_hashes[checkpoint_t(checkpoint_message.sequence(), checkpoint_message.state_hash())].insert(envelope.sender());\n    }\n\n    //  filter checkpoint_hashes to only those pairs (checkpoint, senders) such that |senders| >= 2f+1\n    std::map<bzn::checkpoint_t , std::set<bzn::uuid_t>> retval;\n    std::copy_if(checkpoint_hashes.begin(), checkpoint_hashes.end(), std::inserter(retval, retval.end())\n        , [&](const auto& h) {return h.second.size() >= this->honest_member_size(this->peers_beacon->current()->size());});\n\n    return retval;\n}\n\nbool\npbft::is_valid_prepared_proof(const prepared_proof& proof, uint64_t valid_checkpoint_sequence) const\n{\n    const bzn_envelope& pre_prepare_envelope{proof.pre_prepare()};\n\n    if (!this->is_peer(pre_prepare_envelope.sender())\n        || (this->options->get_peer_message_signing() && !this->crypto->verify(pre_prepare_envelope)))\n    {\n        LOG(error) << \"is_valid_prepared_proof - a pre prepare message has a bad envelope, or the sender is not in the peers list\";\n        LOG(error) << \"Sender: \" << pre_prepare_envelope.sender() << \" is \" << (this->is_peer(pre_prepare_envelope.sender()) ? \"\" : \"not \") << \"a peer\";\n        return false;\n    }\n\n    pbft_msg preprepare_message;\n    if (!preprepare_message.ParseFromString(pre_prepare_envelope.pbft()) || (preprepare_message.sequence() <= valid_checkpoint_sequence)\n        || preprepare_message.type() != PBFT_MSG_PREPREPARE)\n    {\n        LOG(error) << \"is_valid_prepared_proof - a pre prepare message has an invalid sequence number, or is malformed\";\n        return false;\n    }\n\n    std::set<uuid_t> senders;\n    for (int j{0}; j < proof.prepare_size(); ++j)\n    {\n        bzn_envelope prepare_envelope{proof.prepare(j)};\n        if (!this->is_peer(prepare_envelope.sender()) ||\n            (this->options->get_peer_message_signing() && !this->crypto->verify(prepare_envelope)))\n        {\n            LOG(error) << \"is_valid_prepared_proof - a prepare message has a bad envelope, \"\n                          \"the sender may not be in the peer list, or the envelope failed cryptographic verification\";\n            LOG(error) << \"Sender: \" << pre_prepare_envelope.sender() << \" is \" << (this->is_peer(pre_prepare_envelope.sender()) ? \"\" : \"not \") << \"a peer\";\n            return false;\n        }\n\n        // does the sequence number, view number and hash match those of the pre prepare\n        pbft_msg prepare_msg;\n        if (!prepare_msg.ParseFromString(prepare_envelope.pbft()) || prepare_msg.type() != PBFT_MSG_PREPARE)\n        {\n            LOG(error) << \"is_valid_prepared_proof - a prepare message is invalid\";\n            return false;\n        }\n\n        if (preprepare_message.sequence() != prepare_msg.sequence() || preprepare_message.view() != prepare_msg.view()\n            || preprepare_message.request_hash() != prepare_msg.request_hash())\n        {\n            LOG(error) << \"is_valid_prepared_proof - a pre prepare message has mismatched sequence, view or request hash\";\n            return false;\n        }\n\n        senders.insert(prepare_envelope.sender());\n    }\n\n    if (senders.size() < 2 * this->max_faulty_nodes() + 1)\n    {\n        LOG(error) << \"is_valid_prepared_proof - not enough prepares in a prepared_proof\";\n        return false;\n    }\n\n    return true;\n}\n\nbool\npbft::is_valid_viewchange_message(const pbft_msg& viewchange_message, const bzn_envelope& original_msg) const\n{\n    if (!this->is_peer(original_msg.sender()))// TODO: Rich - If redundant, keep this check, remove the other\n    {\n        LOG(debug) << \"is_valid_viewchange_message - message not from a peer\";\n        return false;\n    }\n\n    if (!(viewchange_message.view() > this->get_view()))\n    {\n        LOG(error) << \"is_valid_viewchange_message - new view \" << viewchange_message.view() << \" is not greater than current view \" << this->get_view();\n        return false;\n    }\n\n    auto valid_checkpoint_hashes{this->validate_and_extract_checkpoint_hashes(viewchange_message)};\n    if (valid_checkpoint_hashes.empty() && viewchange_message.sequence() != 0)\n    {\n        LOG(error) << \"is_valid_viewchange_message - the checkpoint is invalid\";\n        return false;\n    }\n\n    // If we do not have a valid checkpoint hash, then we must set the valid_checkpoint_sequence value to 0.\n    uint64_t valid_checkpoint_sequence = (valid_checkpoint_hashes.empty() ? 0 : valid_checkpoint_hashes.begin()->first.first);\n\n    // Snuck into KEP-902: Isabel notes that viewchange messages should not have sequences, and this will be  refactored\n    // out in the near future, but since we are using it we must make the comparison to the expected\n    // valid_checkpoint_sequence\n    if (viewchange_message.sequence() != valid_checkpoint_sequence)\n    {\n        LOG(error) << \"is_valid_viewchange_message - the viewchange sequence: \" << viewchange_message.sequence()\n            << \", is different from the sequence that is expected: \" <<  valid_checkpoint_sequence;\n        return false;\n    }\n\n    // all the the prepared proofs are valid  (contains a pre prepare and 2f+1 mathcin prepares)\n    for (int i{0}; i < viewchange_message.prepared_proofs_size(); ++i)\n    {\n        if (!this->is_valid_prepared_proof(viewchange_message.prepared_proofs(i), valid_checkpoint_sequence)){\n            LOG(error) << \"is_valid_viewchange_message - prepared proof is invalid\";\n            return false;\n        }\n    }\n    return true;\n}\n\nbool\npbft::get_sequences_and_request_hashes_from_proofs(\n        const pbft_msg& viewchange_msg\n        , std::set<std::pair<uint64_t, std::string>>& sequence_request_pairs) const\n{\n    for (int j{0}; j < viewchange_msg.prepared_proofs_size(); ++j)\n    {\n        // --- add the sequence/hash to a set\n        auto const& prepared_proof = viewchange_msg.prepared_proofs(j);\n\n        pbft_msg msg;\n        if (const bzn_envelope& envelope{prepared_proof.pre_prepare()}; !this->is_peer(envelope.sender()) || !msg.ParseFromString(envelope.pbft()))\n        {\n            return false;\n        }\n        sequence_request_pairs.insert(std::make_pair(msg.sequence(), msg.request_hash()));\n    }\n    return true;\n}\n\nbool\npbft::is_valid_newview_message(const pbft_msg& theirs, const bzn_envelope& original_theirs) const\n{\n    auto expected_primary = this->predict_primary(theirs.view());\n    if (!expected_primary.has_value())\n    {\n        LOG(error) << \"rejecting newview because we have no peers list\";\n        return false;\n    }\n\n    if (original_theirs.sender() != expected_primary.value().uuid)\n    {\n        LOG(error) << \"rejecting newview because it is not from the primary of that view\";\n        return false;\n    }\n\n    // - does it contain 2f+1 viewchange messages\n    if (static_cast<size_t>(theirs.viewchange_messages_size()) < 2 * this->max_faulty_nodes() + 1)\n    {\n        return false;\n    }\n\n    std::set<std::string> viewchange_senders;\n    pbft_msg viewchange_msg;\n    for (int i{0};i < theirs.viewchange_messages_size();++i)\n    {\n        const bzn_envelope& original_msg{theirs.viewchange_messages(i)};\n        // - are each of those viewchange messages valid?\n        if (!viewchange_msg.ParseFromString(original_msg.pbft()) || viewchange_msg.type() != PBFT_MSG_VIEWCHANGE\n            || !this->is_valid_viewchange_message(viewchange_msg, original_msg))\n        {\n            LOG(error) << \"is_valid_newview_message - new view message contains invalid viewchange message\";\n            return false;\n        }\n\n        if (viewchange_msg.view() != theirs.view())\n        {\n            LOG(error) << \"is_valid_newview_message - a view change message has a different view than the new view message\";\n            return false;\n        }\n        viewchange_senders.insert(original_msg.sender());\n    }\n\n    if (viewchange_senders.size() != size_t(theirs.viewchange_messages_size()))\n    {\n        LOG (error) << \"is_valid_newview_message - unexpected viewchange message count\";\n        return false;\n    }\n\n    std::map<uuid_t,bzn_envelope> viewchange_envelopes_from_senders;\n\n    for (int i{0};i < theirs.viewchange_messages_size();++i)\n    {\n        auto const& viewchange_env = theirs.viewchange_messages(i);\n        viewchange_envelopes_from_senders[viewchange_env.sender()] = viewchange_env;\n    }\n\n    pbft_msg ours = this->build_newview(theirs.view(), viewchange_envelopes_from_senders, false);\n    if (ours.pre_prepare_messages_size() != theirs.pre_prepare_messages_size())\n    {\n        LOG(error) << \"is_valid_newview_message - expected \" << ours.pre_prepare_messages_size()\n            << \" preprepares in new view, found \" << theirs.pre_prepare_messages_size();\n        return false;\n    }\n\n    for (int i{0};i < theirs.pre_prepare_messages_size();++i)\n    {\n        if (this->options->get_peer_message_signing() && !this->crypto->verify(theirs.pre_prepare_messages(i)))\n        {\n            LOG(error) <<  \"is_valid_newview_message - unable to verify thier pre prepare message\";\n            return false;\n        }\n\n        if (theirs.pre_prepare_messages(i).sender() != original_theirs.sender())\n        {\n            LOG(error) << \"is_valid_newview_message - pre prepare messaged does not come from the correct sender\";\n            return false;\n        }\n\n        pbft_msg ours_pbft;\n        pbft_msg theirs_pbft;\n\n        ours_pbft.ParseFromString(ours.pre_prepare_messages(i).pbft());\n        theirs_pbft.ParseFromString(theirs.pre_prepare_messages(i).pbft());\n\n        if (ours_pbft.type() != theirs_pbft.type())\n        {\n            LOG(error) << \"Invalid new view message: (ours_pbft.type() != theirs_pbft.type()): ours:[\" <<  ours_pbft.type() << \"] theirs:[\" << theirs_pbft.type() << \"]\";\n            return false;\n        }\n        else if (theirs_pbft.type() != PBFT_MSG_PREPREPARE)\n        {\n            LOG(error) << \"Invalid new view message: (theirs_pbft.type() != PBFT_MSG_PREPREPARE): [\" << theirs_pbft.type() << \"]\";\n            return false;\n        }\n        else if (ours_pbft.view() != theirs_pbft.view())\n        {\n            LOG(error) << \"Invalid new view message: (ours_pbft.view() != theirs_pbft.view()):  ours:[\" << ours_pbft.view() << \"] theirs:[\"  << theirs_pbft.view() << \"]\";\n            return false;\n        }\n        else if (ours_pbft.sequence() != theirs_pbft.sequence())\n        {\n            LOG(error) << \"Invalid new view message: ours_pbft.sequence() != theirs_pbft.sequence(): ours sequence:[\" << ours_pbft.sequence() << \"]  theirs:[\" << theirs_pbft.sequence() << \"]\" ;\n            return false;\n        }\n        else if (ours_pbft.request_hash() != theirs_pbft.request_hash())\n        {\n            LOG(error) << \"Invalid new view message: ours_pbft.request_hash() != theirs_pbft.request_hash(): ours: [\" << ours_pbft.request_hash() << \"] theirs:[\" << theirs_pbft.request_hash() << \"]\";\n            return false;\n        }\n    }\n    return true;\n}\n\nvoid\npbft::fill_in_missing_pre_prepares(uint64_t max_checkpoint_sequence, uint64_t new_view, std::map<uint64_t, bzn_envelope>& pre_prepares) const\n{\n    uint64_t last_sequence_number{0};\n    for(const auto& pre_prepare : pre_prepares)\n    {\n        last_sequence_number = std::max(last_sequence_number, pre_prepare.first);\n    }\n\n    for (uint64_t i = max_checkpoint_sequence + 1; i <= last_sequence_number; ++i)\n    {\n        //  -- create a new preprepare for a no-op operation using this sequence number\n        if (pre_prepares.find(i) == pre_prepares.end())\n        {\n            database_msg msg;\n            msg.set_allocated_nullmsg(new database_nullmsg);\n\n            auto request = new bzn_envelope;\n            request->set_database_msg(msg.SerializeAsString());\n\n            // don't sign message as it doesn't have a valid sender\n\n            pbft_msg msg2;\n            msg2.set_view(new_view);\n            msg2.set_sequence(i);\n            msg2.set_type(PBFT_MSG_PREPREPARE);\n            msg2.set_request_hash(this->crypto->hash(*request));\n\n            pre_prepares[i] = this->wrap_message(msg2);\n            *(pre_prepares[i].add_piggybacked_requests()) = *request;\n        }\n    }\n}\n\npbft_msg\npbft::make_newview(\n        uint64_t new_view_index\n        , const std::map<uuid_t,bzn_envelope>& viewchange_envelopes_from_senders\n        , const std::map<uint64_t, bzn_envelope>& pre_prepare_messages\n) const\n{\n    pbft_msg newview;\n    newview.set_type(PBFT_MSG_NEWVIEW);\n    newview.set_view(new_view_index);\n\n    // V is the set of 2f+1 view change messages\n    for (const auto &sender_viewchange_envelope: viewchange_envelopes_from_senders)\n    {\n        *(newview.add_viewchange_messages()) = sender_viewchange_envelope.second;\n    }\n\n    // O\n    for (const auto& preprepare_message : pre_prepare_messages)\n    {\n        *(newview.add_pre_prepare_messages()) = preprepare_message.second;\n    }\n    return newview;\n}\n\npbft_msg\npbft::build_newview(uint64_t new_view, const std::map<uuid_t,bzn_envelope>& viewchange_envelopes_from_senders\n    , bool attach_reqs) const\n{\n    //  Computing O (set of new preprepares for new-view message)\n    std::map<uint64_t, bzn_envelope> pre_prepares;\n\n    uint64_t max_checkpoint_sequence{0};\n    for (const auto& sender_viewchange_envelope : viewchange_envelopes_from_senders)\n    {\n        pbft_msg viewchange;\n        viewchange.ParseFromString(sender_viewchange_envelope.second.pbft());\n        max_checkpoint_sequence = std::max(max_checkpoint_sequence, viewchange.sequence());\n    }\n\n    //  - for each of the 2f+1 viewchange messages\n    for (const auto& sender_viewchange_envelope : viewchange_envelopes_from_senders)\n    {\n        //  -- for each operation included in that viewchange message\n        pbft_msg viewchange_message;\n        viewchange_message.ParseFromString(sender_viewchange_envelope.second.pbft());\n\n        for (int i{0}; i < viewchange_message.prepared_proofs_size(); ++i)\n        {\n            const auto& prepared_proof = viewchange_message.prepared_proofs(i);\n\n            //  --- if we have not already created a new preprepare for an operation with that sequence number\n\n            //  ---- Create a new preprepare for that operation using its original sequence number\n            //       and request hash, but using the new view number\n            pbft_msg pre_prepare;\n            pre_prepare.ParseFromString(prepared_proof.pre_prepare().pbft());\n\n            if (pre_prepares.count(pre_prepare.sequence())>0)\n            {\n                continue;\n            }\n\n            uint64_t old_view = pre_prepare.view();\n            pre_prepare.set_view(new_view);\n\n            if (pre_prepare.sequence() <= max_checkpoint_sequence)\n            {\n                continue;\n            }\n\n            auto env = this->wrap_message(pre_prepare);\n            if (pre_prepare.request_type() == pbft_request_type::PBFT_REQUEST_PAYLOAD && attach_reqs)\n            {\n                auto op = this->operation_manager->find_or_construct(old_view, pre_prepare.sequence()\n                    , pre_prepare.request_hash());\n                if (op->has_request())\n                {\n                    *(env.add_piggybacked_requests()) = op->get_request();\n                }\n                else\n                {\n                    LOG(error) << \"No request found for operation \" << pre_prepare.sequence() << \" in view \"\n                            << old_view;\n                }\n            }\n            pre_prepares[pre_prepare.sequence()] = env;\n        }\n    }\n    this->fill_in_missing_pre_prepares(max_checkpoint_sequence, new_view, pre_prepares);\n\n    return this->make_newview(new_view, viewchange_envelopes_from_senders, pre_prepares);\n}\n\nvoid\npbft::save_checkpoint(const pbft_msg& msg)\n{\n    for (int i{0}; i < msg.checkpoint_messages_size(); ++i)\n    {\n        const bzn_envelope& original_checkpoint{msg.checkpoint_messages(i)};\n\n        if (this->options->get_peer_message_signing() && !this->crypto->verify(original_checkpoint))\n        {\n            LOG(error) << \"ignoring invalid checkpoint message\";\n            continue;\n        }\n\n        this->checkpoint_manager->handle_checkpoint_message(original_checkpoint);\n    }\n}\n\n\nstd::map<bzn::hash_t, int>\npbft::map_request_to_hash(const bzn_envelope& env)\n{\n    std::map<bzn::hash_t, int> piggybacked_request_hashes;\n    for (int i{0}; i < env.piggybacked_requests_size(); ++i)\n    {\n        const bzn_envelope request{env.piggybacked_requests(i)};\n        const auto hash{this->crypto->hash(request)};\n        piggybacked_request_hashes[hash] = i;\n    }\n    return piggybacked_request_hashes;\n}\n\n\nvoid\npbft::save_all_requests(const pbft_msg& msg, const bzn_envelope& original_msg)\n{\n    const auto piggybacked_request_hashes{this->map_request_to_hash(original_msg)};\n\n    // go through the prepared proofs\n    for (int i{0}; i < msg.prepared_proofs_size(); ++i)\n    {\n        const auto &prepared_proof = msg.prepared_proofs(i);\n\n        // look at the pre-prepare for each proof\n        if (prepared_proof.has_pre_prepare())\n        {\n            const bzn_envelope &pre_prepare{prepared_proof.pre_prepare()};\n\n            pbft_msg pp_msg;\n            pp_msg.ParseFromString(pre_prepare.pbft());\n\n            const hash_t& hash = pp_msg.request_hash();\n\n            // find the piggybacked request in original_msg that corresponds to the hash\n            const auto piggybacked_request_it{piggybacked_request_hashes.find(hash)};\n\n            // if you find one, then save the request in the appropriate operation, because we used map::find, we know\n            // that if we got a mapo::end then we didn't find a request\n            if (piggybacked_request_it != piggybacked_request_hashes.end())\n            {\n                const bzn_envelope &request_env{original_msg.piggybacked_requests(piggybacked_request_it->second)};\n\n                const uint64_t& pre_prep_view{pp_msg.view()};\n\n                auto op = this->operation_manager->find_or_construct(\n                        pre_prep_view, pp_msg.sequence(), pp_msg.request_hash());\n\n                op->record_request(request_env);\n            }\n        }\n    }\n}\n\n\nvoid\npbft::handle_viewchange(const pbft_msg& msg, const bzn_envelope& original_msg)\n{\n    if (!this->is_valid_viewchange_message(msg, original_msg))\n    {\n        LOG(error) << \"handle_viewchange - invalid viewchange message, ignoring\";\n        return;\n    }\n\n    save_all_requests(msg, original_msg);\n\n    auto mutable_env{original_msg};\n    mutable_env.clear_piggybacked_requests();\n\n    this->valid_viewchange_messages_for_view[msg.view()][original_msg.sender()] =\n        {this->storage, mutable_env, VALID_VIEWCHANGE_MESSAGES_FOR_VIEW_KEY, original_msg.sender(), msg.view()};\n\n    this->save_checkpoint(msg);\n\n    if (this->is_view_valid() &&\n        this->valid_viewchange_messages_for_view[msg.view()].size() == this->max_faulty_nodes() + 1 &&\n        msg.view() > this->last_view_sent.value())\n    {\n        this->initiate_viewchange(msg.view());\n    }\n\n    const auto viewchange = std::find_if(this->valid_viewchange_messages_for_view.begin()\n        , this->valid_viewchange_messages_for_view.end(), [&](const auto& p)\n        {\n            auto predicted = this->predict_primary(p.first);\n            return predicted.has_value() && predicted.value().uuid == this->get_uuid() &&\n                (p.first > this->view.value()) &&\n                (p.second.size() == 2 * this->max_faulty_nodes() + 1);\n        });\n\n    if (viewchange == this->valid_viewchange_messages_for_view.end())\n    {\n        return;\n    }\n\n    std::map<uuid_t, bzn_envelope> viewchange_envelopes_from_senders;\n    for (const auto &sender_envelope : this->valid_viewchange_messages_for_view[msg.view()])\n    {\n        const auto &sender{sender_envelope.first};\n        const auto &viewchange_envelope{sender_envelope.second.value()};\n        viewchange_envelopes_from_senders[sender] = viewchange_envelope;\n    }\n\n    auto newview_msg = this->build_newview(viewchange->first, viewchange_envelopes_from_senders);\n    LOG(debug) << \"Sending NEWVIEW for view \" << this->view.value() + 1;\n    this->async_signed_broadcast(newview_msg);\n}\n\nvoid\npbft::handle_newview(const pbft_msg& msg, const bzn_envelope& original_msg)\n{\n    if (!this->is_valid_newview_message(msg, original_msg))\n    {\n        LOG (debug) << \"handle_newview - ignoring invalid NEWVIEW message \";\n        return;\n    }\n\n    pbft_msg viewchange;\n    viewchange.ParseFromString(msg.viewchange_messages(0).pbft());\n\n    // this is redundant (but harmless) unless it's a new node\n    this->save_checkpoint(viewchange);\n\n    // initially set next sequence from viewchange then update from preprepares later\n    this->next_issued_sequence_number = viewchange.sequence() + 1;\n\n    this->set_primary_from_newview(original_msg);\n\n    LOG(debug) << \"handle_newview - received valid NEWVIEW message\";\n\n    this->view = msg.view();\n    this->view_is_valid = true;\n\n    // after moving to the new view processes the preprepares\n    LOG(debug) << \"Processing \" << msg.pre_prepare_messages_size() << \" pre-prepares\";\n    for (size_t i{0}; i < static_cast<size_t>(msg.pre_prepare_messages_size()); ++i)\n    {\n        const bzn_envelope original_msg2 = msg.pre_prepare_messages(i);\n        pbft_msg msg2;\n        if (msg2.ParseFromString(original_msg2.pbft()))\n        {\n            this->handle_preprepare(msg2, original_msg2);\n\n            this->next_issued_sequence_number = msg2.sequence() + 1;\n        }\n    }\n\n    // save the newview message for providing with state messages\n    this->saved_newview = original_msg;\n}\n\nstd::string\npbft::get_name()\n{\n    return \"pbft\";\n}\n\nbzn::json_message\npbft::get_status()\n{\n    bzn::json_message status;\n    std::string status_str;\n\n    std::lock_guard<std::mutex> lock(this->pbft_lock);\n\n    status_str += \"my uuid: \" + this->uuid + \"\\n\";\n\n    auto primary = this->get_current_primary();\n    if (primary.has_value())\n    {\n        status_str += \"primary: \" + primary.value().uuid + \"\\n\";\n        status[\"primary\"][\"host\"] = primary.value().host;\n        status[\"primary\"][\"host_port\"] = primary.value().port;\n        status[\"primary\"][\"name\"] = primary.value().name;\n        status[\"primary\"][\"uuid\"] = primary.value().uuid;\n    }\n    else\n    {\n        status_str += \"primary unknown\\n\";\n    }\n\n    status_str += \"view: \" + std::to_string(this->get_view()) + \"\\n\";\n    status_str += \"last exec: \"  + std::to_string(this->last_executed_sequence_number) + \"\\n\";\n    status_str += \"last local cp: \"  + std::to_string(this->checkpoint_manager->get_latest_local_checkpoint().first) + \"\\n\";\n    status_str += \"last stable cp: \"  + std::to_string(this->checkpoint_manager->get_latest_stable_checkpoint().first) + \"\\n\";\n    if (this->is_primary())\n    {\n        status_str += \"next seq: \" + std::to_string(this->next_issued_sequence_number.value());\n    }\n    LOG(debug) << \"status:\\n\" << status_str;\n\n    status[\"outstanding_operations_count\"] = uint64_t(this->operation_manager->held_operations_count());\n    status[\"is_primary\"] = this->is_primary();\n\n    status[\"latest_stable_checkpoint\"][\"sequence_number\"] = this->checkpoint_manager->get_latest_stable_checkpoint().first;\n    status[\"latest_stable_checkpoint\"][\"hash\"] = this->checkpoint_manager->get_latest_stable_checkpoint().second;\n    status[\"latest_checkpoint\"][\"sequence_number\"] = this->checkpoint_manager->get_latest_local_checkpoint().first;\n    status[\"latest_checkpoint\"][\"hash\"] = this->checkpoint_manager->get_latest_local_checkpoint().second;\n\n    status[\"next_issued_sequence_number\"] = this->next_issued_sequence_number.value();\n    status[\"view\"] = this->view.value();\n\n    status[\"peer_index\"] = bzn::json_message();\n    for (const auto& p : *this->peers_beacon->current())\n    {\n        bzn::json_message peer;\n        peer[\"host\"] = p.host;\n        peer[\"port\"] = p.port;\n        peer[\"name\"] = p.name;\n        peer[\"uuid\"] = p.uuid;\n        status[\"peer_index\"].append(peer);\n    }\n\n    return status;\n}\n\nconst peer_address_t&\npbft::get_peer_by_uuid(const std::string& uuid) const\n{\n    for (auto const& peer : *this->peers_beacon->current())\n    {\n        if (peer.uuid == uuid)\n        {\n            return peer;\n        }\n    }\n\n    // something went wrong. this uuid should exist\n    throw std::runtime_error(\"peer missing from peers list\");\n}\n\ntimestamp_t\npbft::now() const\n{\n    return static_cast<timestamp_t>(std::chrono::duration_cast<std::chrono::milliseconds>(\n        std::chrono::system_clock::now().time_since_epoch()).count());\n}\n\nvoid\npbft::saw_request(const bzn_envelope& req, const request_hash_t& hash)\n{\n    this->recent_requests.insert(std::make_pair(req.timestamp(),\n        std::make_pair(req.sender(), hash)));\n\n    this->recent_requests.erase(this->recent_requests.begin(),\n        this->recent_requests.upper_bound(this->now() - MAX_REQUEST_AGE_MS));\n}\n\nbool\npbft::already_seen_request(const bzn_envelope& req, const request_hash_t& hash) const\n{\n    auto range = this->recent_requests.equal_range(req.timestamp());\n    for (auto r = range.first; r != range.second; r++)\n    {\n        if (r->second.first == req.sender() && r->second.second == hash)\n        {\n            return true;\n        }\n    }\n\n    return false;\n}\n\nstd::shared_ptr<bzn_envelope>\npbft::make_viewchange(\n        uint64_t new_view\n        , uint64_t base_sequence_number\n        , const std::unordered_map<bzn::uuid_t, std::string>& stable_checkpoint_proof\n        , const std::map<uint64_t, std::shared_ptr<bzn::pbft_operation>>& prepared_operations)\n{\n    auto env = std::make_shared<bzn_envelope>();\n    pbft_msg viewchange;\n\n    viewchange.set_type(PBFT_MSG_VIEWCHANGE);\n    viewchange.set_view(new_view);\n    viewchange.set_sequence(base_sequence_number);  // base_sequence_number = n = sequence # of last valid checkpoint\n\n    // C = a set of local 2*f + 1 valid checkpoint messages\n    for (const auto& msg : stable_checkpoint_proof)\n    {\n        bzn_envelope envelope;\n        envelope.ParseFromString(msg.second);\n        *(viewchange.add_checkpoint_messages()) = envelope;\n    }\n\n    // P = a set (of client requests) containing a set P_m  for each request m that prepared at i with a sequence # higher than n\n    // P_m = the pre prepare and the 2 f + 1 prepares\n    //            get the set of operations, from each operation get the messages..\n    for (const auto& operation : prepared_operations)\n    {\n        prepared_proof* prepared_proof = viewchange.add_prepared_proofs();\n        auto pre_prepare = operation.second->get_preprepare();\n        if (!operation.second->has_config_request())\n        {\n            auto req = operation.second->get_request();\n            *(env->add_piggybacked_requests()) = req;\n        }\n\n        prepared_proof->set_allocated_pre_prepare(new bzn_envelope(pre_prepare));\n        for (const auto& sender_envelope : operation.second->get_prepares())\n        {\n            *(prepared_proof->add_prepare()) = sender_envelope.second;\n        }\n    }\n\n    env->set_pbft(viewchange.SerializeAsString());\n    return env;\n}\n\nsize_t\npbft::faulty_nodes_bound(size_t swarm_size)\n{\n    return (swarm_size - 1)/3;\n}\n\nsize_t\npbft::honest_member_size(size_t swarm_size)\n{\n    return pbft::faulty_nodes_bound(swarm_size) + 1;\n}\n\nsize_t\npbft::honest_majority_size(size_t swarm_size)\n{\n    return pbft::faulty_nodes_bound(swarm_size) * 2 + 1;\n}\n\nuint32_t\npbft::generate_random_number(uint32_t min, uint32_t max)\n{\n    std::random_device rd;\n    std::mt19937 gen(rd());\n    std::uniform_int_distribution<uint32_t> dist(min, max);\n    return dist(gen);\n}\n\nvoid pbft::add_session_to_sessions_waiting(const std::string& msg_hash, std::shared_ptr<bzn::session_base> session)\n{\n    if (session)\n    {\n        LOG(debug) << \"Holding session for request \" << bzn::bytes_to_debug_string(msg_hash);\n        this->sessions_waiting_on_forwarded_requests[msg_hash] = session;\n        session->add_shutdown_handler([msg_hash, this, session]()\n        {\n            std::lock_guard<std::mutex> lock(this->pbft_lock);\n            auto it = this->sessions_waiting_on_forwarded_requests.find(msg_hash);\n            if (it != this->sessions_waiting_on_forwarded_requests.end()\n                && (it->second->get_session_id() == session->get_session_id()))\n            {\n                this->sessions_waiting_on_forwarded_requests.erase(it);\n            }\n        });\n    }\n}\n\nvoid\npbft::initialize_persistent_state()\n{\n    persistent<operation_key_t>::init_kv_container<log_key_t>(this->storage, ACCEPTED_PREPREPARES_KEY,\n        this->accepted_preprepares);\n    persistent<bzn_envelope>::init_kv_container2<uuid_t, uint64_t>(this->storage,\n        VALID_VIEWCHANGE_MESSAGES_FOR_VIEW_KEY, this->valid_viewchange_messages_for_view);\n}\n\ncheckpoint_t\npbft::latest_stable_checkpoint() const\n{\n    return this->checkpoint_manager->get_latest_stable_checkpoint();\n}\n\nstd::shared_ptr<bzn::peers_beacon_base>\npbft::peers() const\n{\n    return this->peers_beacon;\n}\n\nvoid\npbft::set_primary_from_newview(const bzn_envelope& new_view)\n{\n    auto peers = this->peers_beacon->current();\n    auto find = std::find_if(peers->begin(), peers->end(),\n            [&](const auto& peer)\n            {\n                return peer.uuid == new_view.sender();\n            });\n\n    if (find == std::end(*peers))\n    {\n        LOG(error) << \"Cannot operate in this view because its primary is not in my peers list; voting for view change\";\n        this->pinned_primary = std::nullopt;\n        this->initiate_viewchange();\n        return;\n    }\n\n    this->pinned_primary = *find;\n}\n"
  },
  {
    "path": "pbft/pbft.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <include/bluzelle.hpp>\n#include <include/boost_asio_beast.hpp>\n#include <pbft/pbft_base.hpp>\n#include <pbft/pbft_service_base.hpp>\n#include <pbft/pbft_persistent_state.hpp>\n#include <pbft/operations/pbft_operation_manager.hpp>\n#include <pbft/pbft_checkpoint_manager.hpp>\n#include <storage/storage_base.hpp>\n#include <status/status_provider_base.hpp>\n#include <crypto/crypto_base.hpp>\n#include <proto/audit.pb.h>\n#include <monitor/monitor_base.hpp>\n#include <mutex>\n#include <gtest/gtest_prod.h>\n#include <options/options_base.hpp>\n#include <include/boost_asio_beast.hpp>\n#include <limits>\n\nnamespace\n{\n    const std::chrono::milliseconds HEARTBEAT_INTERVAL{std::chrono::milliseconds(5000)};\n    const uint64_t CHECKPOINT_INTERVAL = 100; //TODO: KEP-574\n    const double HIGH_WATER_INTERVAL_IN_CHECKPOINTS = 200.0; //TODO: KEP-574\n    const uint64_t MAX_REQUEST_AGE_MS = 3600000; // 1 hour\n    const std::string NOOP_REQUEST_HASH = \"<no op request hash>\";\n\n    const std::string VIEW_KEY{\"view\"};\n    const std::string NEXT_ISSUED_SEQUENCE_NUMBER_KEY{\"next_issued_sequence_number\"};\n    const std::string ACCEPTED_PREPREPARES_KEY{\"accepted_preprepares\"};\n    const std::string VIEW_IS_VALID_KEY{\"view_is_valid\"};\n    const std::string LAST_VIEW_SENT_KEY{\"last_view_sent\"};\n    const std::string VALID_VIEWCHANGE_MESSAGES_FOR_VIEW_KEY{\"valid_viewchange_messages_for_view\"};\n    const std::string SAVED_NEWVIEW_KEY{\"saved_newview\"};\n    const std::string TIMESTAMP_ERROR_MSG{\"INVALID TIMESTAMP\"};\n    const std::string TOO_LARGE_ERROR_MSG{\"REQUEST TOO LARGE\"};\n    const std::string TOO_BUSY_ERROR_MSG{\"SERVER TOO BUSY\"};\n    const std::string DUPLICATE_ERROR_MSG{\"DUPLICATE REQUEST\"};\n}\n\n\nnamespace bzn\n{\n    namespace test\n    {\n        // fwd declare test as it's not in the same namespace...\n        class pbft_test_database_response_is_forwarded_to_session_Test;\n        class pbft_test_add_session_to_sessions_waiting_can_add_a_session_and_shutdown_handler_removes_session_from_sessions_waiting_Test;\n        class pbft_test_pbft_wrap_message_sets_swarm_id_Test;\n        class pbft_test_ensure_save_all_requests_records_requests_Test;\n    }\n\n    using request_hash_t = std::string;\n    using timestamp_t = uint64_t;\n\n    class pbft final : public bzn::pbft_base, public bzn::status_provider_base, public std::enable_shared_from_this<pbft>\n    {\n    public:\n        pbft(\n            std::shared_ptr<bzn::node_base> node\n            , std::shared_ptr<bzn::asio::io_context_base> io_context\n            , std::shared_ptr<bzn::peers_beacon_base> peers\n            , std::shared_ptr<bzn::options_base> options\n            , std::shared_ptr<pbft_service_base> service\n            , std::shared_ptr<bzn::crypto_base> crypto\n            , std::shared_ptr<bzn::pbft_operation_manager> operation_manager\n            , std::shared_ptr<bzn::storage_base> storage\n            , std::shared_ptr<bzn::monitor_base> monitor\n            );\n\n        void start() override;\n\n        void handle_message(const pbft_msg& msg, const bzn_envelope& original_msg) override;\n\n        void handle_database_message(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> session) override;\n\n        void handle_database_response_message(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> session);\n\n        void handle_swarm_error_response_message(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> session);\n\n        bool is_primary() const override;\n\n        std::optional<peer_address_t> get_current_primary() const override;\n\n        std::optional<peer_address_t> predict_primary(uint64_t view) const override;\n\n        const bzn::uuid_t& get_uuid() const override;\n\n        void handle_failure() override;\n\n        void set_audit_enabled(bool setting);\n\n        uint64_t get_low_water_mark();\n\n        uint64_t get_high_water_mark();\n\n        std::string get_name() override;\n\n        bool is_view_valid() const;\n\n        uint64_t get_view() const;\n\n        bzn::json_message get_status() override;\n\n        bool is_valid_viewchange_message(const pbft_msg& msg, const bzn_envelope& original_msg) const;\n\n        bool is_valid_newview_message(const pbft_msg& theirs, const bzn_envelope& original_theirs) const;\n\n        bool is_valid_prepared_proof(const prepared_proof& proof, uint64_t valid_checkpoint_sequence) const;\n\n        std::shared_ptr<bzn::node_base> get_node();\n\n        const peer_address_t& get_peer_by_uuid(const std::string& uuid) const override;\n\n        /*\n         * maximum number of tolerable faults (this can be a parameter, but for now we assume it has the worst-case value)\n         * f = floor( (n-1) / 3 )\n         */\n        static size_t faulty_nodes_bound(size_t swarm_size);\n\n        /*\n         * minimum quorum size such that the majority of the quorum is guaranteed to be honest\n         * 2f+1\n         */\n        static size_t honest_majority_size(size_t swarm_size);\n\n        /*\n         * minimum quorum size such that at least one member is guaranteed to be honest\n         */\n        static size_t honest_member_size(size_t swarm_size);\n\n        static uint32_t generate_random_number(uint32_t min, uint32_t max);\n\n        checkpoint_t latest_stable_checkpoint() const;\n\n        std::shared_ptr<bzn::peers_beacon_base> peers() const override;\n\n    private:\n        bool preliminary_filter_msg(const pbft_msg& msg);\n\n        void handle_request(const bzn_envelope& request, const std::shared_ptr<session_base>& session = nullptr);\n        void handle_preprepare(const pbft_msg& msg, const bzn_envelope& original_msg);\n        void handle_prepare(const pbft_msg& msg, const bzn_envelope& original_msg);\n        void handle_commit(const pbft_msg& msg, const bzn_envelope& original_msg);\n        void handle_checkpoint(const pbft_msg& msg, const bzn_envelope& original_msg);\n        void handle_get_state(const pbft_membership_msg& msg, std::shared_ptr<bzn::session_base> session) const;\n        void handle_set_state(const pbft_membership_msg& msg);\n        void handle_config_message(const pbft_msg& msg, const std::shared_ptr<pbft_operation>& op);\n        void handle_viewchange(const pbft_msg& msg, const bzn_envelope& original_msg);\n        void handle_newview(const pbft_msg& msg, const bzn_envelope& original_msg);\n\n        void maybe_advance_operation_state(const std::shared_ptr<pbft_operation>& op);\n        void do_preprepare(const std::shared_ptr<pbft_operation>& op);\n        void do_preprepared(const std::shared_ptr<pbft_operation>& op);\n        void do_prepared(const std::shared_ptr<pbft_operation>& op);\n        void do_committed(const std::shared_ptr<pbft_operation>& op);\n\n        void handle_bzn_message(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> session);\n        void handle_membership_message(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> session = nullptr);\n\n        bzn_envelope wrap_message(bzn_envelope& env) const;\n        bzn_envelope wrap_message(const pbft_msg& message) const;\n        bzn_envelope wrap_message(const pbft_membership_msg&) const;\n        bzn_envelope wrap_message(const database_response&) const;\n\n        void async_signed_broadcast(const pbft_msg& msg);\n        void async_signed_broadcast(const pbft_membership_msg& message);\n        void async_signed_broadcast(const audit_message& message);\n        void async_signed_broadcast(std::shared_ptr<bzn_envelope> message);\n\n        pbft_msg common_message_setup(const std::shared_ptr<pbft_operation>& op, pbft_msg_type type);\n        std::shared_ptr<pbft_operation> setup_request_operation(const bzn_envelope& msg\n            , const bzn::hash_t& request_hash);\n        void forward_request_to_primary(const bzn_envelope& request_env);\n\n        void broadcast(const bzn_envelope& message);\n\n        void send_error_response(const bzn_envelope& request_env, const std::shared_ptr<session_base>& session\n            , const std::string& hash, const std::string& msg) const;\n\n\n        void handle_audit_heartbeat_timeout(const boost::system::error_code& ec);\n\n        void notify_audit_failure_detected();\n\n        std::shared_ptr<std::string> get_checkpoint_state(const checkpoint_t& cp) const;\n        void set_checkpoint_state(const checkpoint_t& cp, const std::string& data);\n\n        inline size_t quorum_size() const;\n        size_t max_faulty_nodes() const;\n\n        void initialize_persistent_state();\n\n        void maybe_record_request(const bzn_envelope &env, const std::shared_ptr<pbft_operation> &op);\n\n        timestamp_t now() const;\n        bool already_seen_request(const bzn_envelope& msg, const request_hash_t& hash) const;\n        void saw_request(const bzn_envelope& msg, const request_hash_t& hash);\n\n        // VIEWCHANGE/NEWVIEW Helper methods\n        void initiate_viewchange(std::optional<uint64_t> opt_view = std::nullopt);\n        std::shared_ptr<bzn_envelope> make_viewchange(uint64_t new_view, uint64_t n, const std::unordered_map<bzn::uuid_t, std::string>& stable_checkpoint_proof, const std::map<uint64_t, std::shared_ptr<bzn::pbft_operation>>& prepared_operations);\n        pbft_msg make_newview(uint64_t new_view_index,  const std::map<uuid_t,bzn_envelope>& viewchange_envelopes_from_senders, const std::map<uint64_t, bzn_envelope>& pre_prepare_messages) const;\n        pbft_msg build_newview(uint64_t new_view, const std::map<uuid_t,bzn_envelope>& viewchange_envelopes_from_senders, bool attach_reqs = true) const;\n        std::map<bzn::checkpoint_t , std::set<bzn::uuid_t>> validate_and_extract_checkpoint_hashes(const pbft_msg &viewchange_message) const;\n        void save_checkpoint(const pbft_msg& msg);\n        void fill_in_missing_pre_prepares(uint64_t max_checkpoint_sequence, uint64_t new_view, std::map<uint64_t, bzn_envelope>& pre_prepares) const;\n        bool is_peer(const bzn::uuid_t& peer) const;\n        bool get_sequences_and_request_hashes_from_proofs( const pbft_msg& viewchange_msg, std::set<std::pair<uint64_t, std::string>>& sequence_request_pairs) const;\n\n        void add_session_to_sessions_waiting(const std::string &msg_hash, std::shared_ptr<bzn::session_base> session);\n\n        std::map<bzn::hash_t, int> map_request_to_hash(const bzn_envelope& original_msg);\n        void save_all_requests(const pbft_msg& msg, const bzn_envelope& original_msg);\n\n        void set_primary_from_newview(const bzn_envelope& env);\n\n        std::shared_ptr<bzn::storage_base> storage;\n\n        // Using 1 as first value here to distinguish from default value of 0 in protobuf\n        persistent<uint64_t> view{storage, uint64_t{1}, VIEW_KEY};\n        persistent<uint64_t> next_issued_sequence_number{storage, 1, NEXT_ISSUED_SEQUENCE_NUMBER_KEY};\n        uint64_t last_executed_sequence_number{0};\n\n        std::shared_ptr<bzn::node_base> node;\n\n        const bzn::uuid_t uuid;\n        std::shared_ptr<bzn::options_base> options;\n\n        std::shared_ptr<pbft_service_base> service;\n\n        std::mutex pbft_lock;\n\n        std::map<bzn::log_key_t, persistent<bzn::operation_key_t>> accepted_preprepares;\n\n        std::once_flag start_once;\n\n        const std::shared_ptr<bzn::asio::io_context_base> io_context;\n\n        std::unique_ptr<bzn::asio::steady_timer_base> audit_heartbeat_timer;\n\n        bool audit_enabled = true;\n\n        std::multimap<timestamp_t, std::pair<bzn::uuid_t, request_hash_t>> recent_requests;\n\n        std::shared_ptr<crypto_base> crypto;\n\n        // VIEWCHANGE/NEWVIEW members\n        persistent<bool> view_is_valid{storage, true, VIEW_IS_VALID_KEY};\n        persistent<uint64_t> last_view_sent{storage, 0, LAST_VIEW_SENT_KEY};\n\n        std::map<uint64_t,std::map<bzn::uuid_t, persistent<bzn_envelope>>> valid_viewchange_messages_for_view; // set of bzn_envelope, strings since we cannot have a set<bzn_envelope>\n        bzn_envelope saved_newview;\n\n        std::optional<peer_address_t> pinned_primary;\n\n        std::shared_ptr<pbft_operation_manager> operation_manager;\n        std::shared_ptr<peers_beacon_base> peers_beacon;\n        std::shared_ptr<bzn::pbft_checkpoint_manager> checkpoint_manager;\n        std::shared_ptr<bzn::monitor_base> monitor;\n\n        FRIEND_TEST(pbft_viewchange_test, pbft_with_invalid_view_drops_messages);\n        FRIEND_TEST(pbft_viewchange_test, test_make_signed_envelope);\n        FRIEND_TEST(pbft_viewchange_test, test_is_peer);\n        FRIEND_TEST(pbft_viewchange_test, validate_and_extract_checkpoint_hashes);\n        FRIEND_TEST(pbft_viewchange_test, validate_viewchange_checkpoints);\n        FRIEND_TEST(pbft_viewchange_test, test_is_valid_viewchange_message);\n        FRIEND_TEST(pbft_viewchange_test, make_viewchange_makes_valid_message);\n        FRIEND_TEST(pbft_viewchange_test, test_prepared_operations_since_last_checkpoint);\n        FRIEND_TEST(pbft_viewchange_test, test_fill_in_missing_pre_prepares);\n        FRIEND_TEST(pbft_viewchange_test, test_save_checkpoint);\n        FRIEND_TEST(pbft_viewchange_test, test_handle_viewchange);\n        FRIEND_TEST(pbft_viewchange_test, is_valid_viewchange_does_not_throw_if_no_checkpoint_yet);\n\n        FRIEND_TEST(pbft_newview_test, test_pre_prepares_contiguous);\n        FRIEND_TEST(pbft_newview_test, make_newview);\n        FRIEND_TEST(pbft_newview_test, build_newview);\n        FRIEND_TEST(pbft_newview_test, primary_handle_newview);\n        FRIEND_TEST(pbft_newview_test, backup_handle_newview);\n        FRIEND_TEST(pbft_newview_test, validate_and_extract_checkpoint_hashes);\n        FRIEND_TEST(pbft_newview_test, test_get_primary);\n        FRIEND_TEST(pbft_newview_test, get_sequences_and_request_hashes_from_proofs);\n        FRIEND_TEST(pbft_newview_test, test_last_sequence_in_newview_prepared_proofs);\n        FRIEND_TEST(bzn::test::pbft_test, database_response_is_forwarded_to_session);\n        FRIEND_TEST(bzn::test::pbft_test, add_session_to_sessions_waiting_can_add_a_session_and_shutdown_handler_removes_session_from_sessions_waiting);\n        FRIEND_TEST(bzn::test::pbft_test, pbft_wrap_message_sets_swarm_id);\n        FRIEND_TEST(bzn::test::pbft_test, ensure_save_all_requests_records_requests);\n\n        friend class pbft_proto_test;\n        friend class pbft_viewchange_test;\n\n        std::map<bzn::hash_t, std::shared_ptr<bzn::session_base>> sessions_waiting_on_forwarded_requests;\n    };\n\n} // namespace bzn\n"
  },
  {
    "path": "pbft/pbft_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <peers_beacon/peer_address.hpp>\n#include <peers_beacon/peers_beacon_base.hpp>\n#include <node/node_base.hpp>\n#include <pbft/operations/pbft_operation.hpp>\n#include <proto/pbft.pb.h>\n#include <optional>\n#include <string>\n\n\nnamespace bzn\n{\n    using client_t = std::string; //placeholder\n\n    class pbft_base\n    {\n    public:\n        virtual void start() = 0;\n\n        virtual void handle_message(const pbft_msg& msg, const bzn_envelope& original_msg) = 0;\n\n        virtual void handle_database_message(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> session) = 0;\n\n        virtual bool is_primary() const = 0;\n\n        virtual std::optional<peer_address_t> get_current_primary() const = 0;\n\n        virtual std::optional<peer_address_t> predict_primary(uint64_t view) const = 0;\n\n        virtual const bzn::uuid_t& get_uuid() const = 0;\n\n        virtual void handle_failure() = 0;\n\n        virtual const peer_address_t& get_peer_by_uuid(const std::string& uuid) const = 0;\n\n        virtual std::shared_ptr<bzn::peers_beacon_base> peers() const = 0;\n\n        virtual ~pbft_base() = default;\n\n    };\n}\n"
  },
  {
    "path": "pbft/pbft_checkpoint_manager.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <pbft/pbft_checkpoint_manager.hpp>\n#include <proto/pbft.pb.h>\n#include <utils/bytes_to_debug_string.hpp>\n#include <utils/make_endpoint.hpp>\n#include <algorithm>\n#include <pbft/pbft.hpp>\n#include <iterator>\n\nnamespace\n{\n    const std::chrono::milliseconds CHECKPOINT_CATCHUP_GRACE_PERIOD{std::chrono::milliseconds(100)};\n}\n\nusing namespace bzn;\n\npbft_checkpoint_manager::pbft_checkpoint_manager(\n        std::shared_ptr<asio::io_context_base> io_context,\n        std::shared_ptr<storage_base> storage,\n        std::shared_ptr<peers_beacon_base> peers_beacon,\n        std::shared_ptr<node_base> node\n)\n        : io_context(std::move(io_context))\n        , storage(std::move(storage))\n        , peers_beacon(std::move(peers_beacon))\n        , node(std::move(node))\n{\n    this->init_persists();\n}\n\nvoid\npbft_checkpoint_manager::start()\n{\n    this->node->register_for_message(bzn_envelope::kCheckpointMsg,\n            std::bind(&pbft_checkpoint_manager::handle_checkpoint_message, shared_from_this(), std::placeholders::_1, std::placeholders::_2));\n}\n\ncheckpoint_t\npbft_checkpoint_manager::get_latest_stable_checkpoint() const\n{\n    std::lock_guard<std::mutex> lock(this->lock);\n    return this->latest_stable_checkpoint.value();\n}\n\ncheckpoint_t\npbft_checkpoint_manager::get_latest_local_checkpoint() const\n{\n    std::lock_guard<std::mutex> lock(this->lock);\n    return this->latest_local_checkpoint.value();\n}\n\nvoid\npbft_checkpoint_manager::local_checkpoint_reached(const bzn::checkpoint_t& cp)\n{\n    std::lock_guard<std::mutex> lock(this->lock);\n\n    LOG(info) << \"reached local checkpoint at \" << cp.first << \" (\" << bytes_to_debug_string(cp.second) << \")\";\n    if (cp.first <= this->latest_local_checkpoint.value().first)\n    {\n        throw std::runtime_error(\"reached a checkpoint at \" + std::to_string(cp.first)\n                                 + \" which is not newer than the previous checkpoint at \"\n                                 + std::to_string(this->latest_local_checkpoint.value().first));\n    }\n\n    this->latest_local_checkpoint = cp;\n\n    // Compose and send our own cp message\n    checkpoint_msg cp_msg;\n    cp_msg.set_sequence(cp.first);\n    cp_msg.set_state_hash(cp.second);\n\n    bzn_envelope msg;\n    msg.set_checkpoint_msg(cp_msg.SerializeAsString());\n\n    auto msg_ptr = std::make_shared<bzn_envelope>(msg);\n    for (const auto& peer : *(this->peers_beacon->current()))\n    {\n        if (const auto endpoint = bzn::make_endpoint(peer))\n        {\n            this->node->send_maybe_signed_message(*endpoint, msg_ptr);\n        }\n        else\n        {\n            LOG(error) << \"Unable to send_signed_message to \" << peer.uuid << \"-- resolver error\";\n        }\n    }\n\n    if (cp.first == this->latest_local_checkpoint.value().first && cp.second != this->latest_local_checkpoint.value().second)\n    {\n        LOG(error) << \"our checkpoint state disagrees with swarm! sending state request to reconcile\";\n        this->send_state_request();\n    }\n\n    // We will do the stabilization check upon receiving the message from ourself\n}\n\nvoid\npbft_checkpoint_manager::handle_checkpoint_message(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> /*session*/)\n{\n    std::lock_guard<std::mutex> lock(this->lock);\n\n    checkpoint_msg inner;\n    if (!inner.ParseFromString(msg.checkpoint_msg()))\n    {\n        LOG(error) << \"Failed to parse payload of checkpoint message: \" << bytes_to_debug_string(msg.checkpoint_msg());\n        return;\n    }\n\n    if (inner.sequence() < this->latest_local_checkpoint.value().first)\n    {\n        LOG(debug) << \"Ignoring old checkpoint message at \" << inner.sequence();\n        return;\n    }\n\n    // check that sender is in current config\n\n    LOG(debug) << boost::format(\"Got checkpoint message for seq %1% from %2%\") % inner.sequence() % msg.sender();\n    checkpoint_t cp(inner.sequence(), inner.state_hash());\n\n    if (cp.first == this->latest_stable_checkpoint.value().first)\n    {\n        if (cp == this->latest_stable_checkpoint.value())\n        {\n            // save the message as more evidence on the current stable checkpoint (may matter as configs change)\n            this->latest_stable_checkpoint_proof[msg.sender()] = persistent<std::string> {\n                    this->storage, msg.SerializeAsString(), STABLE_CHECKPOINT_PROOF_KEY, msg.sender()\n            };\n        }\n        else\n        {\n            LOG(error) << \"Ignoring checkpoint message from \" << msg.sender() << \"; it conflicts with latest stable\";\n            return;\n        }\n    }\n    else\n    {\n        if (this->partial_checkpoint_proofs[cp].count(msg.sender()) == 0)\n        {\n            this->partial_checkpoint_proofs[cp][msg.sender()] = persistent<std::string>{\n                this->storage,\n                msg.SerializeAsString(),\n                PARTIAL_CHECKPOINT_PROOFS_KEY,\n                cp,\n                msg.sender()\n            };\n        }\n\n        this->maybe_stabilize_checkpoint(cp);\n    }\n}\n\nvoid\npbft_checkpoint_manager::maybe_stabilize_checkpoint(const checkpoint_t& cp)\n{\n    auto peers = this->peers_beacon->current();\n\n    // how many messages do we have supporting this checkpoint from peers in the current config?\n    size_t checkpoint_attestants = std::count_if(this->partial_checkpoint_proofs[cp].begin(), this->partial_checkpoint_proofs[cp].end(),\n            [&peers](const auto& pair)\n            {\n                return peers->end() != std::find_if(\n                        peers->begin(), peers->end(), [&pair](const auto& peer)\n                        {\n                            return peer.uuid == pair.first;\n                        }\n                );\n            }\n    );\n\n    if (checkpoint_attestants >= pbft::honest_member_size(peers->size()))\n    {\n        this->stabilize_checkpoint(cp);\n\n        if (this->latest_local_checkpoint.value().first < cp.first)\n        {\n            LOG(info) << \"We are behind the newly stable checkpoint; scheduling delayed state request\";\n            this->send_delayed_state_request(cp);\n        }\n        else if (this->latest_local_checkpoint.value().first == cp.first\n                 && this->latest_stable_checkpoint.value().second != cp.second)\n        {\n            LOG(error) << \"our checkpoint state disagrees with swarm! sending state request to reconcile\";\n            this->send_state_request();\n        }\n    }\n}\n\nvoid\npbft_checkpoint_manager::stabilize_checkpoint(const bzn::checkpoint_t& cp)\n{\n    LOG(info) << \"Checkpoint at \" << cp.first << \" is now stable (\" << bytes_to_debug_string(cp.second) << \")\";\n\n    // update the checkpoint\n    this->latest_stable_checkpoint = cp;\n\n    // clear the old proof\n    for (auto& pair : this->latest_stable_checkpoint_proof)\n    {\n        pair.second.destroy();\n    }\n    this->latest_stable_checkpoint_proof.clear();\n\n    // copy over the new proof\n    for (const auto& pair : this->partial_checkpoint_proofs[cp])\n    {\n        this->latest_stable_checkpoint_proof[pair.first] = {this->storage, pair.second.value(), STABLE_CHECKPOINT_PROOF_KEY, pair.first};\n    }\n\n    // TODO: don't store incomplete proofs seperately\n\n    // clear old data\n\n    // for each partial proof\n    for (auto& map_pair : this->partial_checkpoint_proofs)\n    {\n        const checkpoint_t& this_cp = map_pair.first;\n        // if it's not newer than the newly stabilized proof\n        if (this_cp.first > cp.first)\n        {\n            continue;\n        }\n\n        // delete all the entries\n        for (auto& msg_pair : map_pair.second)\n        {\n            msg_pair.second.destroy();\n        }\n    }\n\n    // now remove them from memory as well\n    for (auto it = this->partial_checkpoint_proofs.begin(); it != this->partial_checkpoint_proofs.end();)\n    {\n        auto seq = it->first.first;\n        if (seq > cp.first)\n        {\n            it++;\n        }\n        else\n        {\n            it = this->partial_checkpoint_proofs.erase(it);\n        }\n    }\n}\n\nvoid\npbft_checkpoint_manager::send_delayed_state_request(const checkpoint_t& cp)\n{\n    this->trigger_catchup_timer = this->io_context->make_unique_steady_timer();\n    this->trigger_catchup_timer->expires_from_now(CHECKPOINT_CATCHUP_GRACE_PERIOD);\n    this->trigger_catchup_timer->async_wait(\n            [cp, weak_this = weak_from_this()](auto ec)\n            {\n                if (ec)\n                {\n                    return;\n                }\n\n                auto strong_this = weak_this.lock();\n\n                // only request state if we are still behind the stable checkpoint\n                if (strong_this && strong_this->latest_local_checkpoint.value().first < cp.first)\n                {\n                    std::lock_guard<std::mutex> lock(strong_this->lock);\n                    strong_this->send_state_request();\n                }\n            }\n    );\n}\n\nvoid\npbft_checkpoint_manager::send_state_request()\n{\n    pbft_membership_msg msg;\n    msg.set_type(PBFT_MMSG_GET_STATE);\n    msg.set_sequence(this->latest_stable_checkpoint.value().first);\n    msg.set_state_hash(this->latest_stable_checkpoint.value().second);\n\n    uint32_t selected = pbft::generate_random_number(0, this->latest_stable_checkpoint_proof.size() - 1);\n    auto it = this->latest_stable_checkpoint_proof.begin();\n    std::advance(it, selected);\n    auto selected_peer = (*it).first;\n\n    LOG(info) << \"Requesting state at \" << msg.sequence() << \" from \" << selected_peer;\n\n    auto msg_ptr = std::make_shared<bzn_envelope>();\n    msg_ptr->set_pbft_membership(msg.SerializeAsString());\n\n    this->node->send_maybe_signed_message(selected_peer, msg_ptr);\n}\n\nvoid\npbft_checkpoint_manager::init_persists()\n{\n    persistent<std::string>::init_kv_container<bzn::uuid_t>(this->storage, STABLE_CHECKPOINT_PROOF_KEY,\n            this->latest_stable_checkpoint_proof);\n    persistent<std::string>::init_kv_container2<bzn::uuid_t, checkpoint_t>(this->storage, PARTIAL_CHECKPOINT_PROOFS_KEY,\n            this->partial_checkpoint_proofs);\n}\n\nstd::unordered_map<bzn::uuid_t, std::string>\npbft_checkpoint_manager::get_latest_stable_checkpoint_proof() const\n{\n    std::lock_guard<std::mutex> lock(this->lock);\n    std::unordered_map<bzn::uuid_t, std::string> result;\n    for (const auto& pair : this->latest_stable_checkpoint_proof)\n    {\n        result[pair.first] = pair.second.value();\n    }\n\n    return result;\n}\n\nsize_t\npbft_checkpoint_manager::partial_checkpoint_proofs_count() const\n{\n    std::lock_guard<std::mutex> lock(this->lock);\n    return this->partial_checkpoint_proofs.size();\n}\n"
  },
  {
    "path": "pbft/pbft_checkpoint_manager.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <storage/storage_base.hpp>\n#include <pbft/pbft_persistent_state.hpp>\n#include <node/node_base.hpp>\n#include <peers_beacon/peers_beacon_base.hpp>\n#include <mutex>\n\nnamespace bzn\n{\n    const std::string LATEST_STABLE_CHECKPOINT_KEY{\"stable_checkpoint\"};\n    const std::string STABLE_CHECKPOINT_PROOF_KEY{\"stable_checkpoint_proof\"};\n\n    const std::string LATEST_LOCAL_CHECKPOINT_KEY{\"local_checkpoint\"};\n    const std::string PARTIAL_CHECKPOINT_PROOFS_KEY{\"partial_checkpoint_proofs\"};\n\n    const std::string INITIAL_CHECKPOINT_HASH = \"<null db state>\";\n\n    using checkpoint_t = std::pair<uint64_t, bzn::hash_t>;\n\nclass pbft_checkpoint_manager : public std::enable_shared_from_this<pbft_checkpoint_manager>\n    {\n    public:\n        pbft_checkpoint_manager(std::shared_ptr<bzn::asio::io_context_base> io_context,\n                std::shared_ptr<bzn::storage_base> storage,\n                std::shared_ptr<bzn::peers_beacon_base> peers_beacon,\n                std::shared_ptr<bzn::node_base> node);\n\n        void handle_checkpoint_message(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> /*session*/ = nullptr);\n        void local_checkpoint_reached(const checkpoint_t& cp);\n\n        checkpoint_t get_latest_stable_checkpoint() const;\n        checkpoint_t get_latest_local_checkpoint() const;\n\n        std::unordered_map<bzn::uuid_t, std::string> get_latest_stable_checkpoint_proof() const;\n\n        size_t partial_checkpoint_proofs_count() const;\n\n        void start();\n\n    private:\n        void init_persists();\n\n        void maybe_stabilize_checkpoint(const checkpoint_t& cp);\n        void stabilize_checkpoint(const checkpoint_t& cp);\n\n        void send_state_request();\n        void send_delayed_state_request(const checkpoint_t& cp);\n\n        std::shared_ptr<bzn::asio::io_context_base> io_context;\n        std::shared_ptr<bzn::storage_base> storage;\n        std::shared_ptr<bzn::peers_beacon_base> peers_beacon;\n        std::shared_ptr<bzn::node_base> node;\n\n        std::unique_ptr<bzn::asio::steady_timer_base> trigger_catchup_timer;\n\n        persistent<checkpoint_t> latest_stable_checkpoint{storage, {0, INITIAL_CHECKPOINT_HASH}, LATEST_STABLE_CHECKPOINT_KEY};\n        std::unordered_map<bzn::uuid_t, persistent<std::string>> latest_stable_checkpoint_proof;\n\n        persistent<checkpoint_t> latest_local_checkpoint{storage, {0, INITIAL_CHECKPOINT_HASH}, LATEST_LOCAL_CHECKPOINT_KEY};\n        std::map<checkpoint_t, std::unordered_map<bzn::uuid_t, persistent<std::string>>> partial_checkpoint_proofs;\n\n        mutable std::mutex lock;\n    };\n\n}\n"
  },
  {
    "path": "pbft/pbft_persistent_state.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <pbft/pbft_persistent_state.hpp>\n#include <boost/format.hpp>\n#include <boost/lexical_cast.hpp>\n#include <pbft/operations/pbft_operation.hpp>\n\nusing namespace bzn;\n\nstd::set<std::string> persist_base::initialized_containers;\n\nstd::string\npersist_base::escape(const std::string& input)\n{\n    std::string output;\n\n    for (auto ch : input)\n    {\n        output += (ch == ESCAPE_1) ? std::string{ESCAPE_1} + ESCAPE_2 : std::string{ch};\n    }\n\n    return output;\n}\n\nstd::string\npersist_base::unescape(const std::string& input)\n{\n    std::string output;\n\n    auto it = input.begin();\n    while (it != input.end())\n    {\n        if (*it == ESCAPE_1)\n        {\n            if (it + 1 != input.end() && *(it + 1) == ESCAPE_2)\n            {\n                output += *it;\n                it += 2;\n            }\n            else\n            {\n                // a bare ESCAPE_1 character was found, which should never happen.\n                // if you hit this you've likely specified a key incorrectly\n                LOG(error) << \"illegal character unescaping key for persistent value\";\n                throw std::runtime_error(\"illegal character unescaping key for persistent value\");\n            }\n        }\n        else\n        {\n            output += *it++;\n        }\n    }\n\n    return output;\n}\n\ntemplate<>\nstd::string\npersistent<std::string>::to_string(const std::string &value)\n{\n    return value;\n}\n\ntemplate<>\nstd::string\npersistent<std::string>::from_string(const std::string &value)\n{\n    return value;\n}\n\ntemplate<>\nstd::string\npersistent<bzn::log_key_t>::to_string(const bzn::log_key_t &key)\n{\n    return (boost::format(\"%020u_%020u\") % std::get<0>(key) % std::get<1>(key)).str();\n}\n\ntemplate<>\nbzn::log_key_t\npersistent<bzn::log_key_t>::from_string(const std::string &value)\n{\n    auto offset = value.find('_');\n    if (offset < value.size())\n    {\n        try\n        {\n            uint64_t v0 = boost::lexical_cast<uint64_t>(value.substr(0, offset).c_str());\n            uint64_t v1 = boost::lexical_cast<uint64_t>(value.substr(offset + 1).c_str());\n            if (v0 && v1)\n            {\n                return log_key_t{v0, v1};\n            }\n        }\n        catch (boost::bad_lexical_cast &)\n        {\n            LOG(error) << \"Error converting log key from persistent state\";\n        }\n    }\n\n    LOG(error) << \"bad log key from persistent state\";\n    throw std::runtime_error(\"bad log key from persistent state\");\n}\n\ntemplate<>\nstd::string\npersistent<bzn::operation_key_t>::to_string(const bzn::operation_key_t &key)\n{\n    return (boost::format(\"%020u_%020u_%s\") % std::get<0>(key) % std::get<1>(key) % std::get<2>(key)).str();\n}\n\ntemplate<>\nbzn::operation_key_t\npersistent<bzn::operation_key_t>::from_string(const std::string &value)\n{\n    auto offset1 = value.find('_');\n    if (offset1 < value.size())\n    {\n        auto offset2 = value.find('_', offset1 + 1);\n        if (offset2 < value.size())\n        {\n            try\n            {\n                uint64_t v0 = boost::lexical_cast<uint64_t>(value.substr(0, offset1).c_str());\n                uint64_t v1 = boost::lexical_cast<uint64_t>(\n                    value.substr(offset1 + 1, offset2 - (offset1 + 1)).c_str());\n                if (v0 && v1 && !value.substr(offset2 + 1).empty())\n                {\n                    return operation_key_t{v0, v1, value.substr(offset2 + 1)};\n                }\n            }\n            catch (boost::bad_lexical_cast &)\n            {\n                LOG(warning) << \"Error converting operation key\";\n            }\n        }\n    }\n\n    LOG(error) << \"bad log key from persistent state\";\n    throw std::runtime_error(\"bad log key from persistent state\");\n}\n\ntemplate<>\nstd::string\npersistent<bzn::checkpoint_t>::to_string(const bzn::checkpoint_t &cp)\n{\n    return (boost::format(\"%020u_%s\") % cp.first % cp.second).str();\n}\n\ntemplate<>\nbzn::checkpoint_t\npersistent<bzn::checkpoint_t>::from_string(const std::string &value)\n{\n    auto offset = value.find('_');\n    if (offset < value.size())\n    {\n        try\n        {\n            uint64_t v0 = boost::lexical_cast<uint64_t>(value.substr(0, offset).c_str());\n\n            // TODO: checkpoint hashes are currently empty. remove comments after they're done (KEP-1203)\n//            if (!value.substr(offset + 1).empty())\n//            {\n                return checkpoint_t{v0, value.substr(offset + 1)};\n//            }\n        }\n        catch (boost::bad_lexical_cast &)\n        {\n            LOG(warning) << \"Error converting checkpoint\";\n        }\n    }\n\n    LOG(error) << \"bad checkpoint from persistent state\";\n    throw std::runtime_error(\"bad checkpoint from persistent state\");\n}\n\ntemplate <>\nstd::string\npersistent<uint64_t>::to_string(const uint64_t& val)\n{\n    return (boost::format(\"%020u\") % val).str();\n}\n\ntemplate <>\nuint64_t\npersistent<uint64_t>::from_string(const std::string& value)\n{\n    try\n    {\n        return boost::lexical_cast<uint64_t>(value);\n    }\n    catch (boost::bad_lexical_cast &)\n    {\n    }\n\n    LOG(error) << \"bad uint64_t from persistent state\";\n    throw std::runtime_error(\"bad uint64_t from persistent state\");\n}\n\ntemplate<>\nstd::string\npersistent<bool>::to_string(const bool &val)\n{\n    return (boost::format(\"%01u\") % val).str();\n}\n\ntemplate<>\nbool\npersistent<bool>::from_string(const std::string &value)\n{\n    try\n    {\n        return boost::lexical_cast<bool>(value);\n    }\n    catch (boost::bad_lexical_cast &)\n    {\n    }\n\n    LOG(error) << \"bad bool from persistent state\";\n    throw std::runtime_error(\"bad bool from persistent state\");\n}\n\ntemplate<>\nstd::string\npersistent<bzn_envelope>::to_string(const bzn_envelope &val)\n{\n    return val.SerializeAsString();\n}\n\ntemplate<>\nbzn_envelope\npersistent<bzn_envelope>::from_string(const std::string &value)\n{\n    bzn_envelope env;\n    if (env.ParseFromString(value))\n    {\n        return env;\n    }\n\n    LOG(error) << \"bad bzn_envelope from persistent state\";\n    throw std::runtime_error(\"bad bzn_envelope from persistent state\");\n}\n"
  },
  {
    "path": "pbft/pbft_persistent_state.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <storage/storage_base.hpp>\n#include <boost/format.hpp>\n#include <boost/lexical_cast.hpp>\n#include <gtest/gtest_prod.h>\n#include <include/bluzelle.hpp>\n#include <pbft/operations/pbft_operation.hpp>\n\nnamespace\n{\n    const char ESCAPE_1 = '/';\n    const char ESCAPE_2 = '$';\n    const std::string SEPARATOR = \"//\";\n    const std::string SEPARATOR_END = \"/\" + std::string{'/' + 1};\n    const std::string STATE_UUID{\"pbftstate\"};\n}\n\nnamespace bzn\n{\n    using checkpoint_t = std::pair<uint64_t, bzn::hash_t>;\n\n    class persist_base\n    {\n    protected:\n        static std::string escape(const std::string& input);\n        static std::string unescape(const std::string& input);\n\n        static std::set<std::string> initialized_containers;\n    };\n\n    // A persistent value that is stored with a unique key specified by an object name and a series of\n    // zero or more sub-keys. The sub-keys are used to create a unique storage key for each element within a\n    // (possibly nested) collection such as a map or set.\n    //\n    // For non-collection types, declare an object of type persistent<type> and initialize it with\n    // { storage, default-value, unique-key }. If the variable already exists in storage it will be initialized\n    // with its stored state. If not it will use the provided default value.\n    //\n    // For containers, at instantiation time (e.g. insert, emplace, etc), insert the value as\n    // { storage, value, unique-object-name, key-name, key-name... }, where the key-names are the\n    // keys for each nested map, set, vector, etc.\n    // E.g. for map<int, persistent<std::string>> items, you would insert a string mapped to the integer 9 using:\n    // map.insert(std::make_pair(9, {storage, \"value\", \"items\", 9}); which would yield a storage key \"items_00009\".\n    //\n    // In the case of nested maps, multiple subkeys are needed to guarantee the uniqueness of the generated\n    // storage key. e.g. for map<int, map<char, persistent<string>>> nesty; you would insert an item in the 7 map,\n    // mapped to the char 'x' like so: nesty[7]['x'] = {storage, \"value\", \"nesty\", 'x', 7}; which would yield a\n    // storage key \"nesty_x_00007\".\n    //\n    // For consistency, it's recommended that in nested collections the sub-keys be ordered from inner to outer.\n    //\n    // Containers of persistent values MUST be initialized before use. Use one of the initialize methods below\n    // to load any existing contents of a container from storage before accessing the container, even if empty.\n    // The basic initialize methods take a lambda that should emplace elements into the container. There are also\n    // helper methods for initializing key/value-style containers such as maps.\n    //\n    // Each type used as a value or a key requires specialized to_string and from_string methods. Implementation are\n    // provided for std::string, uint64_t and a couple of types used by pbft. Unfortunately it's not possible to\n    // implement a generic *_string methods for tuples, or even for each tuple arity, as C++ doesn't allow\n    // specialization for (non-concrete) templated types without specializing the entire class template.\n    //\n    // In order to permanently remove a persistent variable it is necessary to call the destroy() method. This is\n    // because the variable's value is intended to persist after the object representing it is destructed.\n    // In the case of members of a collection (e.g. map, set), each member must be destroy()'d if you wish to erase\n    // it from storage. If you do not do this, it will re-appear with its previous value the next time the collection\n    // is initialized, or if an element with the same key is added later.\n    //\n    template <typename T>\n    class persistent : public persist_base\n    {\n    public:\n        // construct a persistent variable, retrieving its value from storage if it exists, otherwise\n        // initializing it with the provided default.\n        template <typename... K>\n        persistent(std::shared_ptr<bzn::storage_base> persist_storage, const T& default_value, const std::string& name, K... subkeys)\n            : storage(persist_storage), key(escape(name) + generate_key(subkeys...))\n        {\n            std::scoped_lock<std::mutex> locker(*(this->lock));\n            if (this->storage)\n            {\n                if (sizeof...(subkeys))\n                {\n                    if (initialized_containers.find(name) == initialized_containers.end())\n                    {\n                        LOG(error) << \"Use of uninitialized collection of persistent values:  \" << name;\n                        throw std::runtime_error(\"Use of uninitialized collection of persistent values: \" + name);\n                    }\n                }\n\n                auto val = this->storage->read(STATE_UUID, this->key);\n                if (val)\n                {\n                    t = from_string(*val);\n                }\n                else\n                {\n                    t = default_value;\n                    auto val = to_string(t);\n                    auto result = this->storage->create(STATE_UUID, this->key, val);\n                    if (result != storage_result::ok)\n                    {\n                        LOG(error) << \"Failed to initialize value in storage - result: \" << static_cast<uint64_t>(result)\n                            << \" key: \" << this->key\n                            << \" value size: \" << val.size()\n                            << \" value: \" << val.substr(0, MAX_MESSAGE_SIZE);\n                        throw std::runtime_error(\"Error initializing value in storage\");\n                    }\n                }\n            }\n            else\n            {\n                throw std::runtime_error(\"No persistent storage defined\");\n            }\n        }\n\n        // conversion constructor for comparison in maps etc. without placing in storage\n        // made explicit to avoid unintentionally assign a raw type to a persistent\n        explicit persistent(const T& value)\n        : t(value)\n        {}\n\n        // default constructor to allow use of [] and insert_or_assign in maps, etc.\n        persistent()\n        {}\n\n        // assign a new value to a persistent variable. the new value is immediately placed in storage\n        persistent<T>& operator=(const T& value)\n        {\n            std::scoped_lock<std::mutex> locker(*(this->lock));\n            this->validate();\n\n            t = value;\n            if (this->storage)\n            {\n                auto res = this->storage->update(STATE_UUID, this->key, to_string(value));\n                if (res != storage_result::ok)\n                {\n                    LOG(error) << \"Error \" << static_cast<uint64_t>(res) << \" storing persistent value with key: \" << this->key;\n                    throw(std::runtime_error(\"Error storing persistent value\"));\n                }\n            }\n            else\n            {\n                throw(std::runtime_error(\"Object has no storage\"));\n            }\n\n            return *this;\n        }\n\n        // since the lifetime of the value is not tied to the object, it's necessary to explicitly\n        // destroy it in order to remove from storage\n        void destroy()\n        {\n            std::scoped_lock<std::mutex> locker(*(this->lock));\n            if (this->storage)\n            {\n                this->storage->remove(STATE_UUID, this->key);\n            }\n            else\n            {\n                throw(std::runtime_error(\"Object has no storage\"));\n            }\n        }\n\n        // get the value of the variable\n        const T& value() const\n        {\n            std::scoped_lock<std::mutex> locker(*(this->lock));\n            this->validate();\n            return t;\n        }\n\n        // comparison operator, mainly for ordering in collections\n        bool operator<(const persistent<T>& rhs) const\n        {\n            std::scoped_lock<std::mutex> locker(*(this->lock));\n            return t < rhs.t;\n        }\n\n        // test for equality\n        bool operator==(const persistent<T>& rhs) const\n        {\n            std::scoped_lock<std::mutex> locker(*(this->lock));\n            return t == rhs.t;\n        }\n\n        static T from_string(const std::string& /*value*/)\n        {\n            // this method needs to be specialized for each type used\n            throw std::runtime_error(\"no conversion available for this type from string\");\n        }\n\n        static std::string to_string(const T& /*value*/)\n        {\n            // this method needs to be specialized for each type used\n            throw std::runtime_error(\"no conversion available for this type to string\");\n        }\n\n        // initialize values in a container\n        template<typename A>\n        static void\n        initialize(std::shared_ptr<bzn::storage_base> storage, const std::string& basename\n            , std::function<void(const persistent<T>&, const A&)> store)\n        {\n            // record that this collection has been initialized\n            initialized_containers.insert(basename);\n\n            auto escaped_base = escape(basename);\n            auto results = storage->get_keys_if(STATE_UUID, escaped_base + SEPARATOR\n                , escaped_base + SEPARATOR_END);\n            for (const auto& res : results)\n            {\n                auto key_str = unescape(res.substr(escaped_base.size() + SEPARATOR.size()));\n                A key{persistent<A>::from_string(key_str)};\n\n                LOG(debug) << \"initializing state \" << res << \" from storage\";\n\n                // instantiate this member from storage and pass it to be emplaced into container\n                store(persistent<T>{storage, {}, basename, key}, key);\n            }\n        }\n\n        // initialize values in a nested container\n        // note - we need a version of this function for each number of sub-keys\n        template<typename A, typename B>\n        static void\n        initialize(std::shared_ptr<bzn::storage_base> storage, const std::string& basename\n            , std::function<void(const persistent<T>&, const A&, const B&)> store)\n        {\n            // record that this container has been initialized\n            initialized_containers.insert(basename);\n\n            auto escaped_base = escape(basename);\n            auto results = storage->get_keys_if(STATE_UUID, escaped_base + SEPARATOR\n                , escaped_base + SEPARATOR_END);\n            for (const auto& res : results)\n            {\n                std::tuple<A, B> subkeys = extract_subkeys<A, B>(res.substr(escaped_base.size() + SEPARATOR.size()));\n\n                LOG(debug) << \"initializing state \" << res << \" from storage\";\n\n                // instantiate this member from storage and pass it to be emplaced into container\n                store(persistent<T>{storage, {}, basename, std::get<0>(subkeys), std::get<1>(subkeys)}\n                    , std::get<0>(subkeys), std::get<1>(subkeys));\n            }\n        }\n\n        // helper to initialize values in a key-value container\n        template<typename A, typename C>\n        static void\n        init_kv_container(std::shared_ptr<bzn::storage_base> storage, const std::string& basename, C& container)\n        {\n            initialize<A>(storage, basename, [&container](auto value, auto key)\n            {\n                container.emplace(key, value);\n            });\n        }\n\n        // helper to initialize values in a nested key-value container\n        // note - the outer container can be non-kv such as a set\n        template<typename A, typename B, typename C>\n        static void\n        init_kv_container2(std::shared_ptr<bzn::storage_base> storage, const std::string& basename, C& container)\n        {\n            initialize<A, B>(storage, basename, [&container](auto value, auto key1, auto key2)\n            {\n                container[key2].emplace(key1, value);\n            });\n        }\n\n        // note - this could be expanded into a variadic to support an arbitrary number of sub-keys\n        template<typename A, typename B>\n        static std::tuple<A, B>\n        extract_subkeys(const std::string& key)\n        {\n            // find unescaped separator\n            size_t offset{0};\n            while (offset < key.size())\n            {\n                offset = key.find(ESCAPE_1, offset);\n                if (offset >= key.size() || key[offset + 1] != ESCAPE_2)\n                {\n                    break;\n                }\n\n                offset += 2;\n            }\n\n            assert(offset <= key.size() - SEPARATOR.size());\n            assert(key[offset + 1] == ESCAPE_1);\n            std::string v0 = key.substr(0, offset);\n            std::string v1 = key.substr(offset + SEPARATOR.size());\n            return {persistent<A>::from_string(unescape(v0)), persistent<B>::from_string(unescape(v1))};\n        }\n\n    private:\n        T t;\n        std::shared_ptr<bzn::storage_base> storage;\n        std::string key;\n        std::shared_ptr<std::mutex> lock = std::make_shared<std::mutex>();\n\n        static std::string generate_key()\n        {\n            return \"\";\n        }\n\n        template <typename K, typename... Rest>\n        static std::string generate_key(K k, Rest... rest)\n        {\n            return SEPARATOR + escape(persistent<K>::to_string(k)) + generate_key(rest...);\n        }\n\n        void validate() const\n        {\n#ifndef NDEBUG\n            if (this->storage)\n            {\n                auto val = this->storage->read(STATE_UUID, this->key);\n                if (val)\n                {\n                    if (val != to_string(t))\n                    {\n                        LOG(error) << \"validation error for persistent value with key: \" << this->key;\n                        LOG(error) << \"stored value size is: \" << (*val).size();\n                        LOG(error) << \"in-mem value size is: \" << to_string(t).size();\n                        throw std::runtime_error(this->key + \": Persistent value in memory does not match stored value\");\n                    }\n                }\n                else\n                {\n                    LOG(error) << \"missing value for persistent value with key: \" << this->key;\n                    throw std::runtime_error(this->key + \": Persistent value missing from storage\");\n                }\n            }\n            else\n            {\n                throw std::runtime_error(\"No persistent storage defined\");\n            }\n#endif\n        }\n        FRIEND_TEST(persistent_state_test, test_escaping);\n    };\n\n    template<> std::string persistent<std::string>::to_string(const std::string& value);\n    template<> std::string persistent<std::string>::from_string(const std::string& value);\n\n    template<> std::string persistent<bzn::log_key_t>::to_string(const bzn::log_key_t& key);\n    template<> bzn::log_key_t persistent<bzn::log_key_t>::from_string(const std::string& value);\n\n    template<> std::string persistent<bzn::operation_key_t>::to_string(const bzn::operation_key_t& key);\n    template<> bzn::operation_key_t persistent<bzn::operation_key_t>::from_string(const std::string& value);\n\n    template<> std::string persistent<bzn::checkpoint_t>::to_string(const bzn::checkpoint_t& cp);\n    template<> bzn::checkpoint_t persistent<bzn::checkpoint_t>::from_string(const std::string& value);\n\n    template <> std::string persistent<uint64_t>::to_string(const uint64_t& val);\n    template <> uint64_t persistent<uint64_t>::from_string(const std::string& value);\n\n    template<> std::string persistent<bool>::to_string(const bool& val);\n    template<> bool persistent<bool>::from_string(const std::string& value);\n\n    template<> std::string persistent<bzn_envelope>::to_string(const bzn_envelope& val);\n    template<> bzn_envelope persistent<bzn_envelope>::from_string(const std::string& value);\n}\n"
  },
  {
    "path": "pbft/pbft_service_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <cstdint>\n#include <include/bluzelle.hpp>\n#include <proto/bluzelle.pb.h>\n#include <pbft/operations/pbft_operation.hpp>\n\nnamespace bzn\n{\n    using execute_handler_t = std::function<void(std::shared_ptr<bzn::pbft_operation>)>;\n\n    class pbft_service_base\n    {\n    public:\n\n        virtual ~pbft_service_base() = default;\n\n        /*\n         * Interface for some service that is replicated by pbft. There could a layer that just handles the logic\n         * required by this interface, but if the underlying service is a database than that would probably be awkward.\n         *\n         * Caller must guarantee:\n         * - If apply_operation(x, y) is called, then apply_operation(x2, y) will never be called with x != x2\n         * - If apply_operation(_, y) is called and y != 0, then apply_operation(_, y-1) will be called at least once\n         *     (may be before or after apply_operation(_, y).\n         * - If consolidate_log(y) is called, then no subsequenent call to query(x, y2) will have y2 < y\n         *     (so the service may consolidate all the updates before y into a single version of the service on disk)\n         * - consolidate_log(y) is called if forall y2<y, apply_operation(_, y2) has already been called\n         * - After consolidate_log(y) is called, no future call apply_operation(_, y2) or query(_, y2)\n         *     or consolidate_log(y2) will have y2 < y\n         *\n         * Implementation must guarantee:\n         * - If apply_operation(x, y) is called with y != 0, the request will not be executed until after the request\n         *     supplied in the call apply_operation(x2, y-1).\n         * - When apply_operation(x, y) is called, it will be persisted to disk before the method returns even if\n         *     x cannot yet be executed due to the first constraint\n         * - The result of query(x, y) is the result of applying x against the version of the service where every\n         *   operation with sequence number <= y has been applied, except operations that cannot yet be applied\n         *   due to the first constraint. So, where cp is the last call to consolidate_log(cp) and curr is the last\n         *   executed request sequence number, when query(x, y) is called, assuming the service is crud:\n         *      if y >= curr, use the most up to date version of the key you have applied (still obeying constraint 1)\n         *      if curr > y > cp, use the most up to date version of the key written before y, or the stable checkpoint\n         *        if it hasn't been written to in that interval\n         *      if cp == y, use the version of the key from the stable checkpoint\n         *      if cp > y, the caller has broken a constraint\n         * - Operations are applied at most once (crud operations are idempotent anyway)\n         *\n         * Notably not guarenteed:\n         *  - apply_operation(x, y) called only once for the same value y\n         *  - apply_operation(x, y) called with monotomically increasing y\n         */\n\n        /*\n         * PBFT has concluded that an operation is committed-local, it can now be applied as soon as all earlier\n         * operations have been applied.\n         */\n        virtual void apply_operation(const std::shared_ptr<pbft_operation>& op) = 0;\n\n        virtual bool apply_operation_now(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> session) = 0;\n\n        /*\n         * Get the hash of the database state (presumably this will be a merkle tree root, but the details don't matter\n         * for now)- same semantics as query\n         */\n        virtual bzn::hash_t service_state_hash(uint64_t sequence_number) const = 0;\n\n        /*\n         * Get the full database state at the given sequence number, if available\n         */\n        virtual std::shared_ptr<bzn::service_state_t> get_service_state(uint64_t sequence_number) const = 0;\n\n        /*\n         * Set the full database state at the given sequence number\n         */\n        virtual bool set_service_state(uint64_t sequence_number, const bzn::service_state_t& data) = 0;\n\n        /*\n         * Tell the service to checkpoint its state when it reaches this sequence number\n         */\n        virtual void save_service_state_at(uint64_t sequence_number) = 0;\n\n        /*\n         * A checkpoint has been stabilized, so we no longer need any history from before then.\n         */\n        virtual void consolidate_log(uint64_t sequence_number) = 0;\n\n        /*\n         * Callback when a request is executed (not committed, since the service is responsible for the difference\n         * between the two). Should only be called once for each sequence number, in strictly increasing order.\n         */\n        virtual void register_execute_handler(bzn::execute_handler_t handler) = 0;\n\n    };\n\n}\n"
  },
  {
    "path": "pbft/test/CMakeLists.txt",
    "content": "set(test_srcs\n    pbft_test.cpp\n    pbft_audit_test.cpp\n    pbft_test_common.cpp\n    pbft_checkpoint_tests.cpp\n    pbft_proto_test.cpp\n    pbft_catchup_test.cpp\n    pbft_timestamp_test.cpp\n    database_pbft_service_test.cpp\n    pbft_proto_test.cpp\n    pbft_newview_test.cpp\n    pbft_persistent_state_test.cpp\n    pbft_viewchange_test.cpp\n    pbft_peer_change_test.cpp)\nset(test_libs pbft pbft_operations crypto options ${Protobuf_LIBRARIES} storage ${ROCKSDB_LIBRARIES} smart_mocks)\n\nadd_gmock_test(pbft)\n"
  },
  {
    "path": "pbft/test/database_pbft_service_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n\n#include <mocks/mock_boost_asio_beast.hpp>\n#include <mocks/mock_storage_base.hpp>\n#include <mocks/mock_session_base.hpp>\n#include <mocks/mock_monitor.hpp>\n#include <pbft/database_pbft_service.hpp>\n#include <pbft/operations/pbft_memory_operation.hpp>\n#include <storage/mem_storage.hpp>\n#include <mocks/mock_crud_base.hpp>\n\nusing namespace ::testing;\n\nnamespace\n{\n    const std::string TEST_UUID{\"uuid\"};\n    const std::string DEFAULT_NEXT_REQUEST_SEQUENCE{\"1\"};\n}\n\n\nTEST(database_pbft_service, test_that_on_construction_if_next_request_sequence_doesnt_exist_its_created)\n{\n    auto mock_storage = std::make_shared<bzn::mock_storage_base>();\n\n    EXPECT_CALL(*mock_storage, read(_, _)).WillOnce(Return(std::optional<bzn::value_t>()));\n    EXPECT_CALL(*mock_storage, create(_, _, DEFAULT_NEXT_REQUEST_SEQUENCE)).WillOnce(Return(bzn::storage_result::ok));\n    EXPECT_CALL(*mock_storage, update(_, _, DEFAULT_NEXT_REQUEST_SEQUENCE)).WillOnce(Return(bzn::storage_result::ok));\n\n    bzn::database_pbft_service dps(std::make_shared<bzn::asio::mock_io_context_base>(), mock_storage, std::make_shared<bzn::mock_crud_base>(), nullptr, TEST_UUID);\n}\n\n\nTEST(database_pbft_service, test_that_on_construction_if_next_request_sequence_exists_its_loaded)\n{\n    auto mock_storage = std::make_shared<bzn::mock_storage_base>();\n\n    EXPECT_CALL(*mock_storage, read(_, _)).WillOnce(Return(std::optional<bzn::value_t>(\"123\")));\n    EXPECT_CALL(*mock_storage, update(_, _, \"123\")).WillOnce(Return(bzn::storage_result::ok));\n\n    bzn::database_pbft_service dps(std::make_shared<bzn::asio::mock_io_context_base>(), mock_storage, std::make_shared<bzn::mock_crud_base>(), nullptr, TEST_UUID);\n}\n\n\nTEST(database_pbft_service, test_that_on_construction_if_next_request_sequence_doesnt_exist_it_throws_if_error_occurs)\n{\n    auto mock_storage = std::make_shared<bzn::mock_storage_base>();\n\n    EXPECT_CALL(*mock_storage, read(_, _)).WillOnce(Return(std::optional<bzn::value_t>()));\n    EXPECT_CALL(*mock_storage, create(_, _, DEFAULT_NEXT_REQUEST_SEQUENCE)).WillOnce(Return(bzn::storage_result::value_too_large));\n\n    EXPECT_THROW(bzn::database_pbft_service dps(std::make_shared<bzn::asio::mock_io_context_base>(), mock_storage, std::make_shared<bzn::mock_crud_base>(), nullptr, TEST_UUID), std::runtime_error);\n}\n\n\nTEST(database_pbft_service, test_that_failed_storing_of_operation_does_not_throw_for_duplicate)\n{\n    auto mock_storage = std::make_shared<bzn::mock_storage_base>();\n\n    EXPECT_CALL(*mock_storage, read(_, _)).WillOnce(Return(std::optional<bzn::value_t>()));\n    EXPECT_CALL(*mock_storage, create(_, _, DEFAULT_NEXT_REQUEST_SEQUENCE)).WillOnce(Return(bzn::storage_result::ok));\n\n    bzn::database_pbft_service dps(std::make_shared<bzn::asio::mock_io_context_base>(), mock_storage, std::make_shared<bzn::mock_crud_base>(), nullptr, TEST_UUID);\n\n    EXPECT_CALL(*mock_storage, create(_, _, _)).WillOnce(Return(bzn::storage_result::exists));\n    EXPECT_CALL(*mock_storage, update(_, _, _)).WillOnce(Return(bzn::storage_result::ok));\n\n    auto operation = std::make_shared<bzn::pbft_memory_operation>(0, 1, \"somehash\");\n    database_msg dmsg;\n    bzn_envelope request;\n    request.set_database_msg(dmsg.SerializeAsString());\n    operation->record_request(request);\n\n    EXPECT_NO_THROW(dps.apply_operation(operation));\n}\n\nTEST(database_pbft_service, test_that_executed_operation_fires_callback_with_operation)\n{\n    auto mem_storage = std::make_shared<bzn::mem_storage>();\n    auto mock_io_context = std::make_shared<bzn::asio::mock_io_context_base>();\n    auto mock_crud = std::make_shared<NiceMock<bzn::mock_crud_base>>();\n\n    EXPECT_CALL(*mock_io_context, post(_)).WillOnce(InvokeArgument<0>());\n\n    auto mock_monitor = std::make_shared<bzn::mock_monitor>();\n\n    EXPECT_CALL(*mock_monitor, finish_timer(bzn::statistic::request_latency, \"somehash\"));\n\n    bzn::database_pbft_service dps(mock_io_context, mem_storage, mock_crud, mock_monitor, TEST_UUID);\n\n    auto operation = std::make_shared<bzn::pbft_memory_operation>(0, 1, \"somehash\");\n    bool execute_handler_called_with_operation = false;\n\n    database_msg msg;\n    msg.mutable_header()->set_db_uuid(TEST_UUID);\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create()->set_key(\"key2\");\n    msg.mutable_create()->set_value(\"value2\");\n\n    bzn_envelope env;\n    env.set_database_msg(msg.SerializeAsString());\n\n    operation->record_request(env);\n\n    dps.register_execute_handler(\n            [&](const auto& operation_ptr)\n            {\n                execute_handler_called_with_operation = operation_ptr->get_request_hash() == \"somehash\";\n            });\n\n    dps.apply_operation(operation);\n\n    EXPECT_TRUE(execute_handler_called_with_operation);\n\n}\n\n\nTEST(database_pbft_service, test_that_apply_operation_now_is_handled)\n{\n    auto mem_storage = std::make_shared<bzn::mem_storage>();\n    auto mock_io_context = std::make_shared<bzn::asio::mock_io_context_base>();\n    auto mock_crud = std::make_shared<bzn::mock_crud_base>();\n\n    bzn::database_pbft_service dps(mock_io_context, mem_storage, mock_crud, nullptr, TEST_UUID);\n\n    // requires pbft...\n    {\n        database_msg msg;\n        msg.mutable_header()->set_db_uuid(TEST_UUID);\n        msg.mutable_header()->set_nonce(uint64_t(123));\n        msg.mutable_create()->set_key(\"key2\");\n        msg.mutable_create()->set_value(\"value2\");\n\n        bzn_envelope env;\n        env.set_database_msg(msg.SerializeAsString());\n\n        ASSERT_FALSE(dps.apply_operation_now(env, nullptr));\n    }\n\n    // bypass pbft using quick read...\n    {\n        database_msg msg;\n        msg.mutable_header()->set_db_uuid(TEST_UUID);\n        msg.mutable_header()->set_nonce(uint64_t(123));\n        msg.mutable_quick_read()->set_key(\"key2\");\n\n        bzn_envelope env;\n        env.set_database_msg(msg.SerializeAsString());\n\n        EXPECT_CALL(*mock_crud, handle_request(_,_,_));\n\n        ASSERT_TRUE(dps.apply_operation_now(env, nullptr));\n    }\n}\n\n\nTEST(database_pbft_service, test_that_stored_operation_is_executed_in_order_and_registered_handler_is_scheduled)\n{\n    auto mem_storage = std::make_shared<bzn::mem_storage>();\n    auto mock_io_context = std::make_shared<bzn::asio::mock_io_context_base>();\n    auto mock_crud = std::make_shared<bzn::mock_crud_base>();\n    auto mock_monitor = std::make_shared<bzn::mock_monitor>();\n\n    bzn::database_pbft_service dps(mock_io_context, mem_storage, mock_crud, mock_monitor, TEST_UUID);\n\n    database_msg msg;\n    msg.mutable_header()->set_db_uuid(TEST_UUID);\n    msg.mutable_header()->set_nonce(uint64_t(123));\n    msg.mutable_create()->set_key(\"key2\");\n    msg.mutable_create()->set_value(\"value2\");\n\n    auto operation2 = std::make_shared<bzn::pbft_memory_operation>(0, 2, \"somehasha\");\n    bzn_envelope env;\n    env.set_database_msg(msg.SerializeAsString());\n    operation2->record_request(env);\n\n    dps.apply_operation(operation2);\n\n    ASSERT_EQ(uint64_t(0), dps.applied_requests_count());\n\n    msg.mutable_header()->set_nonce(uint64_t(321));\n    msg.mutable_create()->set_key(\"key3\");\n    msg.mutable_create()->set_value(\"value3\");\n\n    auto mock_session = std::make_shared<bzn::mock_session_base>();\n    EXPECT_CALL(*mock_session, is_open()).WillRepeatedly(Return(true));\n    auto operation3 = std::make_shared<bzn::pbft_memory_operation>(0, 3, \"somehashb\");\n    env.set_database_msg(msg.SerializeAsString());\n    operation3->record_request(env);\n    operation3->set_session(mock_session);\n\n    dps.apply_operation(operation3);\n\n    ASSERT_EQ(uint64_t(0), dps.applied_requests_count());\n\n    msg.mutable_header()->set_nonce(uint64_t(321));\n    msg.mutable_create()->set_key(\"key1\");\n    msg.mutable_create()->set_value(\"value1\");\n\n    auto operation1 = std::make_shared<bzn::pbft_memory_operation>(0, 1, \"somehashc\");\n    env.set_database_msg(msg.SerializeAsString());\n    operation1->record_request(env);\n    auto session2 = std::make_shared<bzn::mock_session_base>();\n    EXPECT_CALL(*session2, is_open()).WillRepeatedly(Return(true));\n    operation1->set_session(std::move(session2));\n\n    EXPECT_CALL(*mock_io_context, post(_)).Times(3);\n\n    // test crud calls are in the correct order...\n    {\n        InSequence dummy;\n\n        EXPECT_CALL(*mock_crud, handle_request(_, _, _)).WillOnce(Invoke(\n            [](const bzn::caller_id_t& /*caller_id*/, const database_msg& request, const std::shared_ptr<bzn::session_base> /*session*/)\n            {\n               EXPECT_EQ(request.msg_case(), database_msg::kCreate);\n               EXPECT_EQ(request.create().key(), \"key1\");\n               EXPECT_EQ(request.create().value(), \"value1\");\n               EXPECT_EQ(request.header().request_hash(), \"somehashc\");\n            }));\n\n        EXPECT_CALL(*mock_crud, handle_request(_, _, _)).WillOnce(Invoke(\n            [](const bzn::caller_id_t& /*caller_id*/, const database_msg& request, const std::shared_ptr<bzn::session_base> /*session*/)\n            {\n                EXPECT_EQ(request.msg_case(), database_msg::kCreate);\n                EXPECT_EQ(request.create().key(), \"key2\");\n                EXPECT_EQ(request.create().value(), \"value2\");\n                EXPECT_EQ(request.header().request_hash(), \"somehasha\");\n            }));\n\n        EXPECT_CALL(*mock_crud, handle_request(_, _, _)).WillOnce(Invoke(\n            [](const bzn::caller_id_t& /*caller_id*/, const database_msg& request, const std::shared_ptr<bzn::session_base> /*session*/)\n            {\n                EXPECT_EQ(request.msg_case(), database_msg::kCreate);\n                EXPECT_EQ(request.create().key(), \"key3\");\n                EXPECT_EQ(request.create().value(), \"value3\");\n                EXPECT_EQ(request.header().request_hash(), \"somehashb\");\n            }));\n    }\n\n    EXPECT_CALL(*mock_monitor, finish_timer(bzn::statistic::request_latency, _)).Times(3);\n\n    dps.apply_operation(operation1);\n\n    ASSERT_EQ(uint64_t(3), dps.applied_requests_count());\n}\n\nnamespace test\n{\n    void do_operation(uint64_t seq, bzn::database_pbft_service &dps)\n    {\n        database_msg msg;\n        msg.mutable_header()->set_db_uuid(TEST_UUID);\n        msg.mutable_header()->set_nonce(uint64_t(seq));\n        msg.mutable_create()->set_key(\"key\" + std::to_string(seq));\n        msg.mutable_create()->set_value(\"value\" + std::to_string(seq));\n\n        auto operation = std::make_shared<bzn::pbft_memory_operation>(0, seq, \"somehash\" + std::to_string(seq));\n        bzn_envelope env;\n        env.set_database_msg(msg.SerializeAsString());\n        operation->record_request(env);\n        dps.apply_operation(operation);\n    }\n\n    uint64_t database_msg_seq(const database_msg& msg)\n    {\n        return msg.header().nonce();\n    }\n}\n\nTEST(database_pbft_service, test_that_set_state_catches_up_backlogged_operations)\n{\n    auto mem_storage = std::make_shared<bzn::mem_storage>();\n    auto mock_io_context = std::make_shared<bzn::asio::mock_io_context_base>();\n    auto mock_crud = std::make_shared<bzn::mock_crud_base>();\n\n    bzn::database_pbft_service dps(mock_io_context, mem_storage, mock_crud, std::make_shared<NiceMock<bzn::mock_monitor>>(), TEST_UUID);\n\n    test::do_operation(99, dps);\n    test::do_operation(100, dps);\n    test::do_operation(101, dps);\n    test::do_operation(102, dps);\n    ASSERT_EQ(uint64_t(0), dps.applied_requests_count());\n\n    // only the last two operations should be applied after we set the state @ 100\n    EXPECT_CALL(*mock_crud, handle_request(_, ResultOf(test::database_msg_seq, 101), _))\n        .Times(Exactly(1));\n    EXPECT_CALL(*mock_crud, handle_request(_, ResultOf(test::database_msg_seq, 102), _))\n        .Times(Exactly(1));\n    EXPECT_CALL(*mock_io_context, post(_))\n        .Times(Exactly(2));\n\n    // push state for checkpoint at sequence 100\n    EXPECT_CALL(*mock_crud, load_state(_))\n        .Times(Exactly(1))\n        .WillOnce(Invoke([](auto &) {return true;}));\n    dps.set_service_state(100, \"state_at_sequence_100\");\n\n    // operations applied should be caught up now\n    ASSERT_EQ(uint64_t(102), dps.applied_requests_count());\n}\n"
  },
  {
    "path": "pbft/test/pbft_audit_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n\n#include <pbft/test/pbft_test_common.hpp>\n\nnamespace bzn::test\n{\n    TEST_F(pbft_test, test_local_commit_sends_audit_messages)\n    {\n        EXPECT_CALL(*mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(is_audit, Eq(false))))\n                .Times(AnyNumber());\n        EXPECT_CALL(*mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(is_audit, Eq(true))))\n                .Times(Exactly(TEST_PEER_LIST.size()));\n\n        this->build_pbft();\n        this->pbft->set_audit_enabled(true);\n\n        pbft_msg preprepare = pbft_msg(this->preprepare_msg);\n        preprepare.set_sequence(1);\n        this->pbft->handle_message(preprepare, this->default_original_msg);\n\n        for (const auto& peer : TEST_PEER_LIST)\n        {\n            pbft_msg prepare = pbft_msg(preprepare);\n            bzn_envelope prepare_wrap;\n            pbft_msg commit = pbft_msg(preprepare);\n            bzn_envelope commit_wrap;\n            prepare.set_type(PBFT_MSG_PREPARE);\n            prepare_wrap.set_sender(peer.uuid);\n            commit.set_type(PBFT_MSG_COMMIT);\n            commit_wrap.set_sender(peer.uuid);\n            this->pbft->handle_message(prepare, prepare_wrap);\n            this->pbft->handle_message(commit, commit_wrap);\n        }\n    }\n\n    TEST_F(pbft_test, primary_sends_primary_status)\n    {\n        EXPECT_CALL(*mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(is_audit, Eq(true))))\n                .Times(Exactly(TEST_PEER_LIST.size()));\n\n        this->build_pbft();\n        this->pbft->set_audit_enabled(true);\n        ASSERT_TRUE(this->pbft->is_primary());\n\n        this->audit_heartbeat_timer_callback(boost::system::error_code());\n    }\n\n    TEST_F(pbft_test, nonprimary_does_not_send_primary_status)\n    {\n        EXPECT_CALL(*mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(is_audit, Eq(true))))\n                .Times(Exactly(0));\n\n        this->uuid = SECOND_NODE_UUID;\n        this->build_pbft();\n        this->pbft->set_audit_enabled(true);\n        ASSERT_FALSE(this->pbft->is_primary());\n\n        this->audit_heartbeat_timer_callback(boost::system::error_code());\n    }\n}\n\n"
  },
  {
    "path": "pbft/test/pbft_catchup_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n\n#include <pbft/test/pbft_test_common.hpp>\n#include <pbft/test/pbft_proto_test.hpp>\n#include <utils/make_endpoint.hpp>\n\nusing namespace ::testing;\n\nnamespace bzn\n{\n    namespace test\n    {\n        pbft_membership_msg\n        extract_pbft_membership_msg(const std::string& msg)\n        {\n            bzn_envelope outer;\n            outer.ParseFromString(msg);\n            pbft_membership_msg result;\n            result.ParseFromString(outer.pbft_membership());\n            return result;\n        }\n\n        bool\n        is_get_state(std::shared_ptr<bzn_envelope> wrapped_msg)\n        {\n            pbft_membership_msg msg;\n            msg.ParseFromString(wrapped_msg->pbft_membership());\n\n            return msg.type() == PBFT_MMSG_GET_STATE && msg.sequence() > 0\n                && !msg.state_hash().empty();\n        }\n\n        bool\n        is_set_state(std::shared_ptr<std::string> wrapped_msg)\n        {\n            pbft_membership_msg msg = extract_pbft_membership_msg(*wrapped_msg);\n\n            return msg.type() == PBFT_MMSG_SET_STATE && msg.sequence() > 0 && !(extract_sender(*wrapped_msg).empty())\n                   && msg.state_hash() != \"\";\n        }\n    }\n\n    using namespace test;\n\n    class pbft_catchup_test : public pbft_proto_test\n    {\n    public:\n\n        void send_get_state_request(uint64_t sequence)\n        {\n            pbft_membership_msg msg;\n            msg.set_type(PBFT_MMSG_GET_STATE);\n            msg.set_sequence(sequence);\n            msg.set_state_hash(std::to_string(sequence));\n            auto wmsg = wrap_pbft_membership_msg(msg, this->pbft->get_uuid());\n\n            this->membership_handler(wmsg, this->mock_session);\n        }\n\n        bzn_envelope\n        build_viewchange_msg(const uuid_t& uuid, uint64_t view, uint64_t sequence)\n        {\n            pbft_msg viewchange;\n            viewchange.set_type(PBFT_MSG_VIEWCHANGE);\n            viewchange.set_view(view);\n            viewchange.set_sequence(sequence);\n\n            for (auto& p : TEST_PEER_LIST)\n            {\n                checkpoint_msg cp = this->build_checkpoint_msg(sequence);\n                bzn_envelope msg;\n                msg.set_checkpoint_msg(cp.SerializeAsString());\n                msg.set_sender(p.uuid);\n                *(viewchange.add_checkpoint_messages()) = msg;\n            }\n\n            return wrap_pbft_msg(viewchange, uuid);\n        }\n\n        bzn_envelope\n        build_newview_msg(uint64_t view, uint64_t sequence)\n        {\n            pbft_msg newview;\n            newview.set_type(PBFT_MSG_NEWVIEW);\n            newview.set_view(view);\n            newview.set_sequence(sequence);\n\n            for (auto& p : TEST_PEER_LIST)\n            {\n                *(newview.add_viewchange_messages()) = build_viewchange_msg(p.uuid, view, sequence);\n            }\n\n            return wrap_pbft_msg(newview, this->uuid);\n        }\n    };\n\n    TEST_F(pbft_catchup_test, node_requests_state_after_unknown_checkpoint)\n    {\n        this->uuid = SECOND_NODE_UUID;\n        this->build_pbft();\n\n        // node shouldn't be sending any checkpoint messages right now\n        EXPECT_CALL(*mock_node, send_maybe_signed_message(A<const bzn::uuid_t&>(), ResultOf(is_checkpoint, Eq(true))))\n            .Times((Exactly(0)));\n\n        auto nodes = TEST_PEER_LIST.begin();\n        size_t req_nodes = this->faulty_nodes_bound();\n        for (size_t i = 0; i < req_nodes; i++)\n        {\n            bzn::peer_address_t node(*nodes++);\n            send_checkpoint(node, 100);\n        }\n\n        // one more checkpoint message and the node should request state from a random node\n        auto primary = this->pbft->get_current_primary().value();\n        EXPECT_CALL(*mock_node, send_maybe_signed_message(A<const bzn::uuid_t&>(), ResultOf(is_get_state, Eq(true))))\n            .Times((Exactly(1)));\n\n        bzn::peer_address_t node(*nodes++);\n        send_checkpoint(node, 100);\n        this->cp_manager_timer_callbacks.at(0)(boost::system::error_code{});\n    }\n\n    TEST_F(pbft_catchup_test, node_doesnt_request_state_after_known_checkpoint)\n    {\n        this->uuid = SECOND_NODE_UUID;\n        this->build_pbft();\n\n        prepare_for_checkpoint(100);\n        for (size_t i = 0; i < 100; i++)\n        {\n            run_transaction_through_backup();\n        }\n\n        // since the node has this checkpoint it should NOT request state for it\n        EXPECT_CALL(*mock_node, send_maybe_signed_message(A<const bzn::uuid_t&>(), ResultOf(is_get_state, Eq(true))))\n            .Times((Exactly(0)));\n        stabilize_checkpoint(100);\n        EXPECT_EQ(this->cp_manager_timer_callback_count, 0u);\n    }\n\n    TEST_F(pbft_catchup_test, primary_provides_state)\n    {\n        this->build_pbft();\n\n        for (size_t i = 0; i < 99; i++)\n        {\n            run_transaction_through_primary();\n        }\n        prepare_for_checkpoint(100);\n        run_transaction_through_primary();\n        stabilize_checkpoint(100);\n\n        EXPECT_CALL(*this->mock_service, get_service_state(_)).Times(Exactly(1))\n            .WillOnce(Invoke([](auto &) {return std::make_shared<std::string>(\"dummy_state\");}));\n        EXPECT_CALL(*mock_session, send_message(ResultOf(is_set_state, Eq(true))))\n            .Times((Exactly(1)));\n        send_get_state_request(100);\n    }\n\n    TEST_F(pbft_catchup_test, node_adopts_requested_checkpoint)\n    {\n        this->uuid = SECOND_NODE_UUID;\n        this->build_pbft();\n\n        // get the node to request state\n        auto primary = this->pbft->get_current_primary().value();\n        EXPECT_CALL(*mock_node, send_maybe_signed_message(A<const bzn::uuid_t&>(), ResultOf(is_get_state, Eq(true))))\n            .Times((Exactly(1)));\n\n        auto nodes = TEST_PEER_LIST.begin();\n        size_t req_nodes = 2 * this->faulty_nodes_bound() + 1;\n        for (size_t i = 0; i < req_nodes; i++)\n        {\n            bzn::peer_address_t node(*nodes++);\n            send_checkpoint(node, 100);\n        }\n        this->cp_manager_timer_callbacks.at(0)(boost::system::error_code{});\n\n        // send the node the checkpoint \"data\"\n        const uint64_t new_view = 3;\n        pbft_membership_msg reply;\n        reply.set_type(PBFT_MMSG_SET_STATE);\n        reply.set_sequence(100);\n        reply.set_state_hash(\"100\");\n        reply.set_state_data(\"state_100\");\n        reply.set_allocated_newview_msg(new bzn_envelope(build_newview_msg(new_view, 100)));\n        auto wmsg = wrap_pbft_membership_msg(reply, \"see_node_adopts_requested_checkpoint\");\n        this->membership_handler(wmsg, nullptr);\n\n        EXPECT_EQ(this->pbft->latest_stable_checkpoint(), checkpoint_t(100, \"100\"));\n        EXPECT_EQ(this->pbft->get_view(), new_view);\n    }\n\n    TEST_F(pbft_catchup_test, node_doesnt_adopt_wrong_checkpoint)\n    {\n        this->uuid = SECOND_NODE_UUID;\n        this->build_pbft();\n\n        // get the node to request state\n        auto primary = this->pbft->get_current_primary().value();\n        EXPECT_CALL(*mock_node, send_maybe_signed_message(A<const bzn::uuid_t&>(), ResultOf(is_get_state, Eq(true))))\n            .Times((Exactly(1)));\n\n        auto nodes = TEST_PEER_LIST.begin();\n        size_t req_nodes = 2 * this->faulty_nodes_bound() + 1;\n        for (size_t i = 0; i < req_nodes; i++)\n        {\n            bzn::peer_address_t node(*nodes++);\n            send_checkpoint(node, 100);\n        }\n        this->cp_manager_timer_callbacks.at(0)(boost::system::error_code{});\n\n        // send the node the checkpoint \"data\"\n        pbft_membership_msg reply;\n        reply.set_type(PBFT_MMSG_SET_STATE);\n        reply.set_sequence(200);\n        reply.set_state_hash(\"200\");\n        reply.set_state_data(\"state_200\");\n        auto wmsg = wrap_pbft_membership_msg(reply, \"see_node_doesnt_adopt_wrong_checkpoint\");\n        this->membership_handler(wmsg, nullptr);\n\n        EXPECT_NE(this->pbft->latest_stable_checkpoint(), checkpoint_t(200, \"200\"));\n    }\n}\n"
  },
  {
    "path": "pbft/test/pbft_checkpoint_tests.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n\n#include <mocks/smart_mock_node.hpp>\n#include <mocks/smart_mock_io.hpp>\n#include <mocks/smart_mock_peers_beacon.hpp>\n#include <boost/range/irange.hpp>\n#include <pbft/operations/pbft_memory_operation.hpp>\n#include <storage/mem_storage.hpp>\n#include <pbft/pbft_checkpoint_manager.hpp>\n#include <pbft/test/pbft_test_common.hpp>\n#include <utils/make_endpoint.hpp>\n\nusing namespace ::testing;\n\nnamespace bzn::test\n{\n    class pbft_checkpoint_test : public Test\n    {\n    public:\n        std::shared_ptr<bzn::asio::smart_mock_io> mock_io = std::make_shared<bzn::asio::smart_mock_io>();\n        std::shared_ptr<bzn::mem_storage> storage = std::make_shared<bzn::mem_storage>();\n        std::shared_ptr<bzn::smart_mock_node> node = std::make_shared<bzn::smart_mock_node>();\n        std::shared_ptr<bzn::pbft_checkpoint_manager> cp_manager = std::make_shared<bzn::pbft_checkpoint_manager>(mock_io, storage, static_peers_beacon_for(TEST_PEER_LIST), node);\n\n        checkpoint_t cp{100, \"100\"};\n        checkpoint_t cp2{200, \"200\"};\n\n        void send_checkpoint_messages(const checkpoint_t& cp, size_t count = INT_MAX)\n        {\n            checkpoint_msg cp_msg;\n            cp_msg.set_state_hash(cp.second);\n            cp_msg.set_sequence(cp.first);\n            for (const auto& peer : TEST_PEER_LIST)\n            {\n                if (count-- <= 0)\n                {\n                    break;\n                }\n\n                bzn_envelope env;\n                env.set_checkpoint_msg(cp_msg.SerializeAsString());\n                env.set_sender(peer.uuid);\n                this->cp_manager->handle_checkpoint_message(env);\n            }\n        }\n\n    };\n\n    TEST_F(pbft_checkpoint_test, test_checkpoint_messages_sent_on_execute)\n    {\n        for (const auto& peer : TEST_PEER_LIST)\n        {\n            EXPECT_CALL(*node, send_maybe_signed_message(*make_endpoint(peer), ResultOf(is_checkpoint, Eq(true))));\n        }\n\n        this->cp_manager->local_checkpoint_reached(this->cp);\n    }\n\n    TEST_F(pbft_checkpoint_test, no_checkpoint_on_message_before_local_state)\n    {\n        this->send_checkpoint_messages(this->cp);\n\n        EXPECT_EQ(0u, this->cp_manager->get_latest_local_checkpoint().first);\n        EXPECT_EQ(100u, this->cp_manager->get_latest_stable_checkpoint().first);\n    }\n\n    TEST_F(pbft_checkpoint_test, unstable_checkpoint_on_local_state_before_message)\n    {\n        for (const auto& peer : TEST_PEER_LIST)\n        {\n            EXPECT_CALL(*node, send_maybe_signed_message(*make_endpoint(peer), ResultOf(is_checkpoint, Eq(true))));\n        }\n\n        this->cp_manager->local_checkpoint_reached(this->cp);\n        EXPECT_EQ(100u, this->cp_manager->get_latest_local_checkpoint().first);\n    }\n\n    TEST_F(pbft_checkpoint_test, stable_checkpoint_on_message_after_local_state)\n    {\n        this->cp_manager->local_checkpoint_reached(this->cp);\n        this->send_checkpoint_messages(this->cp);\n\n        EXPECT_EQ(this->cp_manager->get_latest_stable_checkpoint(), this->cp);\n        EXPECT_EQ(this->cp_manager->get_latest_local_checkpoint(), this->cp);\n    }\n\n    TEST_F(pbft_checkpoint_test, stable_checkpoint_on_local_state_after_message)\n    {\n        this->send_checkpoint_messages(this->cp);\n        this->cp_manager->local_checkpoint_reached(this->cp);\n\n        EXPECT_EQ(this->cp_manager->get_latest_stable_checkpoint(), this->cp);\n        EXPECT_EQ(this->cp_manager->get_latest_local_checkpoint(), this->cp);\n    }\n\n    TEST_F(pbft_checkpoint_test, unstable_checkpoint_does_not_discard_stable_checkpoint)\n    {\n        this->send_checkpoint_messages(this->cp);\n        this->send_checkpoint_messages(this->cp2, 1); // 4 node swarm; this will not be enough\n        this->cp_manager->local_checkpoint_reached(this->cp);\n        this->cp_manager->local_checkpoint_reached(this->cp2);\n        EXPECT_EQ(this->cp_manager->get_latest_stable_checkpoint(), this->cp);\n        EXPECT_EQ(this->cp_manager->get_latest_local_checkpoint(), this->cp2);\n        EXPECT_EQ(this->cp_manager->partial_checkpoint_proofs_count(), 1u);\n    }\n\n    TEST_F(pbft_checkpoint_test, stable_checkpoint_discards_old_stable_checkpoint)\n    {\n        this->send_checkpoint_messages(this->cp);\n        this->send_checkpoint_messages(this->cp2);\n        EXPECT_EQ(this->cp_manager->get_latest_stable_checkpoint(), this->cp2);\n        EXPECT_EQ(this->cp_manager->partial_checkpoint_proofs_count(), 0u);\n    }\n\n    TEST_F(pbft_checkpoint_test, initial_checkpoint_matches)\n    {\n        EXPECT_EQ(this->cp_manager->get_latest_stable_checkpoint(), checkpoint_t(0, INITIAL_CHECKPOINT_HASH));\n        EXPECT_EQ(this->cp_manager->get_latest_local_checkpoint(), checkpoint_t(0, INITIAL_CHECKPOINT_HASH));\n    }\n}\n"
  },
  {
    "path": "pbft/test/pbft_newview_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <mocks/mock_boost_asio_beast.hpp>\n#include <mocks/mock_node_base.hpp>\n#include <mocks/mock_session_base.hpp>\n#include <mocks/mock_crypto_base.hpp>\n#include <pbft/test/pbft_proto_test.hpp>\n\nnamespace bzn\n{\n\n    class pbft_newview_test : public pbft_proto_test\n    {\n    public:\n\n        std::shared_ptr<mock_crypto_base>\n        build_pft_with_mock_crypto()\n        {\n            std::shared_ptr<mock_crypto_base> mockcrypto = std::make_shared<mock_crypto_base>();\n            this->crypto = mockcrypto;\n            this->build_pbft();\n            return mockcrypto;\n        }\n\n        void\n        generate_checkpoint_at_sequence_100(uint64_t& current_sequence)\n        {\n            auto mockcrypto = this->build_pft_with_mock_crypto();\n\n            EXPECT_CALL(*mockcrypto, hash(An<const bzn_envelope&>()))\n                    .WillRepeatedly(Invoke([&](const bzn_envelope& envelope)\n                                           {\n                                               return envelope.sender() + \"_\" + std::to_string(current_sequence) + \"_\" + std::to_string(envelope.timestamp());\n                                           }));\n\n            EXPECT_CALL(*mockcrypto, sign(_)).WillRepeatedly(Return(true));\n            EXPECT_CALL(*mockcrypto, verify(_)).WillRepeatedly(Return(true));\n\n            for (current_sequence=1; current_sequence < 100; ++current_sequence)\n            {\n                run_transaction_through_primary();\n            }\n            prepare_for_checkpoint(current_sequence);\n            run_transaction_through_primary();\n            this->stabilize_checkpoint(current_sequence);\n        }\n\n        void\n        run_transaction_through_primary_times(const size_t repeat, uint64_t& current_sequence)\n        {\n            for (size_t i{0}; i<repeat; ++i)\n            {\n                current_sequence++;\n                run_transaction_through_primary(false);\n            }\n        }\n\n        size_t\n        max_faulty_replicas_allowed() { return TEST_PEER_LIST.size() / 3; }\n\n\n    };\n\n    TEST_F(pbft_newview_test, make_newview)\n    {\n        uint64_t current_sequence{0};\n        this->generate_checkpoint_at_sequence_100(current_sequence);\n\n        this->run_transaction_through_primary_times(2, current_sequence);\n\n        bzn_envelope viewchange_envelope;\n        EXPECT_CALL(*mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(test::is_viewchange, Eq(true))))\n                .WillRepeatedly(Invoke([&](const auto & /*endpoint*/, const auto& viewchange_env) {viewchange_envelope = *viewchange_env;}));\n        this->pbft->handle_failure();\n\n        pbft_msg viewchange;\n\n        viewchange.ParseFromString(viewchange_envelope.pbft());\n\n        uint64_t                            new_view_index{viewchange.view()};\n        std::map<uuid_t,bzn_envelope>       viewchange_envelopes_from_senders;\n        std::map<uint64_t, bzn_envelope>    pre_prepare_messages;\n\n\n        // we can generate valid newview now\n\n        pbft_msg newview{this->pbft->make_newview(new_view_index, viewchange_envelopes_from_senders, pre_prepare_messages)};\n\n        EXPECT_EQ(PBFT_MSG_NEWVIEW, newview.type());\n        EXPECT_EQ(new_view_index, newview.view());\n        EXPECT_EQ(this->pbft->next_issued_sequence_number.value(), current_sequence + 1);\n    }\n\n    TEST_F(pbft_newview_test, test_get_primary)\n    {\n        build_pbft();\n\n        // the pbft sut must be the current view's primay\n        EXPECT_EQ(this->uuid, this->pbft->get_current_primary().value().uuid);\n\n        EXPECT_NE(this->uuid, this->pbft->predict_primary(this->pbft->view.value() + 1).value().uuid);\n\n        // given a view, get_primary must provide the address of a primary\n\n        // TODO: this is a pretty sketchy test.\n        for (size_t view{0}; view < 100; ++view)\n        {\n            const bzn::uuid_t uuid = this->pbft->predict_primary(view).value().uuid;\n            const bzn::uuid_t accepted_uuid = this->pbft->peers()->ordered()->at(view % this->pbft->peers()->ordered()->size()).uuid;\n            EXPECT_EQ(uuid, accepted_uuid);\n        }\n    }\n}\n"
  },
  {
    "path": "pbft/test/pbft_peer_change_test.cpp",
    "content": "// Copyright (C) 2019 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <pbft/test/pbft_test_common.hpp>\n\n/*\n * the goal here is to check that pbft remains functional and does the right thing even when the peers list\n * can change at any moment, by putting it through a series of tests and each time changing the peers list at a different moment\n */\n\n\nnamespace\n{\n    const bzn::peers_list_t PEER_LIST_A{{  \"127.0.0.1\", 8080, \"name0\", \"uuid0\"}\n                                           , {\"127.0.0.1\", 8081, \"name1\", \"uuid1\"}\n                                           , {\"127.0.0.1\", 8082, \"name2\", \"uuid2\"}\n                                           , {\"127.0.0.1\", 8083, \"name3\", \"uuid3\"}};\n\n    const bzn::peers_list_t PEER_LIST_A_PLUS{{  \"127.0.0.1\", 8080, \"name0\", \"uuid0\"}\n                                        , {\"127.0.0.1\", 8081, \"name1\", \"uuid1\"}\n                                        , {\"127.0.0.1\", 8082, \"name2\", \"uuid2\"}\n                                        , {\"127.0.0.1\", 8083, \"name3\", \"uuid3\"}\n                                        , {\"127.0.0.1\", 8084, \"name4\", \"uuid4\"}};\n\n    const bzn::peers_list_t PEER_LIST_B{{  \"127.0.0.1\", 8080, \"name0\", \"uuid0\"}\n                                        , {\"127.0.0.1\", 8081, \"name1\", \"uuid1\"}\n                                        , {\"127.0.0.1\", 8082, \"name2\", \"uuid2\"}\n                                        , {\"127.0.0.1\", 8085, \"name5\", \"uuid5\"}};\n\n    using peer_switch_t = std::pair<bzn::peers_list_t, bzn::peers_list_t>;\n\n    std::map<std::string, peer_switch_t> peer_cases{\n        std::make_pair(\"add_peer\", std::make_pair(PEER_LIST_A, PEER_LIST_A_PLUS)),\n        std::make_pair(\"remove_peer\", std::make_pair(PEER_LIST_A_PLUS, PEER_LIST_A)),\n        std::make_pair(\"replace_peer\", std::make_pair(PEER_LIST_A, PEER_LIST_B))\n    };\n\n    /*\n     * Which switch point are we using, how many are there in total, and what peers lists are we switching between\n     *\n     * The second param is passed so that the common test code can verify that the callsite has the correct (potentially updated)\n     * total number of switch points\n     *\n     * The third parameter is passed as a string that's a key in the global map instead of passing the lists\n     * directly in order to avoid filling the test names with junk\n     */\n    using test_param_t = std::tuple<unsigned int, unsigned int, std::string>;\n}\n\nusing namespace ::testing;\n\nclass changeover_test : public bzn::test::pbft_test, public testing::WithParamInterface<test_param_t>\n{\n\npublic:\n\n    changeover_test()\n        : current_peers_list(std::make_shared<bzn::peers_list_t>(this->before_list()))\n    {\n        this->set_up_beacon();\n    }\n\n    ~changeover_test()\n    {\n        EXPECT_EQ(this->potential_switch_points_hit, this->max_change_point());\n        EXPECT_LT(this->this_change_point(), this->potential_switch_points_hit);\n    }\n\nprotected:\n    void switch_here()\n    {\n        if (this->potential_switch_points_hit == this->this_change_point())\n        {\n            this->do_switch();\n        }\n\n        this->potential_switch_points_hit++;\n    }\n\n    unsigned int this_change_point()\n    {\n        return std::get<0>(GetParam());\n    }\n\n    unsigned int max_change_point()\n    {\n        return std::get<1>(GetParam());\n    }\n\n    bzn::peers_list_t before_list()\n    {\n        auto pair = peer_cases.at(std::get<2>(GetParam()));\n        return pair.first;\n    }\n\n    bzn::peers_list_t after_list()\n    {\n        auto pair = peer_cases.at(std::get<2>(GetParam()));\n        return pair.second;\n    }\n\n    std::shared_ptr<bzn::peers_list_t> current_peers_list;\n\nprivate:\n    void do_switch()\n    {\n        this->current_peers_list = std::make_shared<bzn::peers_list_t>(this->after_list());\n    }\n\n    void set_up_beacon()\n    {\n        auto changing_beacon = std::make_shared<bzn::mock_peers_beacon_base>();\n\n        EXPECT_CALL(*changing_beacon, start()).Times(AtMost(1));\n\n        EXPECT_CALL(*changing_beacon, current()).WillRepeatedly(Invoke(\n                [&]()\n                {\n                    return this->current_peers_list;\n                }));\n\n        EXPECT_CALL(*changing_beacon, ordered()).WillRepeatedly(Invoke(\n                [&]()\n                {\n                    auto ordered = std::make_shared<bzn::ordered_peers_list_t>();\n                    std::for_each(this->current_peers_list->begin(), this->current_peers_list->end(),\n                            [&](const auto& peer)\n                            {\n                                ordered->push_back(peer);\n                            });\n\n                    std::sort(ordered->begin(), ordered->end(),\n                            [](const auto& peer1, const auto& peer2)\n                            {\n                                return peer1.uuid.compare(peer2.uuid) < 0;\n                            });\n\n                    return ordered;\n                }));\n\n        EXPECT_CALL(*changing_beacon, refresh(_)).Times(AnyNumber());\n        this->beacon = changing_beacon;\n    }\n\n    unsigned int potential_switch_points_hit = 0;\n};\n\nauto test_namer = [](const ::testing::TestParamInfo<test_param_t>& info)\n{\n    std::stringstream res;\n    res << std::get<0>(info.param) << \"_out_of_\" << std::get<1>(info.param) << \"_\" << std::get<2>(info.param);\n    return res.str();\n};\n\n//gtest is going to want to apply our parameter set over an entire test suite, and we would rather not have that because\n//the number of possible changeover points varies per-test. Therefore, we define a test suite per test.\n\nclass changeover_test_operations : public changeover_test\n{};\n\nTEST_P(changeover_test_operations, perform_pbft_operation)\n{\n    EXPECT_CALL(*(this->mock_io_context), post(_)).Times(Exactly(1));\n\n    this->build_pbft();\n\n    switch_here();\n\n    pbft_msg preprepare = pbft_msg(this->preprepare_msg);\n    preprepare.set_sequence(1);\n    this->pbft->handle_message(preprepare, default_original_msg);\n\n    switch_here();\n\n    for (const auto& peer : *(this->current_peers_list))\n    {\n        pbft_msg prepare = pbft_msg(preprepare);\n        prepare.set_type(PBFT_MSG_PREPARE);\n        this->pbft->handle_message(prepare, bzn::test::from(peer.uuid));\n    }\n\n    switch_here();\n\n    for (const auto& peer : *(this->current_peers_list))\n    {\n        pbft_msg commit = pbft_msg(preprepare);\n        commit.set_type(PBFT_MSG_COMMIT);\n        this->pbft->handle_message(commit, bzn::test::from(peer.uuid));\n    }\n\n}\n\nINSTANTIATE_TEST_CASE_P(changeover_test_set, changeover_test_operations,\n        testing::Combine(\n                Range(0u, 3u),\n                Values(3u),\n                Values(\"add_peer\", \"remove_peer\", \"replace_peer\")\n        ), );\n\nclass changeover_test_checkpoints : public changeover_test\n{};\n\nTEST_P(changeover_test_checkpoints, perform_checkpoinnt)\n{\n    std::shared_ptr<bzn::pbft_checkpoint_manager> cp_manager = std::make_shared<bzn::pbft_checkpoint_manager>(this->mock_io_context, storage, this->beacon, this->mock_node);\n    const bzn::hash_t cp_hash = \"a very hashy hash\";\n    const uint64_t cp_seq = 42;\n    const std::pair<uint64_t, bzn::hash_t> cp{cp_seq, cp_hash};\n\n    switch_here();\n\n    cp_manager->local_checkpoint_reached(cp);\n\n    switch_here();\n\n    for (const auto& peer : *(this->current_peers_list))\n    {\n        checkpoint_msg cp_msg;\n        cp_msg.set_state_hash(cp_hash);\n        cp_msg.set_sequence(cp_seq);\n        bzn_envelope env;\n        env.set_checkpoint_msg(cp_msg.SerializeAsString());\n        env.set_sender(peer.uuid);\n        cp_manager->handle_checkpoint_message(env);\n    }\n\n    EXPECT_EQ(cp_manager->get_latest_stable_checkpoint(), cp);\n    EXPECT_EQ(cp_manager->get_latest_local_checkpoint(), cp);\n\n    switch_here();\n\n    EXPECT_EQ(cp_manager->get_latest_stable_checkpoint(), cp);\n    EXPECT_EQ(cp_manager->get_latest_local_checkpoint(), cp);\n}\n\nINSTANTIATE_TEST_CASE_P(changeover_test_set, changeover_test_checkpoints,\n        testing::Combine(\n                Range(0u, 3u),\n                Values(3u),\n                Values(\"add_peer\", \"remove_peer\", \"replace_peer\")\n        ), );\n"
  },
  {
    "path": "pbft/test/pbft_persistent_state_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n\n#include <pbft/test/pbft_test_common.hpp>\n#include <pbft/pbft_persistent_state.hpp>\n#include <storage/mem_storage.hpp>\n#include <storage/rocksdb_storage.hpp>\n\nusing namespace ::testing;\n\nnamespace\n{\n    const bzn::uuid_t NODE_UUID = \"d1e04722-41f0-4c43-a6c0-86a9e62a88e3\";\n}\nnamespace bzn\n{\n    class persistent_state_test : public Test\n    {\n    public:\n        std::shared_ptr<bzn::storage_base> storage = std::make_shared<bzn::mem_storage>();\n    };\n\n    TEST_F(persistent_state_test, test_assignment)\n    {\n        persistent<uint64_t> value(this->storage, uint64_t{}, \"value\");\n        value = 10u;\n\n        persistent<uint64_t> value2(this->storage, uint64_t{}, \"value\");\n        EXPECT_EQ(value2.value(), 10u);\n    }\n\n    TEST_F(persistent_state_test, test_no_storage_generates_exception)\n    {\n        EXPECT_THROW(persistent<uint64_t> value(nullptr, 0, \"value\"), std::runtime_error);\n        persistent<uint64_t> v2;\n        EXPECT_THROW(v2 = 10, std::runtime_error);\n        EXPECT_THROW(v2.destroy(), std::runtime_error);\n    }\n\n    TEST_F(persistent_state_test, no_conversion_generates_exception)\n    {\n        struct test_struct\n        {\n            int a = 0;\n            int b = 0;\n        };\n        EXPECT_THROW(persistent<test_struct> t(this->storage, {}, \"test\"), std::runtime_error);\n    }\n\n    TEST_F(persistent_state_test, uninitialized_map_generates_exception)\n    {\n        std::map<uint64_t, persistent<std::string>> m;\n        EXPECT_THROW(m.insert({1u, {this->storage, \"one\", std::string(\"m\"), static_cast<uint64_t>(1)}}), std::runtime_error);\n    }\n\n    TEST_F(persistent_state_test, test_initialize)\n    {\n        std::map<uint64_t, persistent<std::string>> m;\n        persistent<std::string>::init_kv_container<uint64_t>(this->storage, \"m\", m);\n\n        m.insert({1u, {this->storage, \"one\", std::string(\"m\"), static_cast<uint64_t>(1)}});\n        m.insert({2u, {this->storage, \"two\", std::string(\"m\"), static_cast<uint64_t>(2)}});\n\n        std::map<uint64_t, persistent<std::string>> m2;\n        persistent<std::string>::init_kv_container<uint64_t>(this->storage, \"m\", m2);\n\n        EXPECT_EQ(m, m2);\n    }\n\n    TEST_F(persistent_state_test, test_initialize_nested)\n    {\n        std::map<uint64_t, std::map<uint64_t, persistent<std::string>>> m;\n        persistent<std::string>::init_kv_container2<uint64_t, uint64_t>(this->storage, \"m\", m);\n\n        m[1].insert({3u, {this->storage, \"one\", std::string(\"m\"), static_cast<uint64_t>(3), static_cast<uint64_t>(1)}});\n        m[2].insert({4u, {this->storage, \"two\", std::string(\"m\"), static_cast<uint64_t>(4), static_cast<uint64_t>(2)}});\n\n        std::map<uint64_t, std::map<uint64_t, persistent<std::string>>> m2;\n        persistent<std::string>::init_kv_container2<uint64_t, uint64_t>(this->storage, \"m\", m2);\n\n        EXPECT_EQ(m, m2);\n    }\n\n    TEST_F(persistent_state_test, test_escaping)\n    {\n        std::map<uint64_t, std::map<std::string, persistent<std::string>>> m;\n        persistent<std::string>::init_kv_container2<std::string, uint64_t>(this->storage\n            , std::string{\"m\"} + ESCAPE_1 + \"1\", m);\n\n        // m[1].insert({\"test/one\", {this->storage, \"one\", std::string(\"m/1\"), std::string{\"test/one\"}, static_cast<uint64_t>(1)}});\n        m[1].insert({std::string{\"test\"} + ESCAPE_1 + \"one\", {this->storage, \"one\", std::string{\"m\"} + ESCAPE_1 + \"1\"\n            , std::string{\"test\"} + ESCAPE_1 + \"one\", static_cast<uint64_t>(1)}});\n        m[2].insert({std::string{\"test\"} + ESCAPE_1 + \"two\", {this->storage, \"two\", std::string{\"m\"} + ESCAPE_1 + \"1\"\n            , std::string{\"test\"} + ESCAPE_1 + \"two\", static_cast<uint64_t>(2)}});\n\n        std::map<uint64_t, std::map<std::string, persistent<std::string>>> m2;\n        persistent<std::string>::init_kv_container2<std::string, uint64_t>(this->storage\n            , std::string{\"m\"} + ESCAPE_1 + \"1\", m2);\n\n        EXPECT_EQ(m, m2);\n\n        auto key1 = persistent<std::string>::generate_key(std::string{\"hello\"} + ESCAPE_1, std::string{\"world\"});\n        auto key2 = persistent<std::string>::generate_key(std::string{\"hello\"}, std::string{ESCAPE_1} + \"world\");\n        EXPECT_NE(key1, key2);\n\n        std::string subkey1{ESCAPE_1};\n        std::string subkey2{std::string{ESCAPE_2} + \"x\"};\n        auto key_res = persistent<std::string>::generate_key(subkey1, subkey2);\n        auto extracted = persistent<std::string>::extract_subkeys<std::string\n            , std::string>(key_res.substr(SEPARATOR.size()));\n        EXPECT_EQ(subkey1, std::get<0>(extracted));\n        EXPECT_EQ(subkey2, std::get<1>(extracted));\n    }\n\n    TEST_F(persistent_state_test, test_physical_storage)\n    {\n        if (system(std::string(\"rm -r -f \" + NODE_UUID).c_str())) {}\n\n        {\n            auto phys_storage = std::make_shared<bzn::rocksdb_storage>(\"./\", \"utest\", NODE_UUID);\n            persistent<uint64_t> int_value(phys_storage, 10u, \"int_value\");\n            persistent<std::string> str_value(phys_storage, \"my_value\", \"str_value\");\n\n            std::map<uint64_t, persistent<std::string>> map_value;\n            persistent<std::string>::init_kv_container<uint64_t>(phys_storage, \"map_value\", map_value);\n            map_value[1] = {phys_storage, \"one\", \"map_value\", uint64_t{1u}};\n            map_value[2] = {phys_storage, \"two\", \"map_value\", uint64_t{2u}};\n            map_value[10] = {phys_storage, \"ten\", \"map_value\", uint64_t{10u}};\n        }\n\n        {\n            auto phys_storage = std::make_shared<bzn::rocksdb_storage>(\"./\", \"utest\", NODE_UUID);\n            persistent<uint64_t> int_value(phys_storage, 0, \"int_value\");\n            EXPECT_EQ(int_value.value(), 10u);\n            persistent<std::string> str_value(phys_storage, \"\", \"str_value\");\n            EXPECT_EQ(str_value.value(), \"my_value\");\n\n            std::map<uint64_t, persistent<std::string>> map_value;\n            persistent<std::string>::init_kv_container<uint64_t>(phys_storage, \"map_value\", map_value);\n            EXPECT_EQ(map_value[1].value(), \"one\");\n            EXPECT_EQ(map_value[2].value(), \"two\");\n            EXPECT_EQ(map_value[10].value(), \"ten\");\n\n        }\n\n        if (system(std::string(\"rm -r -f \" + NODE_UUID).c_str())) {}\n    }\n\n    TEST_F(persistent_state_test, test_conversions)\n    {\n        std::string str1{\"This is a test\"};\n        std::string str1_1{persistent<std::string>::to_string(str1)};\n        std::string str1_2{persistent<std::string>::from_string(str1)};\n        EXPECT_EQ(str1, str1_1);\n        EXPECT_EQ(str1, str1_2);\n\n        bzn::log_key_t log_key{1u, 2u};\n        std::string log_key_1{persistent<bzn::log_key_t>::to_string(log_key)};\n        bzn::log_key_t log_key_2{persistent<bzn::log_key_t>::from_string(log_key_1)};\n        EXPECT_EQ(log_key, log_key_2);\n\n        bzn::operation_key_t operation_key{1u, 2u, \"hash\"};\n        std::string operation_key_1{persistent<bzn::operation_key_t>::to_string(operation_key)};\n        bzn::operation_key_t operation_key_2{persistent<bzn::operation_key_t>::from_string(operation_key_1)};\n        EXPECT_EQ(operation_key, operation_key_2);\n\n        bzn::checkpoint_t checkpoint{1u, \"hash\"};\n        std::string checkpoint_1{persistent<bzn::checkpoint_t>::to_string(checkpoint)};\n        bzn::checkpoint_t checkpoint_2{persistent<bzn::checkpoint_t>::from_string(checkpoint_1)};\n        EXPECT_EQ(checkpoint, checkpoint_2);\n\n        bzn_envelope envelope;\n        std::string envelope_1{persistent<bzn_envelope>::to_string(envelope)};\n        bzn_envelope envelope_2{persistent<bzn_envelope>::from_string(envelope_1)};\n        EXPECT_EQ(envelope.SerializeAsString(), envelope_2.SerializeAsString());\n\n        EXPECT_THROW(persistent<log_key_t>::from_string({\"00000abc_0000001\"}), std::runtime_error);\n        EXPECT_THROW(persistent<log_key_t>::from_string({\"00000001_000x001\"}), std::runtime_error);\n        EXPECT_THROW(persistent<operation_key_t>::from_string({\"00000abc_0000001_hash\"}), std::runtime_error);\n        EXPECT_THROW(persistent<operation_key_t>::from_string({\"00000001_000x001_hash\"}), std::runtime_error);\n        EXPECT_THROW(persistent<checkpoint_t>::from_string({\"00000abc_hash\"}), std::runtime_error);\n        EXPECT_THROW(persistent<bzn_envelope>::from_string({\"garbage_string\"}), std::runtime_error);\n    }\n\n    TEST_F(persistent_state_test, test_forked_alias_generates_exception)\n    {\n        persistent<std::string> str{this->storage, \"test\", \"test_key\"};\n        persistent<std::string> str2{this->storage, \"test2\", \"test_key\"};\n        EXPECT_EQ(str2.value(), \"test\");\n        str2 = \"test2\";\n#ifndef NDEBUG\n        EXPECT_THROW(str = \"test\", std::runtime_error);\n#endif\n    }\n}"
  },
  {
    "path": "pbft/test/pbft_proto_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n\n#include <pbft/test/pbft_test_common.hpp>\n#include <pbft/test/pbft_proto_test.hpp>\n\nusing namespace ::testing;\n\nnamespace\n{\n//    uint64_t MAX_REQUEST_SIZE{249 * 1024};\n    uint64_t MAX_REQUEST_SIZE{10 * 1024};\n}\n\nnamespace bzn\n{\n    using namespace test;\n\n    size_t\n    pbft_proto_test::faulty_nodes_bound() const\n    {\n        return this->pbft->max_faulty_nodes();\n    }\n\n    std::shared_ptr<pbft_operation>\n    pbft_proto_test::send_request()\n    {\n        // after request is sent, SUT will send out pre-prepares to all nodes\n        auto operation = std::shared_ptr<pbft_operation>();\n        EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(test::is_preprepare, Eq(true))))\n            .Times(Exactly(TEST_PEER_LIST.size()))\n            .WillRepeatedly(Invoke([&](auto, auto wmsg)\n            {\n                pbft_msg msg;\n                if (msg.ParseFromString(wmsg->pbft()))\n                {\n                    if (operation == nullptr)\n                    {\n                        operation = this->operation_manager->find_or_construct(this->view, msg.sequence(), msg.request_hash());\n\n                        // the SUT needs the pre-prepare it sends to itself in order to execute state machine\n                        this->send_preprepare(operation->get_sequence(), operation->get_request());\n                    }\n                }\n            }));\n\n        bzn_envelope request;\n        database_msg dmsg;\n        dmsg.mutable_create()->set_key(std::string(\"key_\" + std::to_string(++this->index)));\n\n        dmsg.mutable_create()->set_value(std::string(MAX_REQUEST_SIZE, 'a'));\n\n        request.set_database_msg(dmsg.SerializeAsString());\n        request.set_timestamp(this->now());\n        request.set_sender(this->pbft->get_uuid());\n\n        pbft->handle_request(request);\n\n        return operation;\n    }\n\n    // send a preprepare message to SUT\n    void\n    pbft_proto_test::send_preprepare(uint64_t sequence, const bzn_envelope& request)\n    {\n        // after preprepare is sent, SUT will send out prepares to all nodes\n        EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(test::is_prepare, Eq(true))))\n            .Times(Exactly(TEST_PEER_LIST.size()));\n\n        auto peer = *(TEST_PEER_LIST.begin());\n        pbft_msg preprepare;\n\n        preprepare.set_view(this->view);\n        preprepare.set_sequence(sequence);\n        preprepare.set_type(PBFT_MSG_PREPREPARE);\n\n        if (request.payload_case() == bzn_envelope::kPbftInternalRequest)\n        {\n            preprepare.set_allocated_request(new bzn_envelope(request));\n        }\n\n        preprepare.set_request_hash(this->pbft->crypto->hash(request));\n        auto wmsg = wrap_pbft_msg(preprepare, peer.uuid);\n        if (request.payload_case() != bzn_envelope::kPbftInternalRequest)\n        {\n            *wmsg.add_piggybacked_requests() = request;\n        }\n        pbft->handle_message(preprepare, wmsg);\n    }\n\n    // send fake prepares from all nodes to SUT\n    void\n    pbft_proto_test::send_prepares(uint64_t sequence, const bzn::hash_t& request_hash)\n    {\n        // after prepares are sent, SUT will send out commits to all nodes\n        EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(test::is_commit, Eq(true))))\n            .Times(Exactly(TEST_PEER_LIST.size()));\n\n        for (const auto& peer : TEST_PEER_LIST)\n        {\n            pbft_msg prepare;\n\n            prepare.set_view(this->view);\n            prepare.set_sequence(sequence);\n            prepare.set_type(PBFT_MSG_PREPARE);\n            prepare.set_request_hash(request_hash);\n            auto wmsg = wrap_pbft_msg(prepare, peer.uuid);\n            pbft->handle_message(prepare, wmsg);\n        }\n    }\n\n    // send fake commits from all nodes to SUT\n    void\n    pbft_proto_test::send_commits(uint64_t sequence, const bzn::hash_t& request_hash)\n    {\n        // after commits are sent, SUT will post the operation for execution\n        // we want to simulate that it's been executed successfully\n        EXPECT_CALL(*(this->mock_io_context), post(_)).Times(Exactly(1));\n\n        for (const auto& peer : TEST_PEER_LIST)\n        {\n            pbft_msg commit;\n\n            commit.set_view(this->view);\n            commit.set_sequence(sequence);\n            commit.set_type(PBFT_MSG_COMMIT);\n            commit.set_request_hash(request_hash);\n            auto wmsg = wrap_pbft_msg(commit, peer.uuid);\n            pbft->handle_message(commit, wmsg);\n        }\n\n        // tell pbft that this operation has been executed\n        this->service_execute_handler(this->operation_manager->find_or_construct(this->view, sequence, request_hash));\n    }\n\n    void\n    pbft_proto_test::prepare_for_checkpoint(size_t seq)\n    {\n        // pbft needs a hash for this checkpoint\n        EXPECT_CALL(*this->mock_service, service_state_hash(seq)).Times(AnyNumber())\n            .WillRepeatedly(Invoke([&](auto s)\n            {\n                return std::to_string(s);\n            }));\n\n        // after enough commits are sent, SUT will send out checkpoint message to all nodes\n        EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(test::is_checkpoint, Eq(true))))\n            .Times(Exactly(TEST_PEER_LIST.size()));\n    }\n\n    void\n    pbft_proto_test::force_checkpoint(size_t seq)\n    {\n        this->pbft->checkpoint_manager->local_checkpoint_reached(checkpoint_t{seq, \"dummy checkpoint state\"});\n    }\n\n    checkpoint_msg\n    pbft_proto_test::build_checkpoint_msg(uint64_t sequence)\n    {\n        checkpoint_msg cp;\n        cp.set_sequence(sequence);\n        cp.set_state_hash(std::to_string(sequence));\n\n        return cp;\n    }\n\n    void\n    pbft_proto_test::send_checkpoint(bzn::peer_address_t node, uint64_t sequence)\n    {\n        auto msg = build_checkpoint_msg(sequence);\n        bzn_envelope wrapper;\n        wrapper.set_checkpoint_msg(msg.SerializeAsString());\n        wrapper.set_sender(node.uuid);\n        this->pbft->checkpoint_manager->handle_checkpoint_message(wrapper);\n    }\n\n    void\n    pbft_proto_test::stabilize_checkpoint(size_t seq)\n    {\n        for (const auto& peer : TEST_PEER_LIST)\n        {\n            if (peer.uuid == this->uuid)\n            {\n                continue;\n            }\n\n            this->send_checkpoint(peer, seq);\n        }\n    }\n\n    void\n    pbft_proto_test::run_transaction_through_primary(bool commit)\n    {\n        // send request to SUT and handle expected calls\n        auto op = send_request();\n        ASSERT_NE(op, nullptr);\n\n        // send node prepares to SUT\n        send_prepares(op->get_sequence(), op->get_request_hash());\n\n        // send node commits to SUT\n        if (commit)\n        {\n            send_commits(op->get_sequence(), op->get_request_hash());\n        }\n    }\n\n    void\n    pbft_proto_test::run_transaction_through_backup(bool commit)\n    {\n        // create request\n        bzn_envelope request;\n        database_msg dmsg;\n        dmsg.mutable_create()->set_key(std::string(\"key_\" + std::to_string(++this->index)));\n        dmsg.mutable_create()->set_value(std::string(\"value_\" + std::to_string(this->index)));\n        request.set_database_msg(dmsg.SerializeAsString());\n\n        // send pre-prepare to SUT\n        send_preprepare(this->index, request);\n\n        // send prepares to SUT\n        auto request_hash = this->pbft->crypto->hash(request);\n        send_prepares(this->index, request_hash);\n\n        // send commits to SUT\n        if (commit)\n        {\n            send_commits(this->index, request_hash);\n        }\n    }\n\n    TEST_F(pbft_proto_test, test_primary_full_checkpoint)\n    {\n        this->build_pbft();\n\n        for (size_t i = 0; i < 99; i++)\n        {\n            run_transaction_through_primary();\n        }\n        prepare_for_checkpoint(100);\n        run_transaction_through_primary();\n    }\n\n    TEST_F(pbft_proto_test, test_primary_quick_checkpoint)\n    {\n        this->build_pbft();\n\n        for (size_t i = 0; i < 9; i++)\n        {\n            run_transaction_through_primary();\n        }\n        prepare_for_checkpoint(10);\n        run_transaction_through_primary();\n        force_checkpoint(10);\n    }\n\n    TEST_F(pbft_proto_test, test_backup_full_checkpoint)\n    {\n        this->uuid = SECOND_NODE_UUID;\n        this->build_pbft();\n\n        for (size_t i = 0; i < 99; i++)\n        {\n            run_transaction_through_backup();\n        }\n        prepare_for_checkpoint(100);\n        run_transaction_through_backup();\n    }\n\n    TEST_F(pbft_proto_test, test_backup_quick_checkpoint)\n    {\n        this->uuid = SECOND_NODE_UUID;\n        this->build_pbft();\n\n        for (size_t i = 0; i < 9; i++)\n        {\n            run_transaction_through_backup();\n        }\n        prepare_for_checkpoint(10);\n        run_transaction_through_backup();\n        force_checkpoint(10);\n    }\n}\n\n"
  },
  {
    "path": "pbft/test/pbft_proto_test.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n\n#include <pbft/test/pbft_test_common.hpp>\n\nusing namespace ::testing;\n\nnamespace bzn\n{\n    using namespace test;\n\n    class pbft_proto_test : public pbft_test\n    {\n    public:\n        // send a fake request to SUT\n        std::shared_ptr<pbft_operation> send_request();\n\n        // send a preprepare message to SUT\n        void send_preprepare(uint64_t sequence, const bzn_envelope& request);\n\n        // send fake prepares from all nodes to SUT\n        void send_prepares(uint64_t sequence, const bzn::hash_t& request_hash);\n\n        // send fake commits from all nodes to SUT\n        void send_commits(uint64_t sequence, const bzn::hash_t& request_hash);\n\n        // set expectations for upcoming checkpoint\n        void prepare_for_checkpoint(size_t seq);\n\n        // build a checkpoint message\n        checkpoint_msg build_checkpoint_msg(uint64_t sequence);\n\n        // send a checkpoint message on behalf of a node\n        void send_checkpoint(bzn::peer_address_t node, uint64_t sequence);\n\n        // send checkpoints from all nodes\n        void stabilize_checkpoint(size_t seq);\n\n        // get SUT to create a checkpoint at a specific sequence number\n        void force_checkpoint(size_t seq);\n\n        // send a database request through a primary all the way to possibly committing it\n        void run_transaction_through_primary(bool commit = true);\n\n        // send a database request through a backup node all the way to possibly committing it\n        void run_transaction_through_backup(bool commit = true);\n\n        // return the number of nodes that represent \"f\"\n        size_t faulty_nodes_bound() const;\n\n        // current request sequence\n        size_t index = 0;\n\n        // current view\n        uint64_t view = 1;\n\n        // get the current time in milliseconds\n        uint64_t now()\n        { return this->pbft->now(); }\n\n        // send request to pbft\n        void handle_request(const bzn_envelope& msg, const std::shared_ptr<session_base>& session = nullptr)\n        { this->pbft->handle_request(msg, session); }\n    };\n}\n\n"
  },
  {
    "path": "pbft/test/pbft_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n\n\n#include <pbft/test/pbft_test_common.hpp>\n#include <set>\n#include <mocks/mock_session_base.hpp>\n#include <utils/make_endpoint.hpp>\n#include <gtest/gtest.h>\n#include <pbft/operations/pbft_memory_operation.hpp>\n\nnamespace bzn::test\n{\n\n    TEST_F(pbft_test, test_requests_create_operations)\n    {\n        this->build_pbft();\n        ASSERT_TRUE(pbft->is_primary());\n        ASSERT_EQ(0u, this->operation_manager->held_operations_count());\n        pbft->handle_database_message(this->request_msg, this->mock_session);\n        ASSERT_EQ(1u, this->operation_manager->held_operations_count());\n    }\n\n    TEST_F(pbft_test, test_requests_fire_preprepare)\n    {\n        this->build_pbft();\n        EXPECT_CALL(*mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(is_preprepare, Eq(true))))\n                .Times(Exactly(TEST_PEER_LIST.size()));\n\n        pbft->handle_database_message(this->request_msg, this->mock_session);\n    }\n\n    TEST_F(pbft_test, test_forwarded_to_primary_when_not_primary)\n    {\n        EXPECT_CALL(*mock_node, send_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), A<std::shared_ptr<bzn_envelope>>())).Times(1).WillRepeatedly(Invoke(\n                [&](auto ep, auto msg)\n                {\n                    EXPECT_EQ(ep, make_endpoint(this->pbft->get_current_primary().value()));\n                    EXPECT_EQ(msg->payload_case(), bzn_envelope::kDatabaseMsg);\n                }));\n\n        this->uuid = SECOND_NODE_UUID;\n        this->build_pbft();\n        EXPECT_FALSE(pbft->is_primary());\n\n        pbft->handle_database_message(this->request_msg, this->mock_session);\n\n    }\n\n    std::set<uint64_t> seen_sequences;\n\n    void\n    save_sequences(const boost::asio::ip::tcp::endpoint& /*ep*/, std::shared_ptr<bzn_envelope> wrapped_msg)\n    {\n        pbft_msg msg;\n        msg.ParseFromString(wrapped_msg->pbft());\n        seen_sequences.insert(msg.sequence());\n    }\n\n\n    TEST_F(pbft_test, test_different_requests_get_different_sequences)\n    {\n        this->build_pbft();\n        EXPECT_CALL(*mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), _)).WillRepeatedly(Invoke(save_sequences));\n\n        database_msg req, req2;\n        req.mutable_header()->set_nonce(5);\n        req2.mutable_header()->set_nonce(1055);\n\n        seen_sequences = std::set<uint64_t>();\n        pbft->handle_database_message(wrap_request(req), this->mock_session);\n        pbft->handle_database_message(wrap_request(req2), this->mock_session);\n        ASSERT_EQ(seen_sequences.size(), 2u);\n    }\n\n    TEST_F(pbft_test, test_preprepare_triggers_prepare)\n    {\n        this->build_pbft();\n        EXPECT_CALL(*mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(is_prepare, Eq(true))))\n                .Times(Exactly(TEST_PEER_LIST.size()));\n\n        this->pbft->handle_message(this->preprepare_msg, default_original_msg);\n    }\n\n    TEST_F(pbft_test, test_wrong_view_preprepare_rejected)\n    {\n        this->build_pbft();\n        EXPECT_CALL(*mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), _)).Times(Exactly(0));\n\n        pbft_msg preprepare2(this->preprepare_msg);\n        preprepare2.set_view(6);\n\n        this->pbft->handle_message(preprepare2, default_original_msg);\n    }\n\n    TEST_F(pbft_test, test_no_duplicate_prepares_same_sequence_number)\n    {\n        this->build_pbft();\n        EXPECT_CALL(*mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), _)).Times(Exactly(TEST_PEER_LIST.size()));\n\n        pbft_msg preprepare2(this->preprepare_msg);\n        preprepare2.set_request_hash(\"some other hash\");\n\n        this->pbft->handle_message(this->preprepare_msg, default_original_msg);\n        this->pbft->handle_message(preprepare2, default_original_msg);\n    }\n\n    TEST_F(pbft_test, test_commit_messages_sent)\n    {\n        this->build_pbft();\n        EXPECT_CALL(*mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(is_prepare, Eq(true))))\n                .Times(Exactly(TEST_PEER_LIST.size()));\n        EXPECT_CALL(*mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(is_commit, Eq(true))))\n                .Times(Exactly(TEST_PEER_LIST.size()));\n\n        this->pbft->handle_message(this->preprepare_msg, default_original_msg);\n        for (const auto& peer : TEST_PEER_LIST)\n        {\n            pbft_msg prepare = pbft_msg(this->preprepare_msg);\n            prepare.set_type(PBFT_MSG_PREPARE);\n            this->pbft->handle_message(prepare, from(peer.uuid));\n        }\n    }\n\n    TEST_F(pbft_test, test_commits_applied)\n    {\n        EXPECT_CALL(*(this->mock_io_context), post(_)).Times(Exactly(1));\n        this->build_pbft();\n\n        pbft_msg preprepare = pbft_msg(this->preprepare_msg);\n        preprepare.set_sequence(1);\n        this->pbft->handle_message(preprepare, default_original_msg);\n\n        for (const auto& peer : TEST_PEER_LIST)\n        {\n            pbft_msg prepare = pbft_msg(preprepare);\n            pbft_msg commit = pbft_msg(preprepare);\n            prepare.set_type(PBFT_MSG_PREPARE);\n            commit.set_type(PBFT_MSG_COMMIT);\n            this->pbft->handle_message(prepare, from(peer.uuid));\n            this->pbft->handle_message(commit, from(peer.uuid));\n        }\n    }\n\n    TEST_F(pbft_test, dummy_pbft_service_does_not_crash)\n    {\n        database_msg db;\n        mock_service->query(db, 0);\n        mock_service->consolidate_log(2);\n    }\n\n    TEST_F(pbft_test, client_request_does_not_result_in_message_ack)\n    {\n        this->build_pbft();\n        auto mock_session = std::make_shared<NiceMock<bzn::mock_session_base>>();\n\n        EXPECT_CALL(*mock_session, send_message(A<std::shared_ptr<std::string>>())).Times(Exactly(0));\n\n        this->database_handler(this->request_msg, mock_session);\n    }\n\n    TEST_F(pbft_test, database_response_is_forwarded_to_session)\n    {\n        this->build_pbft();\n        auto mock_session = std::make_shared<NiceMock<bzn::mock_session_base>>();\n\n        EXPECT_CALL(*mock_session, send_message(A<std::shared_ptr<std::string>>())).Times(Exactly(1));\n\n        this->pbft->sessions_waiting_on_forwarded_requests[\"utest\"] = mock_session;\n\n        database_response resp;\n        resp.mutable_header()->set_request_hash(\"utest\");\n\n        this->request_msg.set_database_response(resp.SerializeAsString());\n        this->database_response_handler(this->request_msg, mock_session);\n    }\n\n    TEST_F(pbft_test, add_session_to_sessions_waiting_can_add_a_session_and_shutdown_handler_removes_session_from_sessions_waiting)\n    {\n        this->build_pbft();\n\n        EXPECT_EQ(size_t(0), this->pbft->sessions_waiting_on_forwarded_requests.size());\n\n        bzn::session_shutdown_handler shutdown_handler{0};\n\n        EXPECT_CALL(*mock_session, add_shutdown_handler(_))\n            .Times(Exactly(1))\n            .WillRepeatedly(Invoke([&](auto handler) {\n                shutdown_handler = handler;\n            }));\n\n        pbft->handle_database_message(this->request_msg, this->mock_session);\n\n        EXPECT_EQ(size_t(1), this->pbft->sessions_waiting_on_forwarded_requests.size());\n\n        EXPECT_TRUE(shutdown_handler != nullptr);\n\n        shutdown_handler();\n\n        EXPECT_EQ(size_t(0), this->pbft->sessions_waiting_on_forwarded_requests.size());\n    }\n\n    TEST_F(pbft_test, client_request_executed_results_in_message_response)\n    {\n        auto mock_session = std::make_shared<bzn::mock_session_base>();\n        EXPECT_CALL(*mock_session, send_message(A<std::shared_ptr<std::string>>())).Times(Exactly(1));\n\n        std::vector<bzn::peer_address_t> peers;\n        auto op = std::make_shared<pbft_memory_operation>(1, 1, \"somehash\");\n        op->set_session(mock_session);\n\n        dummy_pbft_service service(this->mock_io_context);\n        service.register_execute_handler([](auto){});\n\n        service.apply_operation(op);\n    }\n\n    MATCHER(operation_ptr_has_session, \"\")\n    {\n        return arg->has_session();\n    }\n\n    TEST_F(pbft_test, request_redirect_attaches_session)\n    {\n        EXPECT_CALL(*mock_service, apply_operation(operation_ptr_has_session()));\n        EXPECT_CALL(*mock_io_context, post(_)).WillRepeatedly(Invoke(\n                [](const auto task)\n                {\n                    task();\n                }\n                ));\n\n        this->uuid = SECOND_NODE_UUID;\n        this->build_pbft();\n\n        EXPECT_FALSE(pbft->is_primary());\n        this->request_msg.set_timestamp(now());\n        pbft->handle_database_message(this->request_msg, this->mock_session);\n\n        auto hash = this->crypto->hash(this->request_msg);\n\n        this->send_preprepare(1, 1, hash, this->request_msg);\n        this->send_prepares(1, 1, hash);\n        this->send_commits(1, 1, hash);\n    }\n\n    TEST_F(pbft_test, late_request_redirect_attaches_session)\n    {\n        EXPECT_CALL(*mock_service, apply_operation(operation_ptr_has_session()));\n        EXPECT_CALL(*mock_io_context, post(_)).WillRepeatedly(Invoke(\n                [](const auto task)\n                {\n                    task();\n                }\n        ));\n\n        this->uuid = SECOND_NODE_UUID;\n        this->build_pbft();\n\n        EXPECT_FALSE(pbft->is_primary());\n        this->request_msg.set_timestamp(now());\n        auto hash = this->crypto->hash(this->request_msg);\n\n        this->send_preprepare(1, 1, hash, this->request_msg);\n        this->send_prepares(1, 1, hash);\n\n        pbft->handle_database_message(this->request_msg, this->mock_session);\n\n        this->send_commits(1, 1, hash);\n    }\n\n\n    TEST_F(pbft_test, bzn_envelope_has_repeated_request_body_field)\n    {\n        // My goal here is to generate a bzn_envelope and ensure that it has the repeated request_body field\n        EXPECT_CALL(*mock_node, send_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), A<std::shared_ptr<bzn_envelope>>())).Times(1).WillRepeatedly(Invoke(\n                [&](auto /*ep*/, auto msg)\n                {\n                    EXPECT_EQ( 0, msg->piggybacked_requests_size());\n                    auto piggybacked_requests = msg->mutable_piggybacked_requests();\n                    EXPECT_TRUE(piggybacked_requests->empty());\n\n                    bzn_envelope env;\n                    *(msg->add_piggybacked_requests()) = env;\n                    *(msg->add_piggybacked_requests()) = env;\n\n                    EXPECT_FALSE(piggybacked_requests->empty());\n                    EXPECT_EQ( 2, msg->piggybacked_requests_size());\n                }));\n\n        this->uuid = SECOND_NODE_UUID;\n        this->build_pbft();\n        EXPECT_FALSE(pbft->is_primary());\n\n        pbft->handle_database_message(this->request_msg, this->mock_session);\n    }\n\n\n    TEST_F(pbft_test, ensure_save_all_requests_records_requests)\n    {\n        EXPECT_CALL(*mock_node, send_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), A<std::shared_ptr<bzn_envelope>>())).Times(1).WillRepeatedly(Invoke(\n                [&](auto /*ep*/, auto msg)\n                {\n                    EXPECT_EQ( 0, msg->piggybacked_requests_size());\n                    auto piggybacked_requests = msg->mutable_piggybacked_requests();\n                    EXPECT_TRUE(piggybacked_requests->empty());\n\n                    bzn_envelope env;\n                    pbft_msg d_msg;\n                    env.set_pbft(d_msg.SerializeAsString());\n\n                    *(msg->add_piggybacked_requests()) = env;\n\n                    d_msg.set_view(3);\n                    env.set_pbft(d_msg.SerializeAsString());\n\n                    *(msg->add_piggybacked_requests()) = env;\n\n                    auto hash_to_env = this->pbft->map_request_to_hash(*msg);\n\n                    EXPECT_FALSE(piggybacked_requests->empty());\n                    EXPECT_EQ( 2u, hash_to_env.size());\n                }));\n\n        this->uuid = SECOND_NODE_UUID;\n        this->build_pbft();\n\n        this->pbft->handle_database_message(this->request_msg, this->mock_session);\n    }\n\n    TEST_F(pbft_test, test_admission_control)\n    {\n        const size_t reqs{5};\n        this->options->get_mutable_simple_options().set(\"admission_window\", std::to_string(reqs));\n        this->build_pbft();\n        EXPECT_CALL(*mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(is_preprepare, Eq(true))))\n            .Times(Exactly(TEST_PEER_LIST.size() * reqs));\n\n        this->request_msg.set_timestamp(now());\n        for (size_t i = 0; i < reqs; i++)\n        {\n            pbft->handle_database_message(this->request_msg, this->mock_session);\n            this->request_msg.set_timestamp(this->request_msg.timestamp() + 1);\n        }\n\n        EXPECT_CALL(*mock_session, send_message(_))\n            .Times(Exactly(1))\n            .WillOnce(Invoke([&](auto& msg)\n        {\n            bzn_envelope env;\n            ASSERT_TRUE(env.ParseFromString(*msg));\n            ASSERT_EQ(env.payload_case(), bzn_envelope::kSwarmError);\n\n            swarm_error err;\n            ASSERT_TRUE(err.ParseFromString(env.swarm_error()));\n            ASSERT_EQ(err.message(), \"SERVER TOO BUSY\");\n        }));\n\n        pbft->handle_database_message(this->request_msg, this->mock_session);\n\n    }\n\n    TEST_F(pbft_test, too_big_request_generates_error)\n    {\n        this->build_pbft();\n\n        database_msg dmsg;\n        dmsg.mutable_create()->set_key(std::string(\"key\"));\n        dmsg.mutable_create()->set_value(std::string(bzn::MAX_VALUE_SIZE + 1, 'a'));\n\n        bzn_envelope request;\n        request.set_database_msg(dmsg.SerializeAsString());\n        request.set_sender(TEST_NODE_UUID);\n\n        EXPECT_CALL(*this->mock_session, send_message(ResultOf(test::is_swarm_error, Eq(true))));\n        pbft->handle_database_message(request, this->mock_session);\n    }\n\n\n}\n"
  },
  {
    "path": "pbft/test/pbft_test_common.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n\n#include <pbft/test/pbft_test_common.hpp>\n\nnamespace bzn::test\n{\n\n    pbft_test::pbft_test()\n    {\n        // This pattern copied from audit_test, to allow us to declare expectations on the timer that pbft will\n        // construct\n\n        EXPECT_CALL(*(this->mock_node), register_for_message(bzn_envelope::kPbft, _))\n                .Times(Exactly(1))\n                .WillOnce(\n                        Invoke(\n                                [&](const auto&, auto handler)\n                                {\n                                    this->message_handler = handler;\n                                    return true;\n                                }\n                        ));\n\n        EXPECT_CALL(*(this->mock_node), register_for_message(bzn_envelope::kPbftMembership, _))\n            .Times(Exactly(1))\n            .WillOnce(\n                Invoke(\n                    [&](const auto&, auto handler)\n                    {\n                        this->membership_handler = handler;\n                        return true;\n                    }\n                ));\n\n        EXPECT_CALL(*(this->mock_node), register_for_message(bzn_envelope::kDatabaseMsg, _))\n                .Times(Exactly(1))\n                .WillOnce(\n                        Invoke(\n                                [&](const auto&, auto handler)\n                                {\n                                    this->database_handler = handler;\n                                    return true;\n                                }\n                        ));\n\n        EXPECT_CALL(*(this->mock_node), register_for_message(bzn_envelope::kDatabaseResponse, _))\n            .Times(Exactly(1))\n            .WillOnce(\n                Invoke(\n                    [&](const auto&, auto handler)\n                    {\n                        this->database_response_handler = handler;\n                        return true;\n                    }\n                ));\n\n        EXPECT_CALL(*(this->mock_node), register_for_message(bzn_envelope::kCheckpointMsg, _))\n                .Times(Exactly(1))\n                .WillOnce(\n                        Invoke(\n                                [&](const auto&, auto handler)\n                                {\n                                    this->checkpoint_msg_handler = handler;\n                                    return true;\n                                }\n                        ));\n\n\n        EXPECT_CALL(*(this->mock_node), register_error_handler(_))\n            .Times(Exactly(1));\n\n        EXPECT_CALL(*(this->mock_node), send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), _))\n            .Times(AnyNumber());\n\n        EXPECT_CALL(*(this->mock_io_context), make_unique_steady_timer())\n                .Times(AnyNumber())\n                .WillOnce(\n                        Invoke(\n                                [&]()\n                                { return std::move(this->audit_heartbeat_timer); }\n                        ))\n                .WillRepeatedly(\n                    Invoke(\n                        [&]()\n                        {\n                            auto timer = std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base >>();\n                            EXPECT_CALL(*timer, async_wait(_))\n                                .Times(AnyNumber())\n                                .WillOnce(\n                                    Invoke(\n                                        [&](const auto handler)\n                                        {\n                                            this->cp_manager_timer_callbacks[cp_manager_timer_callback_count++] = handler;\n                                        }\n                                    )\n                                );\n                            return timer;\n                        }\n                    ));\n\n        EXPECT_CALL(*(this->audit_heartbeat_timer), async_wait(_))\n                .Times(AnyNumber())\n                .WillRepeatedly(\n                        Invoke(\n                                [&](auto handler)\n                                { this->audit_heartbeat_timer_callback = handler; }\n                        ));\n\n        EXPECT_CALL(*(this->new_config_timer), async_wait(_))\n                .Times(AnyNumber())\n                .WillRepeatedly(\n                        Invoke(\n                            [&](auto handler)\n                            { this->new_config_timer_callback = handler; }\n                        ));\n\n        EXPECT_CALL(*(this->mock_service), register_execute_handler(_))\n                .Times(Exactly(1))\n                .WillOnce(\n                        Invoke(\n                                [&](auto handler)\n                                { this->service_execute_handler = handler; }\n                        ));\n\n        database_msg db;\n        this->request_msg.set_database_msg(db.SerializeAsString());\n\n        this->options->get_mutable_simple_options().set(\"listener_address\", TEST_NODE_ADDR);\n        this->options->get_mutable_simple_options().set(\"listener_port\", std::to_string(TEST_NODE_LISTEN_PORT));\n        this->options->get_mutable_simple_options().set(\"crypto_enabled_incoming\", std::to_string(false));\n        this->options->get_mutable_simple_options().set(\"crypto_enabled_outgoing\", std::to_string(false));\n\n        preprepare_msg = pbft_msg();\n        preprepare_msg.set_type(PBFT_MSG_PREPREPARE);\n        preprepare_msg.set_sequence(19);\n        preprepare_msg.set_view(1);\n\n        preprepare_msg.set_request_hash(this->crypto->hash(this->request_msg));\n        *(this->default_original_msg.add_piggybacked_requests()) = this->request_msg;\n        this->default_original_msg.set_sender(\"uuid0\");\n    }\n\n    void\n    pbft_test::build_pbft()\n    {\n        this->options->get_mutable_simple_options().set(\"uuid\", this->uuid);\n        this->pbft = std::make_shared<bzn::pbft>(\n                this->mock_node\n                , this->mock_io_context\n                , this->beacon\n                , this->options\n                , this->mock_service\n                , this->crypto\n                , this->operation_manager\n                , this->storage\n                , this->monitor\n        );\n        this->pbft->set_audit_enabled(false);\n        this->pbft->start();\n        this->pbft_built = true;\n    }\n\n    void\n    pbft_test::TearDown()\n    {\n        // The code that extracts callbacks, etc expects that this will actually happen at some point, but some\n        // of the tests do not actually require it\n        if (!this->pbft_built)\n        {\n            this->build_pbft();\n        }\n    }\n\n    void\n    pbft_test::send_preprepare(uint64_t view, uint64_t sequence, bzn::hash_t req_hash, std::optional<bzn_envelope> request)\n    {\n        pbft_msg preprepare;\n        preprepare.set_view(view);\n        preprepare.set_sequence(sequence);\n        preprepare.set_request_hash(req_hash);\n        preprepare.set_type(PBFT_MSG_PREPREPARE);\n\n        bzn_envelope original;\n        if (request)\n        {\n            (*original.add_piggybacked_requests()) = *request;\n        }\n\n        original.set_pbft(preprepare.SerializeAsString());\n        original.set_sender(\"uuid0\");\n\n        this->pbft->handle_message(preprepare, original);\n    }\n\n    void\n    pbft_test::send_prepares(uint64_t view, uint64_t sequence, bzn::hash_t req_hash)\n    {\n        pbft_msg prepare;\n        prepare.set_view(view);\n        prepare.set_sequence(sequence);\n        prepare.set_request_hash(req_hash);\n        prepare.set_type(PBFT_MSG_PREPARE);\n\n        for (const auto& peer : TEST_PEER_LIST)\n        {\n            bzn_envelope original;\n            original.set_pbft(prepare.SerializeAsString());\n            original.set_sender(peer.uuid);\n            this->pbft->handle_message(prepare, original);\n        }\n    }\n\n    void\n    pbft_test::send_commits(uint64_t view, uint64_t sequence, bzn::hash_t req_hash)\n    {\n        pbft_msg commit;\n        commit.set_view(view);\n        commit.set_sequence(sequence);\n        commit.set_request_hash(req_hash);\n        commit.set_type(PBFT_MSG_COMMIT);\n\n        for (const auto& peer : TEST_PEER_LIST)\n        {\n            bzn_envelope original;\n            original.set_pbft(commit.SerializeAsString());\n            original.set_sender(peer.uuid);\n            this->pbft->handle_message(commit, original);\n        }\n    }\n\n    uint64_t now()\n    {\n        return (std::chrono::duration_cast<std::chrono::milliseconds>(\n                std::chrono::system_clock::now().time_since_epoch()).count());\n    }\n\n    pbft_msg\n    extract_pbft_msg(bzn_envelope msg)\n    {\n        pbft_msg result;\n        result.ParseFromString(msg.pbft());\n        return result;\n    }\n\n    pbft_membership_msg\n    extract_pbft_membership_msg(bzn_envelope msg)\n    {\n        pbft_membership_msg result;\n        result.ParseFromString(msg.pbft_membership());\n        return result;\n    }\n\n    std::string\n    extract_sender(std::string msg)\n    {\n        bzn_envelope outer;\n        outer.ParseFromString(msg);\n        return outer.sender();\n    }\n\n    bzn_envelope\n    wrap_pbft_msg(const pbft_msg& msg, const bzn::uuid_t sender)\n    {\n        bzn_envelope result;\n        result.set_pbft(msg.SerializeAsString());\n        result.set_sender(sender);\n        return result;\n    }\n\n    bzn_envelope\n    wrap_pbft_membership_msg(const pbft_membership_msg& msg, const bzn::uuid_t sender)\n    {\n        bzn_envelope result;\n        result.set_pbft_membership(msg.SerializeAsString());\n        result.set_sender(sender);\n        return result;\n    }\n\n    bool\n    is_preprepare(std::shared_ptr<bzn_envelope> wrapped_msg)\n    {\n        if (wrapped_msg->payload_case() != bzn_envelope::kPbft)\n        {\n            return false;\n        }\n\n        pbft_msg msg = extract_pbft_msg(*wrapped_msg);\n\n        return msg.type() == PBFT_MSG_PREPREPARE && msg.view() > 0 && msg.sequence() > 0;\n    }\n\n    bool\n    is_prepare(std::shared_ptr<bzn_envelope> wrapped_msg)\n    {\n        if (wrapped_msg->payload_case() != bzn_envelope::kPbft)\n        {\n            return false;\n        }\n\n        pbft_msg msg = extract_pbft_msg(*wrapped_msg);\n\n        return msg.type() == PBFT_MSG_PREPARE && msg.view() > 0 && msg.sequence() > 0;\n    }\n\n    bool\n    is_commit(std::shared_ptr<bzn_envelope> wrapped_msg)\n    {\n        if (wrapped_msg->payload_case() != bzn_envelope::kPbft)\n        {\n            return false;\n        }\n\n        pbft_msg msg = extract_pbft_msg(*wrapped_msg);\n\n        return msg.type() == PBFT_MSG_COMMIT && msg.view() > 0 && msg.sequence() > 0;\n    }\n\n    bool\n    is_checkpoint(std::shared_ptr<bzn_envelope> wrapped_msg)\n    {\n        if (wrapped_msg->payload_case() != bzn_envelope::kCheckpointMsg)\n        {\n            return false;\n        }\n\n        checkpoint_msg msg;\n\n        return msg.ParseFromString(wrapped_msg->checkpoint_msg()) && msg.sequence() != 0 && msg.state_hash() != \"\";\n    }\n\n    bool\n    is_join(std::shared_ptr<bzn_envelope> wrapped_msg)\n    {\n        if (wrapped_msg->payload_case() != bzn_envelope::kPbftMembership)\n        {\n            return false;\n        }\n\n        auto msg = extract_pbft_membership_msg(*wrapped_msg);\n\n        return msg.type() == PBFT_MMSG_JOIN && wrapped_msg->sender() != \"\";\n    }\n\n    bool\n    is_audit(std::shared_ptr<bzn_envelope> msg)\n    {\n        audit_message parsed;\n        return (msg->payload_case() == bzn_envelope::kAudit && parsed.ParseFromString(msg->audit()));\n    }\n\n    bool\n    is_viewchange(std::shared_ptr<bzn_envelope> wrapped_msg)\n    {\n        pbft_msg msg;\n        msg.ParseFromString(wrapped_msg->pbft());\n        return msg.type() == PBFT_MSG_VIEWCHANGE;\n    }\n\n    bool\n    is_newview(std::shared_ptr<bzn_envelope> wrapped_msg)\n    {\n        pbft_msg msg;\n        msg.ParseFromString(wrapped_msg->pbft());\n        return msg.type() == PBFT_MSG_NEWVIEW;\n    }\n\n    bool\n    is_swarm_error(std::shared_ptr<std::string> msg)\n    {\n        bzn_envelope env;\n        return env.ParseFromString(*msg) && env.payload_case() == bzn_envelope::kSwarmError;\n    }\n\n    bzn_envelope\n    from(uuid_t uuid)\n    {\n        bzn_envelope result;\n        result.set_sender(uuid);\n        return result;\n    }\n\n    bzn_envelope\n    wrap_request(const database_msg& db)\n    {\n        bzn_envelope env;\n        env.set_database_msg(db.SerializeAsString());\n\n        return env;\n    }\n}\n"
  },
  {
    "path": "pbft/test/pbft_test_common.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n\n#pragma once\n#include <gtest/gtest.h>\n#include <include/bluzelle.hpp>\n#include <pbft/operations/pbft_operation.hpp>\n#include <pbft/pbft_base.hpp>\n#include <pbft/pbft.hpp>\n#include <pbft/dummy_pbft_service.hpp>\n#include <storage/mem_storage.hpp>\n#include <peers_beacon/peer_address.hpp>\n#include <mocks/mock_node_base.hpp>\n#include <proto/bluzelle.pb.h>\n#include <json/json.h>\n#include <boost/beast/core/detail/base64.hpp>\n#include <mocks/mock_boost_asio_beast.hpp>\n#include <mocks/mock_pbft_service_base.hpp>\n#include <mocks/mock_session_base.hpp>\n#include <mocks/mock_monitor.hpp>\n#include <mocks/smart_mock_node.hpp>\n#include <mocks/smart_mock_peers_beacon.hpp>\n#include <crypto/crypto.hpp>\n#include <options/options.hpp>\n#include <storage/mem_storage.hpp>\n#include <mocks/smart_mock_peers_beacon.hpp>\n\nusing namespace ::testing;\n\nnamespace bzn::test\n{\n    const bzn::uuid_t TEST_NODE_UUID{\"uuid1\"};\n    const bzn::uuid_t SECOND_NODE_UUID{\"uuid0\"};\n\n    const std::string TEST_NODE_ADDR(\"127.0.0.1\");\n    const uint16_t TEST_NODE_LISTEN_PORT(8084);\n\n    const bzn::peers_list_t TEST_PEER_LIST{{  \"127.0.0.1\", 8081, \"name1\", \"uuid0\"}\n                                           , {\"127.0.0.1\", 8082, \"name2\", \"uuid2\"}\n                                           , {\"127.0.0.1\", 8083, \"name3\", \"uuid3\"}\n                                           , {TEST_NODE_ADDR, TEST_NODE_LISTEN_PORT, \"name4\", TEST_NODE_UUID}};\n\n    const std::string TEST_NODE_ADDR_0(\"127.0.0.1\");\n\n    const bzn::peers_list_t BAD_TEST_PEER_LIST_0{{ \"127.0.0.1\", 8081, \"name1\", \"uuid0\"}\n                                                , {\"127.0.0.1\", 8082, \"name2\", \"uuid2\"}\n                                                , {\"127.0.0.1\", 8083, \"name3\", \"uuid3\"}\n                                                , {TEST_NODE_ADDR_0, TEST_NODE_LISTEN_PORT, \"name4\", \"uuid_of_bad_node\"}};\n\n    const bzn::peers_list_t GOOD_TEST_PEER_LIST{{ \"127.0.0.1\", 8081, \"name1\", \"uuid0\"}\n                                                , {\"127.0.0.1\", 8082, \"name2\", \"uuid2\"}\n                                                , {\"127.0.0.1\", 8083, \"name3\", \"uuid3\"}\n                                                , {TEST_NODE_ADDR_0, uint16_t(TEST_NODE_LISTEN_PORT + 73), \"name4\", \"uuid_of_good_node\"}};\n\n    class pbft_test : public Test\n    {\n    public:\n        bzn_envelope request_msg;\n\n        pbft_msg preprepare_msg;\n        bzn_envelope default_original_msg;\n\n        std::shared_ptr<bzn::asio::mock_io_context_base> mock_io_context =\n                std::make_shared<NiceMock<bzn::asio::mock_io_context_base >>();\n        std::shared_ptr<bzn::smart_mock_node> mock_node = std::make_shared<bzn::smart_mock_node>();\n        std::shared_ptr<bzn::mock_pbft_service_base> mock_service =\n                std::make_shared<NiceMock<bzn::mock_pbft_service_base>>();\n        std::shared_ptr<bzn::mock_session_base> mock_session =\n                std::make_shared<NiceMock<bzn::mock_session_base>>();\n        std::shared_ptr<bzn::storage_base> storage = std::make_shared<bzn::mem_storage>();\n\n        std::shared_ptr<bzn::pbft_operation_manager> operation_manager =\n                std::make_shared<bzn::pbft_operation_manager>(static_peers_beacon_for(TEST_PEER_LIST), storage);\n\n        std::shared_ptr<bzn::options_base> options = std::make_shared<bzn::options>();\n        std::shared_ptr<bzn::mock_monitor> monitor = std::make_shared<NiceMock<bzn::mock_monitor>>();\n        std::shared_ptr<bzn::crypto_base> crypto = std::make_shared<bzn::crypto>(options, monitor);\n\n        std::shared_ptr<bzn::mock_peers_beacon_base> beacon = bzn::static_peers_beacon_for(bzn::test::TEST_PEER_LIST);\n\n        std::shared_ptr<bzn::pbft> pbft;\n\n        std::unique_ptr<bzn::asio::mock_steady_timer_base> audit_heartbeat_timer =\n                std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base >>();\n\n        std::unique_ptr<bzn::asio::mock_steady_timer_base> new_config_timer =\n                std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base >>();\n\n        std::unique_ptr<bzn::asio::mock_steady_timer_base> join_retry_timer =\n            std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base >>();\n\n        std::unique_ptr<bzn::asio::mock_steady_timer_base> cp_manager_timer1 =\n                std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base >>();\n\n        bzn::asio::wait_handler audit_heartbeat_timer_callback;\n        bzn::asio::wait_handler new_config_timer_callback;\n\n        size_t cp_manager_timer_callback_count = 0;\n        std::unordered_map<size_t, bzn::asio::wait_handler> cp_manager_timer_callbacks;\n\n        bzn::execute_handler_t service_execute_handler;\n        bzn::protobuf_handler message_handler;\n        bzn::protobuf_handler database_handler;\n        bzn::protobuf_handler database_response_handler;\n        bzn::protobuf_handler membership_handler;\n        bzn::protobuf_handler checkpoint_msg_handler;\n\n        bzn::uuid_t uuid = TEST_NODE_UUID;\n\n        bool pbft_built = false;\n\n        pbft_test();\n\n        void build_pbft();\n\n        void TearDown();\n\n        void send_preprepare(uint64_t view, uint64_t sequence, bzn::hash_t req_hash, std::optional<bzn_envelope> request);\n        void send_prepares(uint64_t view, uint64_t sequence, bzn::hash_t req_hash);\n        void send_commits(uint64_t view, uint64_t sequence, bzn::hash_t req_hash);\n\n\n    };\n\n    uint64_t now();\n\n    pbft_msg extract_pbft_msg(std::string msg);\n    uuid_t extract_sender(std::string msg);\n\n    bzn_envelope\n    wrap_pbft_msg(const pbft_msg& msg, const bzn::uuid_t sender=\"\");\n\n    bzn_envelope wrap_pbft_membership_msg(const pbft_membership_msg& msg, const bzn::uuid_t sender);\n\n    bzn_envelope\n    wrap_request(const database_msg& msg);\n\n    bool is_preprepare(std::shared_ptr<bzn_envelope> msg);\n    bool is_prepare(std::shared_ptr<bzn_envelope> msg);\n    bool is_commit(std::shared_ptr<bzn_envelope> msg);\n    bool is_checkpoint(std::shared_ptr<bzn_envelope> msg);\n    bool is_join(std::shared_ptr<bzn_envelope> msg);\n    bool is_audit(std::shared_ptr<bzn_envelope> msg);\n    bool is_viewchange(std::shared_ptr<bzn_envelope> wrapped_msg);\n    bool is_newview(std::shared_ptr<bzn_envelope> wrapped_msg);\n    bool is_swarm_error(std::shared_ptr<std::string> msg);\n\n    bzn_envelope from(uuid_t uuid);\n}\n"
  },
  {
    "path": "pbft/test/pbft_timestamp_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n\n#include <pbft/test/pbft_test_common.hpp>\n#include <pbft/test/pbft_proto_test.hpp>\n#include <utils/make_endpoint.hpp>\n#include <chrono>\n\nusing namespace ::testing;\n\nnamespace bzn\n{\n    using namespace test;\n\n    TEST_F(pbft_proto_test, repeated_request_doesnt_generate_preprepare)\n    {\n        this->build_pbft();\n\n        database_msg dmsg;\n        dmsg.mutable_create()->set_key(std::string(\"key\"));\n        dmsg.mutable_create()->set_value(std::string(\"value\"));\n\n        bzn_envelope request;\n        request.set_database_msg(dmsg.SerializeAsString());\n        request.set_timestamp(this->now());\n        request.set_sender(TEST_NODE_UUID);\n\n        // the first time we should get pre-prepare messages\n        EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(test::is_preprepare, Eq(true))))\n            .Times(Exactly(TEST_PEER_LIST.size()));\n        this->handle_request(request);\n\n        auto request2 = bzn_envelope(request);\n\n        // this time no pre-prepare should be issued\n        EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(test::is_preprepare, Eq(true))))\n            .Times(Exactly(0));\n        std::shared_ptr<bzn::mock_session_base> session = std::make_shared<bzn::mock_session_base>();\n        EXPECT_CALL(*session, send_message(ResultOf(test::is_swarm_error, Eq(true))));\n\n        this->handle_request(request2, session);\n    }\n\n    TEST_F(pbft_proto_test, similar_request_generates_preprepare)\n    {\n        this->build_pbft();\n\n        // send an initial message\n        database_msg dmsg;\n        dmsg.mutable_create()->set_key(std::string(\"key\"));\n        dmsg.mutable_create()->set_value(std::string(\"value\"));\n\n        bzn_envelope request;\n        request.set_database_msg(dmsg.SerializeAsString());\n        request.set_timestamp(this->now());\n        request.set_sender(TEST_NODE_UUID);\n\n        // we should get pre-prepare messages\n        EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(test::is_preprepare, Eq(true))))\n            .Times(Exactly(TEST_PEER_LIST.size()));\n        this->handle_request(request);\n\n\n        // send a second message the same as first but with a slightly different timestamp\n        auto request2 = bzn_envelope(request);\n        request2.set_timestamp(request2.timestamp() + 1);\n\n        // again we should get pre-prepare messages\n        EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(test::is_preprepare, Eq(true))))\n            .Times(Exactly(TEST_PEER_LIST.size()));\n        this->handle_request(request2);\n\n\n        // send a third message the same as first but with same timestamp and different operation\n        database_msg dmsg3;\n        dmsg3.mutable_create()->set_key(std::string(\"key3\"));\n        dmsg3.mutable_create()->set_value(std::string(\"value3\"));\n\n        auto request3 = bzn_envelope(request);\n        request3.set_database_msg(dmsg3.SerializeAsString());\n\n        // again we should get pre-prepare messages\n        EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(test::is_preprepare, Eq(true))))\n            .Times(Exactly(TEST_PEER_LIST.size()));\n        this->handle_request(request3);\n    }\n\n    TEST_F(pbft_proto_test, same_request_from_different_client_generates_preprepare)\n    {\n        this->build_pbft();\n\n        // send an initial message\n        database_msg dmsg;\n        dmsg.mutable_create()->set_key(std::string(\"key\"));\n        dmsg.mutable_create()->set_value(std::string(\"value\"));\n\n        bzn_envelope request;\n        request.set_database_msg(dmsg.SerializeAsString());\n        request.set_timestamp(this->now());\n        request.set_sender(TEST_NODE_UUID);\n\n        // we should get pre-prepare messages\n        EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(test::is_preprepare, Eq(true))))\n            .Times(Exactly(TEST_PEER_LIST.size()));\n        this->handle_request(request);\n\n        // send a second message the same as first but from different client\n        auto request2 = bzn_envelope(request);\n        request2.set_sender(SECOND_NODE_UUID);\n\n        // again we should get pre-prepare messages\n        EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(test::is_preprepare, Eq(true))))\n            .Times(Exactly(TEST_PEER_LIST.size()));\n        this->handle_request(request2);\n    }\n\n    TEST_F(pbft_proto_test, old_request_is_rejected)\n    {\n        this->build_pbft();\n\n        database_msg dmsg;\n        dmsg.mutable_create()->set_key(std::string(\"key\"));\n        dmsg.mutable_create()->set_value(std::string(\"value\"));\n\n        bzn_envelope request;\n        request.set_database_msg(dmsg.SerializeAsString());\n        request.set_timestamp(0);\n        request.set_sender(TEST_NODE_UUID);\n\n        // we should NOT get pre-prepare messages since this is an old request\n        EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(test::is_preprepare, Eq(true))))\n            .Times(Exactly(0));\n\n        std::shared_ptr<bzn::mock_session_base> session = std::make_shared<bzn::mock_session_base>();\n        EXPECT_CALL(*session, send_message(ResultOf(test::is_swarm_error, Eq(true))));\n\n        this->handle_request(request, session);\n    }\n\n    TEST_F(pbft_proto_test, range_test)\n    {\n        std::map<int, std::string> m;\n        m.insert(std::make_pair(2, \"2\"));\n        m.insert(std::make_pair(3, \"3\"));\n        m.insert(std::make_pair(4, \"4\"));\n\n        auto r = m.equal_range(1);\n        EXPECT_EQ(r.first, r.second);\n    }\n}\n"
  },
  {
    "path": "pbft/test/pbft_viewchange_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <mocks/mock_boost_asio_beast.hpp>\n#include <mocks/mock_node_base.hpp>\n#include <mocks/mock_session_base.hpp>\n#include <mocks/mock_crypto_base.hpp>\n#include <mocks/mock_options_base.hpp>\n#include <pbft/test/pbft_proto_test.hpp>\n#include <utils/make_endpoint.hpp>\n\nnamespace bzn\n{\n    class pbft_viewchange_test : public pbft_proto_test\n    {\n    public:\n        std::shared_ptr<bzn::options_base> options = std::make_shared<bzn::options>();\n\n        std::shared_ptr<mock_crypto_base>\n        build_pft_with_mock_crypto()\n        {\n            std::shared_ptr<mock_crypto_base> mockcrypto = std::make_shared<mock_crypto_base>();\n            this->crypto = mockcrypto;\n            this->build_pbft();\n            return mockcrypto;\n        }\n\n        void\n        run_transaction_through_primary_times(const size_t repeat, uint64_t& current_sequence)\n        {\n            for (size_t i{0}; i<repeat; ++i)\n            {\n                current_sequence++;\n                run_transaction_through_primary(false);\n            }\n        }\n\n        void\n        generate_checkpoint_at_sequence_100(uint64_t& current_sequence)\n        {\n            this->build_pbft();\n\n            for (current_sequence=1; current_sequence < 100; ++current_sequence)\n            {\n                run_transaction_through_primary();\n            }\n            prepare_for_checkpoint(current_sequence);\n            run_transaction_through_primary();\n            this->stabilize_checkpoint(current_sequence);\n        }\n    };\n\n    TEST_F(pbft_viewchange_test, test_fill_in_missing_pre_prepares)\n    {\n        this->build_pbft();\n\n        bzn_envelope envelope;\n        std::map<uint64_t, bzn_envelope> pre_prepares;\n        pre_prepares.insert(std::make_pair(uint64_t(103), envelope));\n        pre_prepares.insert(std::make_pair(uint64_t(101), envelope));\n        this->pbft->fill_in_missing_pre_prepares(99, 4, pre_prepares);\n        EXPECT_TRUE(0 < pre_prepares.count(102));\n\n        ///////////////////////////////////////                                                                 }));\n        pre_prepares.insert(std::make_pair(uint64_t(107), envelope));\n        this->pbft->fill_in_missing_pre_prepares(99, 4, pre_prepares);\n\n        uint64_t sequence = 100;\n        for (const auto pre_prepare : pre_prepares)\n        {\n            EXPECT_EQ(sequence , pre_prepare.first);\n            ++sequence;\n        }\n\n        EXPECT_TRUE(0 == pre_prepares.count(sequence));\n    }\n\n    TEST_F(pbft_viewchange_test, pbft_with_invalid_view_drops_messages)\n    {\n        this->uuid = SECOND_NODE_UUID;\n        this->build_pbft();\n\n        this->pbft->handle_failure();\n\n        // after handling the failure, the pbft must ignore all messages save for\n        // checkpoint, view change and new view messages\n        pbft_msg message;\n\n        message.set_type(PBFT_MSG_PREPREPARE);\n        EXPECT_FALSE(this->pbft->preliminary_filter_msg(message));\n\n        message.set_type(PBFT_MSG_PREPARE);\n        EXPECT_FALSE(this->pbft->preliminary_filter_msg(message));\n\n        message.set_type(PBFT_MSG_COMMIT);\n        EXPECT_FALSE(this->pbft->preliminary_filter_msg(message));\n\n        message.set_type(PBFT_MSG_VIEWCHANGE);\n        EXPECT_TRUE(this->pbft->preliminary_filter_msg(message));\n\n        message.set_type(PBFT_MSG_NEWVIEW);\n        EXPECT_TRUE(this->pbft->preliminary_filter_msg(message));\n    }\n\n    TEST_F(pbft_viewchange_test, test_is_peer)\n    {\n        const bzn::peer_address_t NOT_PEER{\"127.0.0.1\", 9091, \"not_a_peer\", \"uuid_nope\"};\n        this->build_pbft();\n\n        for (const auto& peer : TEST_PEER_LIST)\n        {\n            EXPECT_TRUE(this->pbft->is_peer(peer.uuid));\n        }\n\n        EXPECT_FALSE(this->pbft->is_peer(NOT_PEER.uuid));\n    }\n\n    TEST_F(pbft_viewchange_test, validate_and_extract_checkpoint_hashes)\n    {\n        uint64_t current_sequence{0};\n        generate_checkpoint_at_sequence_100(current_sequence);\n\n        this->run_transaction_through_primary_times(2, current_sequence);\n\n        EXPECT_CALL(*mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(test::is_viewchange, Eq(true))))\n            .WillRepeatedly(Invoke([&](const auto & /*endpoint*/, const auto &viewchange_env)\n            {\n                pbft_msg viewchange;\n                viewchange.ParseFromString(viewchange_env->pbft());\n                EXPECT_EQ(PBFT_MSG_VIEWCHANGE, viewchange.type());\n\n                std::map<bzn::checkpoint_t, std::set<bzn::uuid_t>> checkpoints = this->pbft->validate_and_extract_checkpoint_hashes(\n                    viewchange);\n                EXPECT_EQ(uint64_t(1), checkpoints.size());\n\n                for (const auto &p : checkpoints)\n                {\n                    auto checkpoint = p.first;\n                    auto uuids = p.second;\n\n                    // there will be a checkpoint 100, with a hash value of \"100\"\n                    EXPECT_EQ(uint64_t(100), checkpoint.first);\n                    EXPECT_EQ(\"100\", checkpoint.second);\n\n                    EXPECT_EQ(uint64_t(3), uuids.size());\n                    for (const auto &uuid : uuids)\n                    {\n                        EXPECT_FALSE(TEST_PEER_LIST.end() == std::find_if(TEST_PEER_LIST.begin(), TEST_PEER_LIST.end()\n                            , [&](const auto &peer)\n                        {\n                            return peer.uuid == uuid;\n                        }));\n                    }\n                }\n            }));\n        this->pbft->handle_failure();\n    }\n\n    TEST_F(pbft_viewchange_test, test_is_valid_viewchange_message)\n    {\n        uint64_t current_sequence{0};\n\n        generate_checkpoint_at_sequence_100(current_sequence);\n\n        this->run_transaction_through_primary_times(2, current_sequence);\n\n        EXPECT_CALL(*mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(test::is_viewchange, Eq(true))))\n            .WillRepeatedly(Invoke([&](const auto& /*endpoint*/, auto viewchange_env)\n            {\n                pbft_msg viewchange;\n                EXPECT_TRUE(viewchange.ParseFromString(viewchange_env->pbft())); // this will be valid.\n                viewchange_env->set_sender(this->pbft->get_uuid());\n                EXPECT_TRUE(this->pbft->is_valid_viewchange_message(viewchange, *viewchange_env));\n            }));\n\n        this->pbft->handle_failure();\n    }\n\n    TEST_F(pbft_viewchange_test, make_viewchange_makes_valid_message)\n    {\n        uint64_t current_sequence{0};\n\n        generate_checkpoint_at_sequence_100(current_sequence);\n\n        this->run_transaction_through_primary_times(2, current_sequence);\n\n        auto ops = this->operation_manager->prepared_operations_since(this->pbft->latest_stable_checkpoint().first);\n\n        auto viewchange_env = this->pbft->make_viewchange(this->pbft->get_view() + uint64_t(1), current_sequence, this->pbft->checkpoint_manager->get_latest_stable_checkpoint_proof(), ops);\n\n        pbft_msg viewchange;\n        viewchange.ParseFromString(viewchange_env->pbft());\n\n        EXPECT_EQ(PBFT_MSG_VIEWCHANGE, viewchange.type());\n        EXPECT_EQ(current_sequence, viewchange.sequence());\n        EXPECT_EQ(3, viewchange.checkpoint_messages_size());\n    }\n\n    TEST_F(pbft_viewchange_test, pbft_handle_failure_causes_invalid_view_state_and_starts_viewchange)\n    {\n        this->uuid = SECOND_NODE_UUID;\n        this->build_pbft();\n\n        EXPECT_CALL(*mock_node, send_message_str(_, _))\n            .WillRepeatedly(Invoke([&](const auto& /*endpoint*/, const auto encoded_message)\n            {\n               bzn_envelope envelope;\n               envelope.ParseFromString(*encoded_message);\n               pbft_msg view_change;\n\n               view_change.ParseFromString(envelope.pbft());\n               EXPECT_EQ(PBFT_MSG_VIEWCHANGE, view_change.type());\n               EXPECT_TRUE(2 == view_change.view());\n               EXPECT_TRUE(this->pbft->latest_stable_checkpoint().first == view_change.sequence());\n            }));\n\n        this->pbft->handle_failure();\n\n        // Now the replica's view should be invalid\n        EXPECT_FALSE(this->pbft->is_view_valid());\n    }\n\n    TEST_F(pbft_viewchange_test, test_prepared_operations_since_last_checkpoint)\n    {\n        uint64_t current_sequence{0};\n\n        generate_checkpoint_at_sequence_100(current_sequence);\n\n        EXPECT_EQ(size_t(0), this->operation_manager->prepared_operations_since(this->pbft->latest_stable_checkpoint().first).size());\n\n        run_transaction_through_primary(false);\n        current_sequence++;\n        EXPECT_EQ(size_t(1), this->operation_manager->prepared_operations_since(this->pbft->latest_stable_checkpoint().first).size());\n\n        run_transaction_through_primary(false);\n        current_sequence++;\n        EXPECT_EQ(size_t(2), this->operation_manager->prepared_operations_since(this->pbft->latest_stable_checkpoint().first).size());\n\n        auto operations = this->operation_manager->prepared_operations_since(this->pbft->latest_stable_checkpoint().first);\n        for(const auto& operation : operations)\n        {\n            // TODO: what other tests?\n            EXPECT_EQ(uint64_t(1), operation.second->get_view());\n            EXPECT_TRUE(operation.second->get_sequence() > 100 && operation.second->get_sequence() <= current_sequence);\n        }\n    }\n\n    TEST_F(pbft_viewchange_test, test_save_checkpoint)\n    {\n        this->build_pbft();\n        pbft_msg msg;\n\n        // add three checkpoint messages\n        for (uint64_t i{1}; i<4; ++i)\n        {\n            bzn_envelope checkpoint;\n            checkpoint.set_sender(\"a_nice_sender\");\n            checkpoint.set_signature(\"signature_\" + std::to_string(i));\n\n            checkpoint_msg checkpoint_msg;\n            checkpoint_msg.set_sequence(i);\n            checkpoint_msg.set_state_hash(\"a_state_hash_\" + std::to_string(i));\n\n            checkpoint.set_checkpoint_msg(checkpoint_msg.SerializeAsString());\n            *(msg.add_checkpoint_messages()) = checkpoint;\n        }\n        this->pbft->save_checkpoint(msg);\n        //  expect that there should be 3 unstable checkpoint proofs after calling save_checkpoint.\n        EXPECT_EQ(uint64_t(3), this->pbft->checkpoint_manager->partial_checkpoint_proofs_count());\n    }\n\n    TEST_F(pbft_viewchange_test, test_handle_viewchange)\n    {\n        // get sut1 to generate viewchange message\n        // catch message\n        // send to sut2 handle_viewchange\n        // sut2 should store viewchange\n        // re-send from other nodes to handle_viewchange\n        // sut2 should eventually send its own viewchange\n        // once enough viewchange messages are sent, sut2 should send newview\n        // capture newview and send to sut1 handle_newview\n\n        // sut1 (this->pbft) is initial primary\n        this->build_pbft();\n\n        // sut2 is new primary after view change\n        auto mock_node2 = std::make_shared<bzn::smart_mock_node>();\n        std::shared_ptr<bzn::asio::mock_io_context_base> mock_io_context2 =\n                std::make_shared<NiceMock<bzn::asio::mock_io_context_base >>();\n        std::unique_ptr<bzn::asio::mock_steady_timer_base> audit_heartbeat_timer2 =\n                std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base >>();\n        std::unique_ptr<bzn::asio::mock_steady_timer_base> new_config_timer2 =\n            std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base >>();\n        std::unique_ptr<bzn::asio::mock_steady_timer_base> join_retry_timer2 =\n            std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base >>();\n        std::unique_ptr<bzn::asio::mock_steady_timer_base> grace_timer2 =\n                std::make_unique<NiceMock<bzn::asio::mock_steady_timer_base >>();\n        std::shared_ptr<bzn::mock_pbft_service_base> mock_service2 =\n                std::make_shared<NiceMock<bzn::mock_pbft_service_base>>();\n\n        EXPECT_CALL(*(mock_node2), register_error_handler(_))\n            .Times(Exactly(1));\n\n        EXPECT_CALL(*(mock_io_context2), make_unique_steady_timer())\n            .Times(AtMost(4)).WillOnce(Invoke([&]()\n            { return std::move(audit_heartbeat_timer2); }))\n            .WillOnce(Invoke([&]()\n            { return std::move(new_config_timer2); }))\n            .WillOnce(Invoke([&]()\n            { return std::move(join_retry_timer2); }))\n            .WillOnce(Invoke([&]()\n             { return std::move(grace_timer2); }));\n\n        auto mock_options = std::make_shared<bzn::mock_options_base>();\n        EXPECT_CALL(*(mock_options), get_peer_message_signing()).Times(AnyNumber());\n        EXPECT_CALL(*mock_options, get_uuid()).WillRepeatedly(Invoke([](){return \"uuid2\";}));\n        EXPECT_CALL(*mock_options, get_swarm_id()).WillRepeatedly(Invoke([](){return \"my_swarm\";}));\n\n        auto peers = static_peers_beacon_for(TEST_PEER_LIST);\n\n        auto storage2 = std::make_shared<bzn::mem_storage>();\n        auto manager2 = std::make_shared<bzn::pbft_operation_manager>(peers, storage2);\n        auto monitor = std::make_shared<NiceMock<bzn::mock_monitor>>();\n\n        auto pbft2 = std::make_shared<bzn::pbft>(mock_node2, mock_io_context2, peers, mock_options, mock_service2\n            , this->crypto, manager2, storage2, monitor);\n        pbft2->set_audit_enabled(false);\n\n        pbft2->start();\n\n        // set up a stable checkpoint plus a couple of uncommitted transactions on sut1\n        for (size_t i = 0; i < 99; i++)\n        {\n            run_transaction_through_primary();\n        }\n        prepare_for_checkpoint(100);\n        run_transaction_through_primary();\n        this->stabilize_checkpoint(100);\n\n        for (size_t i = 0; i < 20; i++)\n        {\n            run_transaction_through_primary(false);\n        }\n\n        for (auto const &p : TEST_PEER_LIST)\n        {\n            EXPECT_CALL(*(this->mock_node),\n                send_maybe_signed_message(*bzn::make_endpoint(p), ResultOf(test::is_viewchange, Eq(true))))\n                .Times(Exactly(1))\n                .WillRepeatedly(Invoke([&](auto, auto wmsg)\n                {\n                   pbft_msg msg;\n                   ASSERT_TRUE(msg.ParseFromString(wmsg->pbft()));\n                   wmsg->set_sender(p.uuid);\n                   for (const auto& peer : TEST_PEER_LIST)\n                   {\n                       checkpoint_msg cp;\n                       cp.set_sequence(pbft->latest_stable_checkpoint().first);\n                       cp.set_state_hash(pbft->latest_stable_checkpoint().second);\n                       bzn_envelope env;\n                       env.set_checkpoint_msg(cp.SerializeAsString());\n                       env.set_sender(peer.uuid);\n                       pbft2->checkpoint_manager->handle_checkpoint_message(env);\n                   }\n                   pbft2->handle_viewchange(msg, *wmsg);\n                }));\n        }\n\n        for (auto const &p : TEST_PEER_LIST)\n        {\n            EXPECT_CALL(*mock_node2, send_maybe_signed_message(*bzn::make_endpoint(p), ResultOf(test::is_newview, Eq(true))))\n                .Times(Exactly(1))\n                .WillRepeatedly(Invoke([&](auto, auto wmsg)\n                {\n                    if (p.uuid == TEST_NODE_UUID)\n                   {\n                       EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(test::is_prepare, Eq(true))))\n                               .Times(Exactly(20 * TEST_PEER_LIST.size()));\n                       pbft_msg msg;\n                       ASSERT_TRUE(msg.ParseFromString(wmsg->pbft()));\n                       wmsg->set_sender(\"uuid2\");\n                       this->pbft->handle_newview(msg, *wmsg);\n                   }\n                }));\n        }\n\n        EXPECT_CALL(*mock_node2, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(test::is_viewchange, Eq(true))))\n                .Times(Exactly(TEST_PEER_LIST.size()));\n\n        // get sut1 to generate viewchange message\n        this->pbft->handle_failure();\n\n        EXPECT_EQ(this->pbft->view.value(), 2U);\n        mock_node2->clear();\n    }\n\n    TEST_F(pbft_viewchange_test, is_valid_viewchange_does_not_throw_if_no_checkpoint_yet)\n    {\n        // This test was written for KEP-902: is_valid_viewchange throws if no checkpoint yet\n        uint64_t current_sequence{0};\n        this->build_pbft();\n        bzn_envelope original_message;\n\n        EXPECT_CALL(*mock_node, send_maybe_signed_message(A<const boost::asio::ip::tcp::endpoint&>(), ResultOf(test::is_viewchange, Eq(true)))).WillRepeatedly(Invoke([&](const auto & /*endpoint*/, const auto &viewchange_env)\n            { original_message = *viewchange_env; }));\n\n        this->run_transaction_through_primary_times(1, current_sequence);\n\n        this->pbft->handle_failure();\n\n        auto latest_checkpoint{this->pbft->checkpoint_manager->get_latest_local_checkpoint()};\n        EXPECT_EQ(0U, latest_checkpoint.first);\n        EXPECT_EQ(INITIAL_CHECKPOINT_HASH, latest_checkpoint.second);\n\n        pbft_msg viewchange_message;\n        viewchange_message.ParseFromString(original_message.pbft());\n\n        // It was the dereferencing of an empty valid_checkpoint_hashes that was causing is_valid_viewchange_message to throw an exception\n        auto valid_checkpoint_hashes{this->pbft->validate_and_extract_checkpoint_hashes(viewchange_message)};\n        // ensure that the valid_checkpoint_hashes is indeed empty\n        EXPECT_TRUE(valid_checkpoint_hashes.empty());\n\n        try\n        {\n            // even though there is no checkpoint, it is still valid to request a view change, and thus possible to have a valid viewchange message\n            original_message.set_sender(this->pbft->get_uuid());\n            EXPECT_TRUE(this->pbft->is_valid_viewchange_message(viewchange_message, original_message));\n        }\n        catch(...)\n        {\n            FAIL() << \"is_valid_viewchange_message must not throw and exception simply because there are no valid checkpoints\";\n        }\n    }\n}\n"
  },
  {
    "path": "peers_beacon/CMakeLists.txt",
    "content": "add_library(peers_beacon STATIC\n        peer_address.hpp\n        peers_beacon_base.hpp\n        peers_beacon.cpp\n        peers_beacon.hpp\n        )\n\ntarget_link_libraries(peers_beacon utils)\ntarget_include_directories(peers_beacon PRIVATE ${BLUZELLE_STD_INCLUDES})\nadd_dependencies(peers_beacon boost openssl)\n\nadd_subdirectory(test)\n\n"
  },
  {
    "path": "peers_beacon/peer_address.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <string>\n\n\nnamespace bzn\n{\n    struct peer_address_t\n    {\n        peer_address_t(std::string host, uint16_t port, std::string name, std::string uuid)\n            : host(std::move(host))\n            , port(port)\n            , name(std::move(name))\n            , uuid(std::move(uuid))\n        {\n        };\n\n        bool operator==(const peer_address_t& other) const\n        {\n            if (&other == this)\n            {\n                return true;\n            }\n\n            return this->host == other.host && this->port == other.port && this->uuid == other.uuid;\n        }\n\n        std::string host;\n        uint16_t    port;\n        std::string name;\n        std::string uuid;\n    };\n}\n\nnamespace std\n{\n    template<> struct hash<bzn::peer_address_t>\n    {\n        size_t operator()(const bzn::peer_address_t& x) const noexcept\n        {\n            return std::hash<std::string>()(std::string{x.host} + std::to_string(x.port));\n        }\n    };\n}\n"
  },
  {
    "path": "peers_beacon/peers_beacon.cpp",
    "content": "// Copyright (C) 2019 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <fstream>\n#include <peers_beacon/peers_beacon.hpp>\n#include <include/bluzelle.hpp>\n#include <boost/format.hpp>\n\nusing namespace bzn;\n\npeers_beacon::peers_beacon(std::shared_ptr<bzn::asio::io_context_base> io, std::shared_ptr<bzn::utils_interface_base> utils, std::shared_ptr<bzn::options_base> opt)\n        : io(io)\n        , options(opt)\n        , utils(utils)\n        , internal_current(std::make_shared<peers_list_t>())\n        , refresh_timer(io->make_unique_steady_timer())\n{}\n\nvoid\npeers_beacon::start()\n{\n    if (!this->refresh(true))\n    {\n        throw std::runtime_error(\"could not construct initial peers list\");\n    }\n\n    this->run_timer();\n}\n\nvoid\npeers_beacon::run_timer()\n{\n    this->refresh_timer->cancel();\n    this->refresh_timer->expires_from_now(\n            std::chrono::seconds{\n                this->options->get_simple_options().get<uint64_t>(bzn::option_names::PEERS_REFRESH_INTERVAL_SECONDS)\n            });\n\n    this->refresh_timer->async_wait([weak_self = weak_from_this()](auto /*reason*/)\n                                    {\n                                        auto self = weak_self.lock();\n                                        if (self)\n                                        {\n                                            self->refresh();\n                                            self->check_removal();\n                                            self->run_timer();\n                                        }\n                                    });\n}\n\nstd::shared_ptr<const peers_list_t>\npeers_beacon::current() const\n{\n    std::shared_lock lock(this->lock);\n    return this->internal_current;\n}\n\nstd::shared_ptr<const ordered_peers_list_t>\npeers_beacon::ordered() const\n{\n    std::shared_lock lock(this->lock);\n    return this->internal_current_ordered;\n}\n\nvoid\npeers_beacon::check_removal()\n{\n    auto peers = this->current();\n    auto uuid = this->options->get_uuid();\n\n    bool in_swarm = peers->end() != std::find_if(peers->begin(), peers->end(),\n            [&uuid](const auto& peer)\n            {\n                return peer.uuid == uuid;\n            });\n\n    LOG(debug) << \"We are \" << (in_swarm ? \"\" : \"not \") << \"in this peers list\";\n\n\n    this->ever_been_in_swarm = this->ever_been_in_swarm || in_swarm;\n\n    if (!in_swarm && ever_been_in_swarm)\n    {\n        LOG(info) << \"we seem to have been removed from the swarm; exiting\";\n        this->io->stop();\n    }\n}\n\nbool\npeers_beacon::refresh(bool first_run)\n{\n    bool has_esr = !this->options->get_swarm_id().empty()\n            && !this->options->get_swarm_info_esr_address().empty()\n            && !this->options->get_swarm_info_esr_url().empty()\n            && !this->options->get_simple_options().get<bool>(bzn::option_names::IGNORE_ESR);\n    bool has_file = !this->options->get_bootstrap_peers_file().empty();\n    bool has_url = !this->options->get_bootstrap_peers_url().empty();\n    bool has_cpr = !this->options->get_simple_options().get<std::string>(bzn::option_names::CPR_URL).empty()\n            && !this->options->get_swarm_id().empty()\n            && !this->options->get_simple_options().get<bool>(bzn::option_names::IGNORE_CPR);\n\n    /* Here we chose not to fall back on another method if the first priority from our config is unavailable. This is\n     * chosen so that if, eg, a url based peers list is briefly unavailable, we do not abruptly switch to a very old\n     * peers list from an unmaintained esr contract.\n     */\n\n    if (has_cpr)\n    {\n        if(first_run)\n        {\n            LOG(info) << \"CPR chosen as peers source\";\n        }\n        return this->fetch_from_cpr();\n    }\n\n    if (has_esr)\n    {\n        if (first_run)\n        {\n            LOG(info) << \"ESR chosen as peers source\";\n        }\n        return this->fetch_from_esr();\n    }\n\n    if (has_url)\n    {\n        if (first_run)\n        {\n            LOG(info) << \"URL chosen as peers source\";\n        }\n        return this->fetch_from_configured_url();\n    }\n\n    if (has_file)\n    {\n        if (first_run)\n        {\n            LOG(info) << \"file chosen as peers source\";\n        }\n        return this->fetch_from_file();\n    }\n\n    throw std::runtime_error(\"no acceptable source for peers configured; must specify file or url or esr\");\n}\n\nbool\npeers_beacon::fetch_from_file()\n{\n    auto filename = this->options->get_bootstrap_peers_file();\n    std::ifstream file(filename);\n    if (file.fail())\n    {\n        LOG(error) << \"Failed to read bootstrap peers file \" << filename;\n        return false;\n    }\n\n    LOG(info) << \"Reading peers from \" << filename;\n\n    return parse_and_save_peers(file);\n}\n\nbool\npeers_beacon::fetch_from_configured_url()\n{\n    return this->fetch_from_url(this->options->get_bootstrap_peers_url());\n}\n\nbool\npeers_beacon::fetch_from_cpr()\n{\n    auto base_url = this->options->get_simple_options().get<std::string>(bzn::option_names::CPR_URL);\n    auto swarm_id = this->options->get_swarm_id();\n    boost::format fmt = boost::format(\"%1%/swarms/%2%\") % base_url % swarm_id;\n    return this->fetch_from_url(fmt.str());\n}\n\nbool\npeers_beacon::fetch_from_url(const std::string& url)\n{\n    std::string peers = this->utils->sync_req(url);\n\n    LOG(info) << \"Downloaded peer list from \" << url;\n\n    std::stringstream stream;\n    stream << peers;\n\n    return parse_and_save_peers(stream);\n}\n\nbool\npeers_beacon::fetch_from_esr()\n{\n    auto swarm_id = this->options->get_swarm_id();\n    auto esr_address = this->options->get_swarm_info_esr_address();\n    auto esr_url = this->options->get_swarm_info_esr_url();\n\n    peers_list_t new_peers;\n    auto peer_ids = this->utils->get_peer_ids(swarm_id, esr_address, esr_url);\n    for (const auto& peer_id : peer_ids)\n    {\n        bzn::peer_address_t peer_info{this->utils->get_peer_info(swarm_id, peer_id, esr_address, esr_url)};\n        if (peer_info.host.empty()\n            || peer_info.port == 0\n            //|| peer_info.name.empty() // is it important that a peer have a name?\n            || peer_info.uuid.empty()\n                )\n        {\n            LOG(warning) << \"Invalid peer information found in esr contract, ignoring info for peer: \" << peer_id << \" in swarm: \" << swarm_id;\n        }\n        else\n        {\n            new_peers.emplace(peer_info);\n        }\n    }\n\n    return this->switch_peers_list(new_peers);\n}\n\nbool\npeers_beacon::switch_peers_list(const peers_list_t& new_peers)\n{\n    if (new_peers.size() == 0)\n    {\n        LOG(error) << \"Failed to read any peers\";\n        if (this->internal_current->size() > 0)\n        {\n            LOG(error) << \"Keeping old peer list\";\n        }\n        else\n        {\n            LOG(error) << \"Old peers list also empty\";\n        }\n        return false;\n    }\n\n    if(*(this->internal_current) != new_peers)\n    {\n        LOG(info) << \"Switching to new peers list with \" << new_peers.size() << \" peers\";\n    }\n\n    auto new_ordered = std::make_shared<ordered_peers_list_t>();\n    std::for_each(new_peers.begin(), new_peers.end(),\n        [&](const auto& peer)\n        {\n            new_ordered->push_back(peer);\n        });\n\n    std::sort(new_ordered->begin(), new_ordered->end(),\n        [](const auto& peer1, const auto& peer2)\n        {\n            return peer1.uuid.compare(peer2.uuid) < 0;\n        });\n\n    std::unique_lock lock(this->lock);\n\n    this->internal_current = std::make_shared<const peers_list_t>(new_peers);\n    this->internal_current_ordered = new_ordered;\n\n    return true;\n}\n\nbool\npeers_beacon::parse_and_save_peers(std::istream& source)\n{\n    Json::Value root;\n\n    try\n    {\n        source >> root;\n    }\n    catch (const std::exception& e)\n    {\n        LOG(error) << \"Failed to parse peer JSON (\" << e.what() << \")\";\n        LOG(error) << \"Keeping old peer list\";\n        return false;\n    }\n\n    auto new_peers = this->build_peers_list_from_json(root);\n    return this->switch_peers_list(new_peers);\n}\n\npeers_list_t\npeers_beacon::build_peers_list_from_json(const Json::Value& root)\n{\n    peers_list_t result;\n\n    // Expect the read json to be an array of peer objects\n    for (const auto& peer : root)\n    {\n        std::string host;\n        std::string name;\n        std::string uuid;\n        uint16_t    port;\n\n        try\n        {\n            host = peer[\"host\"].asString();\n            port = peer[\"port\"].asUInt();\n            uuid = peer.isMember(\"uuid\") ? peer[\"uuid\"].asString() : \"unknown\";\n            name = peer.isMember(\"name\") ? peer[\"name\"].asString() : \"unknown\";\n        }\n        catch(std::exception& e)\n        {\n            LOG(warning) << \"Ignoring malformed peer specification \" << peer;\n            continue;\n        }\n\n        // port wasn't actually a 16 bit uint\n        if (peer[\"port\"].asUInt() != port)\n        {\n            LOG(warning) << \"Ignoring peer with bad port \" << peer;\n            continue;\n        }\n\n        // peer didn't contain everything we need\n        if (host.empty() || port == 0)\n        {\n            LOG(warning) << \"Ignoring underspecified peer (needs host and port) \" << peer;\n            continue;\n        }\n\n        LOG(trace) << \"Found peer \" << host << \":\" << port << \" (\" << name << \")\";\n\n        result.emplace(host, port, name, uuid);\n    }\n\n    LOG(trace) << \"Found \" << result.size() << \" well formed peers\";\n    return result;\n}\n"
  },
  {
    "path": "peers_beacon/peers_beacon.hpp",
    "content": "// Copyright (C) 2019 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n#include <options/options_base.hpp>\n#include <peers_beacon/peers_beacon_base.hpp>\n#include <peers_beacon/peer_address.hpp>\n#include <include/boost_asio_beast.hpp>\n#include <utils/utils_interface_base.hpp>\n#include <shared_mutex>\n\nnamespace bzn\n{\n    class peers_beacon : public peers_beacon_base, public std::enable_shared_from_this<peers_beacon>\n    {\n    public:\n        peers_beacon(std::shared_ptr<bzn::asio::io_context_base> io, std::shared_ptr<bzn::utils_interface_base> utils, std::shared_ptr<bzn::options_base> opt);\n\n        // do an initial pull and start any necessary timers\n        void start() override;\n\n        // get a pointer to the current peers list (which won't change, but can be replaced at any time)\n        std::shared_ptr<const peers_list_t> current() const override;\n\n        std::shared_ptr<const ordered_peers_list_t> ordered() const override;\n\n        // refresh from whatever source we are using\n        bool refresh(bool first_run = false) override;\n\n        void check_removal();\n\n    private:\n\n        bool fetch_from_esr();\n        bool fetch_from_file();\n        bool fetch_from_configured_url();\n        bool fetch_from_cpr();\n\n        bool fetch_from_url(const std::string& url);\n\n        bool parse_and_save_peers(std::istream& source);\n        peers_list_t build_peers_list_from_json(const Json::Value& root);\n\n        bool switch_peers_list(const peers_list_t& new_peers);\n\n        void run_timer();\n\n        bool ever_been_in_swarm = false;\n\n        std::shared_ptr<bzn::asio::io_context_base> io;\n\n        std::shared_ptr<bzn::options_base> options;\n        std::shared_ptr<bzn::utils_interface_base> utils;\n\n        // this is kept as a shared ptr to avoid issues when a reader reads while the peers list changes\n        std::shared_ptr<const peers_list_t> internal_current;\n        std::shared_ptr<const ordered_peers_list_t> internal_current_ordered;\n\n        std::unique_ptr<bzn::asio::steady_timer_base> refresh_timer;\n\n        mutable std::shared_mutex lock;\n    };\n}\n\n"
  },
  {
    "path": "peers_beacon/peers_beacon_base.hpp",
    "content": "// Copyright (C) 2019 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n#include <peers_beacon/peer_address.hpp>\n#include <memory>\n#include <unordered_set>\n#include <vector>\n\nnamespace bzn\n{\n    using peers_list_t = std::unordered_set<bzn::peer_address_t>;\n    using ordered_peers_list_t = std::vector<bzn::peer_address_t>;\n\n    class peers_beacon_base\n    {\n    public:\n        virtual void start() = 0;\n\n        // get a pointer to the current peers list (which won't change, but can be replaced at any time)\n        virtual std::shared_ptr<const peers_list_t> current() const = 0;\n\n        virtual std::shared_ptr<const ordered_peers_list_t> ordered() const = 0;\n\n        // refresh from whatever source we are using; return success\n        virtual bool refresh(bool first_run = false) = 0;\n\n        virtual ~peers_beacon_base() = default;\n    };\n}\n"
  },
  {
    "path": "peers_beacon/test/CMakeLists.txt",
    "content": "set(test_srcs peers_beacon_tests.cpp)\nset(test_libs peers_beacon utils options smart_mocks)\n\nadd_gmock_test(peers_beacon)\n"
  },
  {
    "path": "peers_beacon/test/peers_beacon_tests.cpp",
    "content": "// Copyright (C) 2019 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <peers_beacon/peers_beacon.hpp>\n#include <mocks/mock_options_base.hpp>\n#include <mocks/smart_mock_io.hpp>\n#include <mocks/mock_utils_interface.hpp>\n#include <fstream>\n#include <string>\n#include <gtest/gtest.h>\n\nnamespace\n{\n    const std::string invalid_json = \"[{\\\"Some key\\\": 124}, }}[} oh noes I broke it\";\n    const std::string no_peers = \"[]\";\n    const std::string valid_peers = \"[{\\\"name\\\": \\\"peer1\\\", \\\"host\\\": \\\"peer1.com\\\", \\\"port\\\": 12345, \\\"http_port\\\" : 8080}, {\\\"host\\\": \\\"nonamepeer.com\\\", \\\"port\\\": 54321}]\";\n    const std::string different_valid_peer = \"[{\\\"name\\\": \\\"peer3\\\", \\\"host\\\": \\\"peer3.com\\\", \\\"port\\\": 12345, \\\"http_port\\\" : 8080}]\";\n    const std::string duplicate_peers = \"[{\\\"name\\\": \\\"peer1\\\", \\\"host\\\": \\\"peer1.com\\\", \\\"port\\\": 12345, \\\"http_port\\\" : 8080}, {\\\"name\\\": \\\"peer1\\\", \\\"host\\\": \\\"peer1.com\\\", \\\"port\\\": 12345}]\";\n    const std::string underspecified_peer = \"[{\\\"name\\\": \\\"peer1\\\", \\\"port\\\": 1024}]\";\n    const std::string bad_port = \"[{\\\"name\\\": \\\"peer1\\\", \\\"host\\\": \\\"127.0.0.1\\\", \\\"port\\\": 70000}]\";\n    const std::string test_peers_filename = \"peers.json\";\n\n    const std::string our_uuid = \"alice\";\n    const std::string peers_with_us = \"[{\\\"host\\\": \\\"peer1.com\\\", \\\"port\\\": 12345, \\\"uuid\\\" : \\\"alice\\\"}]\";\n    const std::string peers_without_us = \"[{\\\"host\\\": \\\"peer1.com\\\", \\\"port\\\": 12345, \\\"uuid\\\" : \\\"not alice\\\"}]\";\n\n    const std::string sample_peers_url = \"pastebin.com/raw/KvbcVhfZ\";\n    const std::string sample_peers_url_with_protocol = \"http://www.pastebin.com/raw/KvbcVhfZ\";\n}\n\nusing namespace ::testing;\n\nclass peers_beacon_test : public Test\n{\npublic:\n    std::shared_ptr<bzn::mock_options_base> opt = std::make_shared<bzn::mock_options_base>();\n    bzn::simple_options inner_opt;\n    std::shared_ptr<bzn::asio::smart_mock_io> io = std::make_shared<bzn::asio::smart_mock_io>();\n    std::shared_ptr<bzn::peers_beacon> peers;\n    std::shared_ptr<bzn::mock_utils_interface_base> utils = std::make_shared<bzn::mock_utils_interface_base>();\n\n    peers_beacon_test()\n    {\n        EXPECT_CALL(*opt, get_bootstrap_peers_file()).WillRepeatedly(Return(test_peers_filename));\n        EXPECT_CALL(*opt, get_bootstrap_peers_url()).WillRepeatedly(Return(\"\"));\n        EXPECT_CALL(*opt, get_swarm_id()).WillRepeatedly(Return(\"\"));\n        this->inner_opt.set(bzn::option_names::PEERS_REFRESH_INTERVAL_SECONDS, \"60\");\n        EXPECT_CALL(*opt, get_simple_options()).WillRepeatedly(ReturnRef(this->inner_opt));\n        EXPECT_CALL(*opt, get_uuid()).WillRepeatedly(Return(our_uuid));\n\n        this->peers = std::make_shared<bzn::peers_beacon>(this->io, this->utils, this->opt);\n    }\n\n    void set_peers_file(const std::string& peers_data)\n    {\n        std::ofstream ofile(test_peers_filename);\n        ofile << peers_data;\n        ofile.close();\n    }\n\n    ~peers_beacon_test()\n    {\n        unlink(test_peers_filename.c_str());\n    }\n};\n\nTEST_F(peers_beacon_test, test_invalid_json)\n{\n    set_peers_file(invalid_json);\n    ASSERT_FALSE(peers->refresh());\n    ASSERT_TRUE(peers->current()->empty());\n}\n\n\nTEST_F(peers_beacon_test, test_no_peers)\n{\n    set_peers_file(no_peers);\n    ASSERT_FALSE(peers->refresh());\n    ASSERT_TRUE(peers->current()->empty());\n}\n\n\nTEST_F(peers_beacon_test, test_underspecified_peer)\n{\n    set_peers_file(underspecified_peer);\n    ASSERT_FALSE(peers->refresh());\n    ASSERT_TRUE(peers->current()->empty());\n}\n\n\nTEST_F(peers_beacon_test, test_bad_port)\n{\n    set_peers_file(bad_port);\n    ASSERT_FALSE(peers->refresh());\n    ASSERT_TRUE(peers->current()->empty());\n}\n\n\nTEST_F(peers_beacon_test, test_valid_peers)\n{\n    set_peers_file(valid_peers);\n    ASSERT_TRUE(peers->refresh());\n    ASSERT_EQ(peers->current()->size(), 2U);\n\n    bool seen_peer1 = false;\n    bool seen_peer2 = false;\n\n    for (const bzn::peer_address_t& p : *(peers->current()))\n    {\n        if (p.port == 12345) seen_peer1 = true;\n        if (p.port == 54321) seen_peer2 = true;\n    }\n\n    ASSERT_TRUE(seen_peer1 && seen_peer2);\n}\n\nTEST_F(peers_beacon_test, test_unnamed_peers)\n{\n    set_peers_file(valid_peers);\n    ASSERT_TRUE(peers->refresh());\n    ASSERT_EQ(peers->current()->size(), 2U);\n\n    bool seen_name1 = false;\n    bool seen_name2 = false;\n\n    for (const bzn::peer_address_t& p : *(peers->current()))\n    {\n        if (p.name == \"peer1\") seen_name1 = true;\n        if (p.name == \"unknown\") seen_name2 = true;\n    }\n\n    ASSERT_TRUE(seen_name1 && seen_name2);\n}\n\n\nTEST_F(peers_beacon_test, test_duplicate_peers)\n{\n    set_peers_file(duplicate_peers);\n    ASSERT_TRUE(peers->refresh());\n    ASSERT_EQ(peers->current()->size(), 1U);\n}\n\nTEST_F(peers_beacon_test, test_changed_list)\n{\n    set_peers_file(valid_peers);\n    ASSERT_TRUE(peers->refresh());\n    ASSERT_EQ(peers->current()->size(), 2U);\n\n    set_peers_file(different_valid_peer);\n    ASSERT_TRUE(peers->refresh());\n    ASSERT_EQ(peers->current()->size(), 1U);\n}\n\nTEST_F(peers_beacon_test, test_automatic_refresh)\n{\n    set_peers_file(valid_peers);\n    peers->start();\n    ASSERT_EQ(peers->current()->size(), 2U);\n\n    set_peers_file(different_valid_peer);\n    this->io->trigger_timer(0);\n\n    ASSERT_EQ(peers->current()->size(), 1U);\n\n}\n\nTEST_F(peers_beacon_test, test_url)\n{\n    const std::string test_url = \"some fake url\";\n    EXPECT_CALL(*(this->opt), get_bootstrap_peers_url()).WillRepeatedly(Return(test_url));\n    EXPECT_CALL(*(this->opt), get_bootstrap_peers_file()).WillRepeatedly(Return(\"\"));\n    EXPECT_CALL(*(this->utils), sync_req(test_url, \"\")).WillRepeatedly(Return(valid_peers));\n\n    ASSERT_TRUE(peers->refresh());\n    ASSERT_EQ(peers->current()->size(), 2U);\n}\n\nTEST_F(peers_beacon_test, cpr_fetch_constructs_correct_endpoint)\n{\n    const std::string test_url = \"https://example.org\";\n    const std::string test_swarm_id = \"the_best_swarm_to_ever_swarm_this_side_of_the_mississippi\";\n    const std::string correct_url = test_url + \"/swarms/\" + test_swarm_id;\n\n    EXPECT_CALL(*(this->opt), get_swarm_id()).WillRepeatedly(Return(test_swarm_id));\n    this->inner_opt.set(bzn::option_names::CPR_URL, test_url);\n\n    EXPECT_CALL(*(this->utils), sync_req(correct_url, \"\")).Times(Exactly(1)).WillOnce(Return(valid_peers));\n    ASSERT_TRUE(peers->refresh());\n}\n\nTEST_F(peers_beacon_test, test_esr)\n{\n    bzn::peer_address_t alice(\"alice.com\", 8080, \"alice\", \"alice's key\");\n\n    bzn::uuid_t swarm_id = \"foo\";\n    std::string esr_address = \"bar\";\n    std::string esr_url = \"example.tld\";\n\n    this->inner_opt.set(bzn::option_names::IGNORE_CPR, \"true\");\n\n    EXPECT_CALL(*(this->opt), get_bootstrap_peers_url()).WillRepeatedly(Return(\"\"));\n    EXPECT_CALL(*(this->opt), get_bootstrap_peers_file()).WillRepeatedly(Return(\"\"));\n\n    EXPECT_CALL(*(this->opt), get_swarm_id()).WillRepeatedly(Return(swarm_id));\n    EXPECT_CALL(*(this->opt), get_swarm_info_esr_address()).WillRepeatedly(Return(esr_address));\n    EXPECT_CALL(*(this->opt), get_swarm_info_esr_url()).WillRepeatedly(Return(esr_url));\n\n    EXPECT_CALL(*(this->utils), get_peer_ids(swarm_id, esr_address, esr_url)).WillRepeatedly(Return(std::vector<std::string>{\"alice\"}));\n    EXPECT_CALL(*(this->utils), get_peer_info(swarm_id, \"alice\", esr_address, esr_url)).WillRepeatedly(Invoke(\n            [&](auto, auto, auto, auto)\n            {\n                return alice;\n            }\n            ));\n\n    ASSERT_TRUE(peers->refresh());\n    ASSERT_EQ(peers->current()->size(), 1U);\n    ASSERT_EQ(peers->ordered()->front().name, \"alice\");\n}\n\nTEST_F(peers_beacon_test, test_halt)\n{\n    EXPECT_CALL(*(this->io), stop()).Times(Exactly(0));\n    set_peers_file(peers_without_us);\n\n    ASSERT_TRUE(peers->refresh());\n    peers->check_removal();\n\n    set_peers_file(peers_with_us);\n\n    ASSERT_TRUE(peers->refresh());\n    peers->check_removal();\n\n\n    set_peers_file(peers_without_us);\n    EXPECT_CALL(*(this->io), stop()).Times(Exactly(1));\n\n    ASSERT_TRUE(peers->refresh());\n    peers->check_removal();\n}\n\n"
  },
  {
    "path": "pkg/CMakeLists.txt",
    "content": "if (UNIX AND NOT APPLE)\n    install(PROGRAMS  \"${PROJECT_BINARY_DIR}/output/swarm\" DESTINATION \"/usr/bin/\")\n\n    find_program(LSB_RELEASE lsb_release)\n    execute_process(COMMAND ${LSB_RELEASE} -is\n        OUTPUT_VARIABLE LSB_RELEASE_ID_SHORT\n        OUTPUT_STRIP_TRAILING_WHITESPACE\n    )\n    if (${LSB_RELEASE_ID_SHORT} STREQUAL \"Ubuntu\")\n        add_subdirectory(debian)\n    endif()\nendif()\n"
  },
  {
    "path": "pkg/debian/CMakeLists.txt",
    "content": "message( \"Building version: ${PROJECT_VERSION}...\" )\n\nset(BOOST_DEB_VERSION \"${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}\")\n\nset(CPACK_PACKAGE_VENDOR              \"Bluzelle\")\nset(CPACK_PACKAGE_CONTACT             \"devops@bluzelle.com\")\nset(CPACK_PACKAGE_DESCRIPTION_SUMMARY \"Bluzelle decentralized database node.\")\nset(CPACK_PACKAGE_NAME                \"bluzelle-swarmdb\")\nset(CPACK_PACKAGE_VERSION             ${PROJECT_VERSION})\nset(CPACK_PACKAGE_VERSION_MAJOR       ${PROJECT_VERSION_MAJOR})\nset(CPACK_PACKAGE_VERSION_MINOR       ${PROJECT_VERSION_MINOR})\nset(CPACK_PACKAGE_VERSION_PATCH       ${PROJECT_VERSION_PATCH})\nset(CPACK_DEBIAN_PACKAGE_SECTION      \"database\")\nset(CPACK_DEBIAN_COMPRESSION_TYPE     \"none\")\n\nset(CPACK_SYSTEM_NAME                 \"amd64\")\nset(CPACK_DEBIAN_PACKAGE_ARCHITECTURE \"amd64\")\n\nset(CPACK_DEBIAN_PACKAGE_PRIORITY     \"optional\")\nset(CPACK_DEBIAN_PACKAGE_MAINTAINER   \"Bluzelle <devops@bluzelle.com>\")\nset(CPACK_GENERATOR                   \"DEB\")\nset(CPACK_PACKAGE_FILE_NAME            ${CPACK_PACKAGE_NAME}_${PROJECT_VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE})\nset(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA ${PROJECT_SOURCE_DIR}/pkg/debian/postinst;${PROJECT_SOURCE_DIR}/pkg/debian/postrm)\nset(CPACK_DEBIAN_PACKAGE_DEPENDS      \"libc6, libsnappy1v5, libbz2-1.0\")\n\nINCLUDE(CPack)\n\nset(DESTINATION_DIR /usr/bin/swarmdb)\n\n# for 16.04\nexecute_process(COMMAND chmod 755 ${PROJECT_SOURCE_DIR}/pkg/debian/postinst)\nexecute_process(COMMAND chmod 755 ${PROJECT_SOURCE_DIR}/pkg/debian/postrm)\n"
  },
  {
    "path": "pkg/debian/postinst",
    "content": "#! /bin/sh\n\nset -e\n\necho \"   _____                              ____  ____\"\necho \"  / ___/      ______ __________ ___  / __ \\/ __ )\"\necho \"  \\\\__ \\\\ | /| / / __ \\`/ ___/ __ \\`__ \\\\/ / / / __  |\"\necho \" ___/ / |/ |/ / /_/ / /  / / / / / / /_/ / /_/ /\"\necho \"/____/|__/|__/\\__,_/_/  /_/ /_/ /_/_____/_____/\"\necho \"\\n\\n\"\necho \"SwarmDB node successfully installed.\\n\\n\"\necho \"You can find the SwarmDB docs at:\"\necho \"https://github.com/swarmdb\"\n"
  },
  {
    "path": "pkg/debian/postrm",
    "content": "#! /bin/sh\n\nset -e\n\nrm -f /usr/bin/swarm"
  },
  {
    "path": "policy/CMakeLists.txt",
    "content": "add_library(policy STATIC\n        eviction_base.hpp\n        random.cpp\n        volatile_ttl.cpp\n        )\n\nadd_dependencies(policy proto)\n\ntarget_include_directories(policy PRIVATE ${BLUZELLE_STD_INCLUDES})\n\nadd_subdirectory(test)\n"
  },
  {
    "path": "policy/eviction_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <include/bluzelle.hpp>\n#include <proto/database.pb.h>\n#include <storage/storage_base.hpp>\n#include <set>\n\nnamespace bzn::policy\n{\n\n    class eviction_base\n    {\n    public:\n        eviction_base(std::shared_ptr<bzn::storage_base> storage) : storage{std::move(storage)} {}\n\n        virtual ~eviction_base() = default;\n\n        virtual std::set<bzn::key_t> keys_to_evict(const database_msg& request, size_t max_size) = 0;\n\n        std::shared_ptr<bzn::storage_base> storage;\n    };\n} // namespace bzn::crud::eviction\n"
  },
  {
    "path": "policy/random.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <policy/random.hpp>\n#include <proto/database.pb.h>\n#include <boost/src/boost/include/boost/random/mersenne_twister.hpp>\n#include <boost/src/boost/include/boost/random/uniform_int_distribution.hpp>\n\nnamespace bzn::policy\n{\n    std::set<bzn::key_t>\n    random::keys_to_evict(const database_msg &request, size_t max_size)\n    {\n        const auto KEY_VALUE_SIZE{\n            request.has_update()\n            ? request.update().value().size()\n            : request.create().key().size() + request.create().value().size()\n        };\n\n        const bzn::key_t IGNORE_KEY{\n            request.has_update()\n            ? request.update().key()\n            : \"\"\n        };\n\n        const auto size{this->storage->get_size(request.header().db_uuid()).second};\n        size_t storage_to_free{KEY_VALUE_SIZE - (max_size - size)};\n\n        // We may need to remove one or more key/value pairs to make room for the new one\n        std::hash<std::string> hasher;\n        boost::random::mt19937 mt(hasher(request.header().request_hash()));\n\n        std::vector<bzn::key_t> keys_to_evict;\n        auto available_keys = this->storage->get_keys(request.header().db_uuid());\n        while (storage_to_free && !available_keys.empty())\n        {\n            // As we randomly select a key from the keys in the user's database, we *move* them from the vector of keys\n            // in the users' database to the vector of keys that need to be deleted. In the case of randomly selected\n            // the key that is being updated, we simnply remove that key from the vector of users' keys without putting\n            // it in the keys to delete.\n            const boost::random::uniform_int_distribution<> dist(0, available_keys.size() - 1);\n            const auto it = std::next(available_keys.begin(), dist(mt));\n            if (*it != IGNORE_KEY)\n            {\n                const auto evicted_size = this->storage->get_key_size(request.header().db_uuid(), *it);\n                if (evicted_size.has_value())\n                {\n                    std::move(it, std::next(it,1), std::back_inserter(keys_to_evict));\n                    storage_to_free -= *evicted_size < storage_to_free ? *evicted_size : storage_to_free;\n                }\n                else\n                {\n                    LOG(warning) << \"While searching for keys to evict, the key \" << *it << \" was not found in the database \" <<  request.header().db_uuid();\n                }\n            }\n            available_keys.erase(it, std::next(it,1));\n        }\n\n        // Did we free enough storage?\n        if (!storage_to_free)\n        {\n            // It would have been nice to move the keys into the set directly, but std::move doesn't move from vector to set\n\n            return std::set<bzn::key_t>(keys_to_evict.begin(), keys_to_evict.end());\n        }\n\n        return std::set<bzn::key_t>{};\n    }\n} // namespace bzn::crud::eviction\n"
  },
  {
    "path": "policy/random.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <policy/eviction_base.hpp>\n\nnamespace bzn::policy\n{\n    class random : public eviction_base\n    {\n    public:\n        random(std::shared_ptr<bzn::storage_base> storage) : eviction_base{storage}\n        {\n        }\n\n        std::set<bzn::key_t> keys_to_evict(const database_msg& request, size_t max_size);\n    };\n}\n"
  },
  {
    "path": "policy/test/CMakeLists.txt",
    "content": "set(test_srcs eviction_test.cpp)\n\nset(test_libs policy proto storage ${Protobuf_LIBRARIES})\n\nadd_gmock_test(policy)\n"
  },
  {
    "path": "policy/test/eviction_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <storage/mem_storage.hpp>\n#include <googletest/src/googletest/include/gtest/gtest.h>\n#include <policy/volatile_ttl.hpp>\n#include <crud/crud.hpp>\n#include <mocks/mock_node_base.hpp>\n#include <mocks/mock_session_base.hpp>\n#include <mocks/mock_subscription_manager_base.hpp>\n#include <mocks/mock_boost_asio_beast.hpp>\n\nusing namespace ::testing;\n\nnamespace\n{\n    const char* DB_UUID{\"e6d16cab-cd0f-4af1-b45d-16de9bc2af5d\"};\n    //const char* CALLER_UUID{\"9558fa26-ba03-4e24-98bc-1f2f562c4598\"};\n    // 2b3c2de4-5c14-4842-8284-b67eb09ec61d\n    // bf90f8d1-cb27-4217-a5c5-85c8e6565a25\n    // 557bab19-8df2-4731-b74e-c2516e1f580f\n\n    const std::string TTL_UUID{\"TTL\"};\n\n    database_msg\n    make_create_request(const bzn::uuid_t& db_uuid, const bzn::key_t key, const bzn::value_t& value)\n    {\n        database_msg request;\n\n        auto header = new database_header();\n        header->set_db_uuid(db_uuid);\n\n        auto create = new database_create();\n        create->set_key(key);\n        create->set_value(value);\n\n        request.set_allocated_create(create);\n        request.set_allocated_header(header);\n\n        return request;\n    }\n\n\n    database_msg\n    make_update_request(const bzn::uuid_t& db_uuid, const bzn::key_t key, const bzn::value_t& value)\n    {\n        database_msg request;\n\n        auto header = new database_header();\n        header->set_db_uuid(db_uuid);\n\n        auto update = new database_update();\n        update->set_key(key);\n        update->set_value(value);\n\n        request.set_allocated_update(update);\n        request.set_allocated_header(header);\n\n        return request;\n    }\n\n\n    // TODO: This is duplication of private code in storage, it may be a good idea to find a way\n    // to dry this up\n    bzn::key_t\n    generate_expire_key(const bzn::uuid_t& uuid, const bzn::key_t& key)\n    {\n        Json::Value value;\n\n        value[\"uuid\"] = uuid;\n        value[\"key\"] = key;\n\n        return value.toStyledString();\n    }\n\n\n    size_t\n    insert_test_values(std::shared_ptr<bzn::storage_base> storage, const bzn::uuid_t& db_uuid, size_t number_of_items, size_t value_size=128)\n    {\n        for (size_t i{0}; i<number_of_items; ++i)\n        {\n            std::string key{\"key\" + std::to_string(i)};\n            storage->create( db_uuid, key, std::string(value_size, 'B'));\n        }\n\n        return storage->get_size(db_uuid).second;\n    }\n\n\n    void\n    insert_ttl_values(std::shared_ptr<bzn::storage_base> storage, const bzn::uuid_t& db_uuid, const std::vector<bzn::key_t> keys)\n    {\n        size_t i{0};\n        for (const auto& key : keys)\n        {\n            const auto expires = boost::lexical_cast<std::string>(\n                    std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch()).count() + 1024 + i * 1024);\n            ++i;\n            storage->create(TTL_UUID, generate_expire_key(db_uuid,key), expires);\n        }\n    }\n}\n\nnamespace bzn\n{\n    TEST(policy_test, test_that_volatile_ttl_ignores_keys_with_no_ttl)\n    {\n        std::shared_ptr<bzn::storage_base> storage{std::make_shared<bzn::mem_storage>()};\n        const auto MAX_DB_SIZE{insert_test_values(storage, DB_UUID, 10) + 5};\n        policy::volatile_ttl sut(storage);\n\n        // performing a create on a db with no TTLs should return no keys to delete\n        {\n            const auto request{make_create_request(DB_UUID, \"testvalue\", std::string(256, 'C'))};\n            const auto keys_to_delete{sut.keys_to_evict(request, MAX_DB_SIZE)};\n            EXPECT_EQ(size_t(0), keys_to_delete.size());\n        }\n\n        // Update should behave the same way\n        {\n            const auto request{make_update_request(DB_UUID, \"testvalue\", std::string(256,'C'))};\n            const auto keys_to_delete{sut.keys_to_evict(request, MAX_DB_SIZE)};\n            EXPECT_EQ( size_t(0), keys_to_delete.size());\n        }\n    }\n\n    TEST(policy_test, test_that_volatile_ttl_returns_only_keys_with_ttl)\n    {\n        std::shared_ptr<bzn::storage_base> storage{std::make_shared<bzn::mem_storage>()};\n\n        const size_t NUMBER_OF_ITEMS{10};\n        const size_t VALUE_SIZE{128};\n        const auto MAX_STORAGE{insert_test_values(storage, DB_UUID, NUMBER_OF_ITEMS, VALUE_SIZE)};\n\n        const bzn::key_t TEST_KEY{\"key1\"};\n        std::vector<bzn::key_t> keys{TEST_KEY};\n        insert_ttl_values(storage, DB_UUID, keys);\n\n        policy::volatile_ttl sut(storage);\n\n        const bzn::value_t TEST_VALUE{std::string(64, 'B')};\n\n        // evict the one ttl key to make room for the created key value pair\n        {\n            auto request{make_create_request(DB_UUID, \"KEY_CREATE\", TEST_VALUE)};\n            const auto keys_to_delete{sut.keys_to_evict(request, MAX_STORAGE)};\n            EXPECT_EQ(size_t(1), keys_to_delete.size());\n            EXPECT_EQ(TEST_KEY, *keys_to_delete.begin());\n        }\n\n        // evict the one ttl key to make room for the updated key value pair\n        {\n            auto request{make_update_request(DB_UUID, \"KEY_UPDATE\", TEST_VALUE)};\n            const auto keys_to_delete{sut.keys_to_evict(request, MAX_STORAGE)};\n            EXPECT_EQ(size_t(1), keys_to_delete.size());\n            EXPECT_EQ(TEST_KEY, *keys_to_delete.begin());\n        }\n    }\n\n    TEST(policy_test, test_that_volatile_ttl_fails_if_there_are_not_enough_ttl_values_to_remove)\n    {\n        std::shared_ptr<bzn::storage_base> storage{std::make_shared<bzn::mem_storage>()};\n\n        const size_t NUMBER_OF_ITEMS{10};\n\n        const size_t VALUE_SIZE{128};\n        const auto MAX_STORAGE{insert_test_values(storage, DB_UUID, NUMBER_OF_ITEMS, VALUE_SIZE) + 5};\n\n        // set only one TTL value\n        const bzn::key_t TEST_KEY{\"key1\"};\n        std::vector<bzn::key_t> keys{TEST_KEY};\n        insert_ttl_values(storage, DB_UUID, keys);\n\n        policy::volatile_ttl sut(storage);\n\n        // try creating a large value, this must fail as there is only one small key value pair with a TTL\n        // (return no keys to evict)\n        {\n            auto request{make_create_request(DB_UUID, \"KEY_CREATE\", std::string(2 * VALUE_SIZE, 'B'))};\n            const auto keys_to_delete{sut.keys_to_evict(request, MAX_STORAGE)};\n            EXPECT_EQ(size_t(0), keys_to_delete.size());\n        }\n\n        // try updating an existing value by doubling its size. This must fail (ibid)\n        {\n            auto request{make_update_request(DB_UUID, \"KEY_CREATE\", std::string(2 * VALUE_SIZE, 'B'))};\n            const auto keys_to_delete{sut.keys_to_evict(request, MAX_STORAGE)};\n            EXPECT_EQ(size_t(0), keys_to_delete.size());\n        }\n\n        // try updating the key with a TTL, this must fail (the only key with a ttl is the key we are updating.)\n        {\n            auto request{make_update_request(DB_UUID, TEST_KEY, std::string(2 * VALUE_SIZE, 'B'))};\n            const auto keys_to_delete{sut.keys_to_evict(request, MAX_STORAGE)};\n            EXPECT_EQ(size_t(0), keys_to_delete.size());\n        }\n    }\n}\n"
  },
  {
    "path": "policy/volatile_ttl.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <policy/volatile_ttl.hpp>\n#include <boost/src/boost/include/boost/lexical_cast.hpp>\n\nnamespace\n{\n    // TODO: This is a duplicate of code in crud, it would be a good idea to find a way to dry this up.\n    const std::string TTL_UUID{\"TTL\"};\n}\n\n\nnamespace bzn::policy\n{\n    struct ttl_item {bzn::key_t key; size_t value_size; size_t ttl;};\n\n    std::set<bzn::key_t>\n    volatile_ttl::keys_to_evict(const database_msg &request, size_t max_db_size)\n    {\n        const auto db_uuid{request.header().db_uuid()};\n        const auto key_to_ignore{request.has_update() ? request.update().key() : \"\" };\n\n        // get all the TTL's in storage\n        auto all_ttls{this->storage->get_keys(TTL_UUID)};\n\n        // get the TTL's associated with our database\n        // filter out the ones for this database, if update, ignore current key\n        auto our_ttls{this->filter_ttls(all_ttls, db_uuid, key_to_ignore)};\n        if (our_ttls.empty())\n        {\n            return {};\n        }\n\n        // Create a vector of [key, value size, ttl]\n        std::vector<ttl_item> ttl_items{get_ttl_items(db_uuid, our_ttls)};\n\n        // 3: sort the keys in order of increasing ttl, secondarily sort on decreasing\n        // key value size\n        std::sort(ttl_items.begin(), ttl_items.end(),\n            [](const auto& a, const auto& b)\n            {\n                return a.value_size > b.value_size;\n            });\n\n        // 4: from the top of the list of keys pull out enough key value pairs\n        //    to make room for the new pair or update,\n        const auto current_db_size{this->storage->get_size(request.header().db_uuid()).second};\n        const auto current_free = (max_db_size - current_db_size) - (request.has_update() ? request.update().value().size() : 0);\n        const auto key_value_size {\n            request.has_update()\n            ? request.update().value().size()\n            : request.create().key().size() + request.create().value().size()\n        };\n\n        // how much room do we need to free?\n        //  enough for the new key value pair:  key_value_size\n        // How much room do we have? -> current_free\n        // How much do we need to free? -> required_size\n        std::set<bzn::key_t> keys_to_evict;\n        auto required_size = key_value_size - current_free;\n        for (const auto ttl : ttl_items)\n        {\n            keys_to_evict.emplace(ttl.key);\n            required_size -= (ttl.value_size < required_size ? ttl.value_size : required_size);\n            if (!required_size)\n            {\n                break;\n            }\n        }\n\n        // fail if we can't make enough room\n        if (required_size)\n        {\n            keys_to_evict.clear();\n        }\n\n        // 5: return the list of keys to delete\n        return keys_to_evict;\n    }\n\n\n    std::vector<ttl_item>\n    volatile_ttl::get_ttl_items(const std::string &db_uuid, std::vector<std::string> &our_ttls) const\n    {\n        std::vector<ttl_item> ttl_items;\n        std::unique_ptr<Json::CharReader> char_reader{ Json::CharReaderBuilder().newCharReader() };\n        std::transform(our_ttls.begin(), our_ttls.end(), std::back_inserter(ttl_items),\n            [&](const auto& ttl)->ttl_item\n            {\n                Json::Value root;\n                std::string err;\n                if (char_reader->parse(ttl.c_str(), ttl.c_str() + ttl.size(), &root, &err))\n                {\n                    const auto key{root[\"key\"].asString()};\n                    const auto expire_key{this->generate_expire_key(db_uuid, key)};\n                    const auto opt_expire{storage->read(TTL_UUID, expire_key)};\n                    const auto opt_value{storage->read(db_uuid, key)};\n\n                    if (!opt_value.has_value())\n                    {\n                        LOG (warning) << \"item with key:[\" << key << \"] does not exist in db: [\" <<  db_uuid << \"]\";\n\n                        return ttl_item{\"\", 0 , 0};\n                    }\n\n                    if (!opt_expire.has_value())\n                    {\n                        LOG (warning) << \"TTL item with key:[\" << expire_key << \"] does not exist\";\n\n                        return ttl_item{\"\", 0, 0};\n                    }\n\n                    LOG (info) << \"Found an item to evict: [\" << key << \"]\" ;\n\n                    return ttl_item{\n                        key\n                        , opt_value.value().size()\n                        , boost::lexical_cast<uint64_t>(opt_expire.value())\n                    };\n                }\n                LOG(warning) << \"Unable to parse TTL for Volatile TTL eviction: \" << err;\n\n                return ttl_item{\"\", 0 , 0};\n            });\n\n        return ttl_items;\n    }\n\n\n    std::vector<std::string>\n    volatile_ttl::filter_ttls(const std::vector<std::string>& ttls, const bzn::uuid_t& db_uuid, const bzn::key_t& ignore_key)\n    {\n        std::vector<std::string> filtered_ttls;\n        std::unique_ptr<Json::CharReader> char_reader{ Json::CharReaderBuilder().newCharReader()};\n        std::copy_if(\n                ttls.begin(), ttls.end(), std::back_inserter(filtered_ttls)\n                , [&char_reader, &db_uuid, &ignore_key](const auto& t)\n                {\n                    Json::Value root;\n                    std::string err;\n                    if (char_reader->parse(t.c_str(), t.c_str() + t.size(), &root, &err))\n                    {\n                        bool s{(root[\"key\"] != ignore_key) && (root[\"uuid\"].asString() == db_uuid)};\n\n                        return s;\n                    }\n                    LOG(warning) << \"Unable to parse TTL for Volatile TTL eviction: \" << err;\n\n                    return false;\n                });\n\n        return filtered_ttls;\n    }\n} // namespace bzn::crud::eviction\n"
  },
  {
    "path": "policy/volatile_ttl.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <policy/eviction_base.hpp>\n\nnamespace bzn::policy\n{\n    struct ttl_item;\n\n    class volatile_ttl : public eviction_base\n    {\n    public:\n        volatile_ttl(std::shared_ptr<bzn::storage_base> storage) : eviction_base(storage)\n        {\n        }\n\n        std::set<bzn::key_t> keys_to_evict(const database_msg& request, size_t max_size) override;\n\n    private:\n        std::vector<std::string> filter_ttls(const std::vector<std::string>& ttls, const bzn::uuid_t& db_uuid, const bzn::key_t& ignore_key);\n\n        std::vector<ttl_item> get_ttl_items(const std::string& db_uuid, std::vector<std::string>& our_ttls) const;\n\n\n        // TODO: This is a duplicate of a private crud method, it would be nice to find a way to dry this up,\n        // maybe move this function into a utility module\n        bzn::key_t generate_expire_key(const bzn::uuid_t& uuid, const bzn::key_t& key) const\n        {\n            Json::Value value;\n\n            value[\"uuid\"] = uuid;\n            value[\"key\"] = key;\n\n            return value.toStyledString();\n        }\n    };\n}\n"
  },
  {
    "path": "proto/CMakeLists.txt",
    "content": "protobuf_generate_cpp(PROTO_SRC PROTO_HEADER bluzelle.proto database.proto pbft.proto audit.proto status.proto)\nadd_library(proto ${PROTO_HEADER} ${PROTO_SRC})\nset_target_properties(proto PROPERTIES COMPILE_FLAGS \"-Wno-unused\")\nset(PROTO_INCLUDE_DIR ${CMAKE_BINARY_DIR}/proto PARENT_SCOPE)\n"
  },
  {
    "path": "proto/audit.proto",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\nsyntax = \"proto3\";\n\nmessage audit_message {\n    oneof msg {\n        pbft_commit_notification pbft_commit = 1;\n        primary_status primary_status = 2;\n\n        failure_detected failure_detected = 3;\n    }\n}\n\nmessage leader_status {\n    uint64 term = 1;\n    string leader = 2;\n    uint64 current_log_index = 3;\n    uint64 current_commit_index = 4;\n}\n\nmessage primary_status {\n    uint64 view = 1;\n    string primary = 2;\n}\n\nmessage pbft_commit_notification {\n    string sender_uuid = 1;\n    uint64 sequence_number = 2;\n    bytes operation = 3;\n}\n\nmessage failure_detected {\n    string sender_uuid = 1;\n}\n"
  },
  {
    "path": "proto/bluzelle.proto",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\nsyntax = \"proto3\";\n\nmessage swarm_error\n{\n    string message = 1;\n    bytes data = 2;\n    bytes hash = 3;\n}\n\n\nmessage bzn_envelope\n{\n    string swarm_id = 1;\n    string sender = 2;\n    bytes signature = 3;\n    uint64 timestamp = 4;\n    repeated bzn_envelope piggybacked_requests = 5;\n\n    oneof payload\n    {\n        bytes database_msg = 10;\n        bytes pbft_internal_request = 11;\n        bytes database_response = 12;\n        bytes json = 13;\n        bytes audit = 14;\n        bytes pbft = 15;\n        bytes pbft_membership = 16;\n        bytes status_request = 17;\n        bytes status_response = 18;\n        bytes checkpoint_msg = 19;\n        bytes swarm_error = 20;\n    }\n}\n"
  },
  {
    "path": "proto/database.proto",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\nsyntax = \"proto3\";\n\n\n///////////////////////////////////////////////////////////////////////////////\n// DATABASE\n\nmessage database_msg\n{\n    database_header header = 1;\n\n    oneof msg\n    {\n        database_create         create = 2;\n        database_read           read = 3;\n        database_update         update = 4;\n        database_delete         delete = 5;\n\n        database_has            has = 6;\n        database_request        keys = 7;\n        database_request        size = 8;\n\n        database_subscribe      subscribe = 9;\n        database_unsubscribe    unsubscribe = 10;\n\n        database_nullmsg        nullmsg = 11;\n\n        database_create_db      create_db = 12;\n        database_request        delete_db = 13;\n        database_create_db      update_db = 14;\n        database_has_db         has_db = 15;\n\n        database_request        writers = 16;\n        database_writers        add_writers = 17;\n        database_writers        remove_writers = 18;\n\n        database_read           quick_read = 19;\n\n        database_expire         expire = 20;\n        database_read           persist = 21;\n        database_read           ttl = 22;\n    }\n}\n\nmessage database_header\n{\n    bytes db_uuid = 1;\n    uint64 nonce = 2 [jstype = JS_STRING];\n    string point_of_contact = 3;\n    bytes  request_hash = 4;\n}\n\nmessage database_create_db\n{\n    enum eviction_policy_type\n    {\n        NONE = 0;\n        RANDOM = 1;\n        VOLATILE_TTL = 2;\n    }\n\n    uint64 max_size = 1;\n    eviction_policy_type eviction_policy = 2;\n}\n\nmessage database_create\n{\n    bytes key = 1;\n    bytes value = 2;\n    uint64 expire = 3;\n}\n\nmessage database_read\n{\n    bytes key = 1;\n}\n\nmessage database_update\n{\n    bytes key = 1;\n    bytes value = 2;\n    uint64 expire = 3;\n}\n\nmessage database_expire\n{\n    bytes key = 1;\n    uint64 expire = 2;\n}\n\nmessage database_delete\n{\n    bytes key = 1;\n}\n\nmessage database_subscribe\n{\n    bytes key = 1;\n}\n\nmessage database_unsubscribe\n{\n    bytes key = 1;\n    uint64 nonce = 2;\n}\n\nmessage database_has\n{\n    bytes key = 1;\n}\n\nmessage database_has_db {}\n\nmessage database_writers\n{\n    repeated string writers = 1;\n}\n\nmessage database_subscription_update\n{\n    enum operation_type\n    {\n        UPDATE = 0;\n        DELETE = 1;\n    }\n\n    bytes key = 1;\n    bytes value = 2;\n    operation_type operation = 3;\n    uint64 seq = 4;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\nmessage database_redirect_response\n{\n    string leader_id = 1;\n    string leader_name = 2;\n    string leader_host = 3;\n    uint32 leader_port = 4;\n}\n\nmessage database_has_response\n{\n    bytes key = 1;\n    bool has = 2;\n}\n\nmessage database_has_db_response\n{\n    bytes uuid = 1;\n    bool has = 2;\n}\n\nmessage database_keys_response\n{\n    repeated string keys = 1;\n}\n\nmessage database_read_response\n{\n    bytes key = 1;\n    bytes value = 2;\n}\n\nmessage database_quick_read_response\n{\n    bytes key = 1;\n    bytes value = 2;\n    string error = 3;\n}\n\nmessage database_size_response\n{\n    uint64 bytes = 1;\n    uint32 keys = 2;\n    uint64 remaining_bytes = 3;\n    uint64 max_size = 4;\n}\n\nmessage database_request {}\n\nmessage database_writers_response\n{\n    bytes owner = 1;\n    repeated bytes writers = 2;\n}\n\nmessage database_ttl_response\n{\n    bytes key = 1;\n    uint64 ttl = 2;\n}\n\nmessage database_error\n{\n    string message = 1;\n}\n\nmessage database_response\n{\n    database_header header = 1;\n\n    oneof response\n    {\n        database_redirect_response      redirect = 2;\n        database_subscription_update    subscription_update = 3;\n        database_read_response          read = 4;\n        database_quick_read_response    quick_read = 5;\n        database_has_response           has = 6;\n        database_keys_response          keys = 7;\n        database_size_response          size = 8;\n        database_error                  error = 9;\n        database_has_db_response        has_db = 10;\n        database_writers_response       writers = 11;\n        database_ttl_response           ttl = 12;\n    }\n}\n\nmessage database_nullmsg {}\n"
  },
  {
    "path": "proto/pbft.proto",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\nsyntax = \"proto3\";\n\nimport \"bluzelle.proto\";\n\nmessage pbft_msg\n{\n    pbft_msg_type type = 1;\n\n    // used for preprepare, prepare, commit, viewchange(v+1)\n    uint64 view = 2;\n\n    // used for preprepare, prepare, commit, checkpoint, viewchange (last valid checkpoint sequence)\n    uint64 sequence = 3;\n\n    // used for preprepare, prepare, commit\n    bytes request_hash = 5;\n\n    // most messages should only have the hash, not the original request\n    bzn_envelope request = 4;\n\n    // for join/leave requests\n    pbft_peer_info peer_info = 7;\n\n    // for viewchange\n    repeated bzn_envelope checkpoint_messages = 8;\n\n    // for viewchange, and newview (O)\n    // P, p_m, O\n    repeated prepared_proof prepared_proofs = 9;\n\n    // for newview\n    // V valid view change messages\n    repeated bzn_envelope viewchange_messages = 11;\n\n    repeated bzn_envelope pre_prepare_messages = 12;\n\n    // for newview\n    string config_hash = 13;\n\n    // for newview\n    string config = 14;\n\n    pbft_request_type request_type = 15;\n}\n\n\nenum pbft_request_type\n{\n    PBFT_REQUEST_PAYLOAD = 0; // this must be zero\n    PBFT_REQUEST_INTERNAL = 1;\n}\n\nmessage checkpoint_msg\n{\n    uint64 sequence = 1;\n    string state_hash = 2;\n}\n\nmessage pbft_config_msg\n{\n    // for new_config\n    string configuration = 1;\n    bytes join_request_hash = 2;\n}\n\nenum pbft_msg_type\n{\n    PBFT_MSG_UNDEFINED = 0;\n    PBFT_MSG_PREPREPARE = 2;\n    PBFT_MSG_PREPARE = 3;\n    PBFT_MSG_COMMIT = 4;\n    PBFT_MSG_VIEWCHANGE = 8;\n    PBFT_MSG_NEWVIEW = 9;\n}\n\nmessage pbft_membership_msg\n{\n    pbft_membership_msg_type type = 1;\n\n    // for join/leave requests\n    pbft_peer_info peer_info = 2;\n\n    // for get_state, set_state\n    uint64 sequence = 3;\n    string state_hash = 4;\n    repeated bzn_envelope checkpoint_proof = 7;\n\n    // for set_state\n    bytes state_data = 5;\n    bzn_envelope newview_msg = 6;\n    bytes current_configuration = 8;\n}\n\nenum pbft_membership_msg_type\n{\n    PBFT_MMSG_UNDEFINED = 0;\n    PBFT_MMSG_JOIN = 1;\n    PBFT_MMSG_JOIN_RESPONSE = 2;\n    PBFT_MMSG_LEAVE = 3;\n    PBFT_MMSG_GET_STATE = 4;\n    PBFT_MMSG_SET_STATE = 5;\n}\n\nmessage pbft_peer_info\n{\n    string host = 1;\n    uint32 port = 2;\n    string name = 3;\n    string uuid = 4;\n}\n\nmessage prepared_proof\n{\n    bzn_envelope pre_prepare = 1;  // O\n    repeated bzn_envelope prepare = 2; // P, P_m\n}\n"
  },
  {
    "path": "proto/status.proto",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\nsyntax = \"proto3\";\n\nmessage status_request {}\n\nmessage status_response\n{\n    string swarm_version = 1;\n    string swarm_git_commit = 2;\n    string swarm_id = 3;\n    string uptime = 4;\n    string module_status_json = 5;\n    bool pbft_enabled = 6;\n}\n"
  },
  {
    "path": "qa/integration-tests.sh",
    "content": "#!/usr/bin/env bash\n\ncd ../..\n\ngit clone git@github.com:bluzelle/bluzelle-js.git\n\ncd bluzelle-js\n\nyarn\n\nif [ \"$1\" == \"setup\" ]; then\nprintf \"*************************************\nCopying template configuration files.\n\nPlease add an Etherscan api key at minimum to the config files at swarmDB/build/*.json, and then run this script again with no arguments.\n*************************************\\n\"\n    yarn setup-daemon\nelse\n    echo \"**** Running tests with your configuration files. ****\"\n    yarn test-integration\nfi\n\n"
  },
  {
    "path": "scripts/crud",
    "content": "#!/usr/bin/env python2.7\n\n# Copyright (C) 2018 Bluzelle\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Affero General Public License, version 3,\n# as published by the Free Software Foundation.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Affero General Public License for more details.\n#\n# You should have received a copy of the GNU Affero General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n# To generate Python bindings:\n#\n# cd proto\n# protoc --python_out=../scripts ./*.proto\n#\n\nimport websocket\nimport ssl\nimport sys\nimport random\nfrom argparse import ArgumentParser\nfrom argparse import RawDescriptionHelpFormatter\n\ntry:\n    import bluzelle_pb2\n    import database_pb2\n    import pbft_pb2\n    import status_pb2\nexcept ImportError as e:\n    raise ImportError(\"{}\\n\\nTo generate Bluzelle protobuf modules:\\n\"\n                      \"\\n\"\n                      \"$ cd proto\\n\"\n                      \"$ protoc --python_out=../scripts ./*.proto\\n\".format(e.message))\n\nnonce = 0\nCRUD_SCRIPT_SWARM_ID = \"\"\nCRUD_SCRIPT_SENDER_ID = \"crud-script\"\n\ndef handle_response(ws):\n    print(\"-\" * 60 + '\\n')\n\n    env = bluzelle_pb2.bzn_envelope()\n    env.ParseFromString(ws.recv())\n\n    resp = database_pb2.database_response()\n    resp.ParseFromString(env.database_response)\n\n    if resp.WhichOneof('response') == 'redirect':\n        redirect_node = \"{}:{}\".format(resp.redirect.leader_host, resp.redirect.leader_port)\n        print(\"redirecting to leader at {}...\\n\".format(redirect_node).expandtabs(4))\n        resp = send_request(redirect_node, uuid, msg)\n    else:\n        print(\"Response: \\n{}\".format(resp).expandtabs(4))\n        print(\"-\" * 60 + '\\n')\n\n\ndef send_request(node, uuid, msg, loop=False, ws=None):\n    global nonce\n    global CRUD_SCRIPT_SWARM_ID\n    global CRUD_SCRIPT_SENDER_ID\n\n    if not ws:\n        ws = websocket.create_connection(\"wss://\" + node)\n    msg.header.db_uuid = uuid\n\n    # hack!\n    if nonce != 0:\n        msg.header.nonce = nonce\n    else:\n        msg.header.nonce = random.randint(1,sys.maxint)\n\n    msg_outer = bluzelle_pb2.bzn_envelope()\n    msg_outer.database_msg = msg.SerializeToString()\n    msg_outer.swarm_id = CRUD_SCRIPT_SWARM_ID\n    msg_outer.sender = CRUD_SCRIPT_SENDER_ID\n\n    ws.send_binary(msg_outer.SerializeToString())\n    resp = handle_response(ws)\n\n    if loop:\n        while 1:\n            try:\n                print(\"Waiting....\\n\")\n                resp = bluzelle_pb2.bzn_envelope()\n                resp.ParseFromString(ws.recv())\n                database_resp = database_pb2.database_response()\n                database_resp.ParseFromString(resp.database_msg)\n                print(\"Response: \\n{}\".format(database_resp).expandtabs(4))\n                print(\"-\" * 60 + '\\n')\n            except KeyboardInterrupt:\n                break\n        return ws\n\n    #ws.close()\n\n    return resp\n\n\ndef send_status_request(node):\n    ws = websocket.create_connection(\"wss://\" + args.node,  sslopt={\"cert_reqs\": ssl.CERT_NONE})\n    msg_outer = bluzelle_pb2.bzn_envelope()\n    msg_inner = status_pb2.status_request()\n    msg_outer.swarm_id = CRUD_SCRIPT_SWARM_ID\n    msg_outer.sender = CRUD_SCRIPT_SENDER_ID\n    msg_outer.status_request = msg_inner.SerializeToString()\n\n    print(\"Sending: \\n{}\".format(msg_outer).expandtabs(4))\n    ws.send_binary(msg_outer.SerializeToString())\n\n    env = bluzelle_pb2.bzn_envelope()\n    env.ParseFromString(ws.recv())\n    resp = status_pb2.status_response()\n    resp.ParseFromString(env.status_response)\n    print(\"Response: \\n{}\".format(resp).expandtabs(4))\n    print(\"Response: \\n{}\".format(resp.module_status_json).expandtabs(4))\n    print(\"-\" * 60 + '\\n')\n\n    return resp\n\n\ndef create_db_request(max_size):\n    msg = database_pb2.database_msg()\n    msg.create_db.SetInParent()\n    msg.create_db.max_size = max_size\n    return msg\n\ndef update_db_request(max_size):\n    msg = database_pb2.database_msg()\n    msg.update_db.SetInParent()\n    msg.update_db.max_size = max_size\n    return msg\n\ndef delete_db_request():\n    msg = database_pb2.database_msg()\n    msg.delete_db.SetInParent()\n    return msg\n\n\ndef has_db_request():\n    msg = database_pb2.database_msg()\n    msg.has_db.SetInParent()\n    return msg\n\n\ndef writers_request():\n    msg = database_pb2.database_msg()\n    msg.writers.SetInParent()\n    return msg\n\n\ndef add_writer_request(writer):\n    msg = database_pb2.database_msg()\n    msg.add_writers.SetInParent()\n    msg.add_writers.writers.append(writer)\n    return msg\n\n\ndef remove_writer_request(writer):\n    msg = database_pb2.database_msg()\n    msg.remove_writers.SetInParent()\n    msg.remove_writers.writers.append(writer)\n    return msg\n\n\ndef create_request(key, value, expire):\n    msg = database_pb2.database_msg()\n    msg.create.key = key\n    msg.create.value = value\n    msg.create.expire = expire\n    return msg\n\n\ndef read_request(key):\n    msg = database_pb2.database_msg()\n    msg.read.key = key\n    return msg\n\n\ndef quick_read_request(key):\n    msg = database_pb2.database_msg()\n    msg.quick_read.key = key\n    return msg\n\n\ndef update_request(key, value, expire):\n    msg = database_pb2.database_msg()\n    msg.update.key = key\n    msg.update.value = value\n    msg.update.expire = expire;\n    return msg\n\n\ndef delete_request(key):\n    msg = database_pb2.database_msg()\n    msg.delete.key = key\n    return msg\n\n\ndef has_request(key):\n    msg = database_pb2.database_msg()\n    msg.has.key = key\n    return msg\n\n\ndef ttl_request(key):\n    msg = database_pb2.database_msg()\n    msg.ttl.key = key\n    return msg\n\n\ndef persist_request(key):\n    msg = database_pb2.database_msg()\n    msg.persist.key = key\n    return msg\n\n\ndef expire_request(key, expire):\n    msg = database_pb2.database_msg()\n    msg.expire.key = key\n    msg.expire.expire = expire\n    return msg\n\n\ndef keys_request():\n    msg = database_pb2.database_msg()\n    msg.keys.SetInParent()\n    return msg\n\n\ndef size_request():\n    msg = database_pb2.database_msg()\n    msg.size.SetInParent()\n    return msg\n\n\ndef subscribe_request(key):\n    msg = database_pb2.database_msg()\n    msg.subscribe.key = key\n    return msg\n\n\ndef unsubscribe_request(key):\n    global nonce\n    msg = database_pb2.database_msg()\n    msg.unsubscribe.key = key\n    msg.unsubscribe.nonce = nonce\n    return msg\n\n\ndef status_handler(args):\n    return send_status_request(args.node)\n\n\ndef create_db_handler(args):\n    return send_request(args.node, args.uuid, create_db_request(args.max_size))\n\n\ndef update_db_handler(args):\n    return send_request(args.node, args.uuid, update_db_request(args.max_size))\n\ndef delete_db_handler(args):\n    return send_request(args.node, args.uuid, delete_db_request())\n\n\ndef has_db_handler(args):\n    return send_request(args.node, args.uuid, has_db_request())\n\n\ndef writers_handler(args):\n    return send_request(args.node, args.uuid, writers_request())\n\n\ndef add_writer_handler(args):\n    return send_request(args.node, args.uuid, add_writer_request(args.writer))\n\n\ndef remove_writer_handler(args):\n    return send_request(args.node, args.uuid, remove_writer_request(args.writer))\n\n\ndef create_handler(args):\n    return send_request(args.node, args.uuid, create_request(args.key, args.value, args.expire))\n\n\ndef update_handler(args):\n    return send_request(args.node, args.uuid, update_request(args.key, args.value, args.expire))\n\n\ndef read_handler(args):\n    return send_request(args.node, args.uuid, read_request(args.key))\n\n\ndef qread_handler(args):\n    return send_request(args.node, args.uuid, quick_read_request(args.key))\n\n\ndef delete_handler(args):\n    return send_request(args.node, args.uuid, delete_request(args.key))\n\n\ndef has_handler(args):\n    return send_request(args.node, args.uuid, has_request(args.key))\n\n\ndef ttl_handler(args):\n    return send_request(args.node, args.uuid, ttl_request(args.key))\n\n\ndef persist_handler(args):\n    return send_request(args.node, args.uuid, persist_request(args.key))\n\n\ndef expire_handler(args):\n    return  send_request(args.node, args.uuid, expire_request(args.key, args.expire))\n\n\ndef keys_handler(args):\n    return send_request(args.node, args.uuid, keys_request())\n\n\ndef size_handler(args):\n    return send_request(args.node, args.uuid, size_request())\n\n\ndef subscribe_handler(args):\n    global nonce\n    nonce = random.randint(1,sys.maxint)\n    return send_request(args.node, args.uuid, unsubscribe_request(args.key),\n                        ws=send_request(args.node, args.uuid, subscribe_request(args.key), True))\n\n\nif __name__ == \"__main__\":\n\n    parser = ArgumentParser(description=\"crud\", formatter_class=RawDescriptionHelpFormatter)\n\n    parser.add_argument(\"-s\", \"--swarm_id\", type=str, default=\"0\", help=\"Target swarm id (default 0)\", required=False)\n\n    parser.add_argument(\"-i\", \"--id\", type=str, default=\"0\", help=\"Crud script sender id (default 0)\", required=False)\n\n    required = parser.add_argument_group('required arguments')\n\n    required.add_argument(\"-n\", \"--node\", type=str, default=None, help=\"node's address (ex. 127.0.0.1:51010)\", required=True)\n\n    subparsers = parser.add_subparsers()\n\n    # Status\n    status_parser = subparsers.add_parser('status', help=\"Status\")\n    status_parser.set_defaults(func=status_handler)\n\n    # Create db\n    create_db_parser = subparsers.add_parser('create-db', help=\"Create database\")\n    create_db_group = create_db_parser.add_argument_group('required arguments')\n    create_db_group.add_argument(\"-u\", \"--uuid\",  type=str, default=None, help=\"uuid\", required=True)\n    create_db_group.add_argument(\"-s\", \"--max-size\",  type=int, default=0, help=\"max-size\", required=False)\n    create_db_parser.set_defaults(func=create_db_handler)\n\n    # Update db\n    update_db_parser = subparsers.add_parser('update-db', help=\"Update database max size\")\n    update_db_group = update_db_parser.add_argument_group('required arguments')\n    update_db_group.add_argument(\"-u\", \"--uuid\",  type=str, default=None, help=\"uuid\", required=True)\n    update_db_group.add_argument(\"-s\", \"--max-size\",  type=int, default=0, help=\"max-size\", required=False)\n    update_db_parser.set_defaults(func=update_db_handler)\n\n    # Delete db\n    delete_db_parser = subparsers.add_parser('delete-db', help=\"Delete database\")\n    delete_db_group = delete_db_parser.add_argument_group('required arguments')\n    delete_db_group.add_argument(\"-u\", \"--uuid\",  type=str, default=None, help=\"uuid\", required=True)\n    delete_db_parser.set_defaults(func=delete_db_handler)\n\n    # Has db\n    has_db_parser = subparsers.add_parser('has-db', help=\"Has database\")\n    has_db_group = has_db_parser.add_argument_group('required arguments')\n    has_db_group.add_argument(\"-u\", \"--uuid\",  type=str, default=None, help=\"uuid\", required=True)\n    has_db_parser.set_defaults(func=has_db_handler)\n\n    # Writers\n    writers_parser = subparsers.add_parser('writers', help=\"Database writers\")\n    writers_group = writers_parser.add_argument_group('required arguments')\n    writers_group.add_argument(\"-u\", \"--uuid\",  type=str, default=None, help=\"uuid\", required=True)\n    writers_parser.set_defaults(func=writers_handler)\n\n    # Add writer\n    add_writers_parser = subparsers.add_parser('add-writer', help=\"Add database writers\")\n    add_writers_group = add_writers_parser.add_argument_group('required arguments')\n    add_writers_group.add_argument(\"-u\", \"--uuid\",  type=str, default=None, help=\"uuid\", required=True)\n    add_writers_group.add_argument(\"-w\", \"--writer\",  type=str, default=None, help=\"uuid\", required=True)\n    add_writers_parser.set_defaults(func=add_writer_handler)\n\n    # Remove writer\n    remove_writers_parser = subparsers.add_parser('remove-writer', help=\"Remove database writers\")\n    remove_writers_group = remove_writers_parser.add_argument_group('required arguments')\n    remove_writers_group.add_argument(\"-u\", \"--uuid\",  type=str, default=None, help=\"uuid\", required=True)\n    remove_writers_group.add_argument(\"-w\", \"--writer\",  type=str, default=None, help=\"uuid\", required=True)\n    remove_writers_parser.set_defaults(func=remove_writer_handler)\n\n    # Create\n    create_parser = subparsers.add_parser('create', help=\"Create k/v\")\n    create_group = create_parser.add_argument_group('required arguments')\n    create_group.add_argument(\"-u\", \"--uuid\",  type=str, default=None, help=\"uuid\", required=True)\n    create_group.add_argument(\"-k\", \"--key\",   type=str, default=None, help=\"key\", required=True)\n    create_group.add_argument(\"-ex\", \"--expire\", type=int, default=0, help=\"key\", required=False)\n    group = create_group.add_mutually_exclusive_group()\n    group.add_argument(\"-v\", \"--value\", type=str, default=\"\", help=\"value\")\n    group.add_argument(\"-f\", \"--file\",  type=str, default=None, help=\"file to upload\")\n    create_parser.set_defaults(func=create_handler)\n\n    # Read\n    read_parser = subparsers.add_parser('read', help=\"Read k/v\")\n    read_group = read_parser.add_argument_group('required arguments')\n    read_group.add_argument(\"-k\", \"--key\",   type=str, default=None, help=\"key\", required=True)\n    read_group.add_argument(\"-u\", \"--uuid\",  type=str, default=None, help=\"uuid\", required=True)\n    read_parser.add_argument(\"-s\", \"--save\", type=str, default=None, help=\"save to file\")\n    read_parser.set_defaults(func=read_handler)\n\n    # Quick read\n    qread_parser = subparsers.add_parser('qread', help=\"Quick read k/v\")\n    qread_group = qread_parser.add_argument_group('required arguments')\n    qread_group.add_argument(\"-k\", \"--key\",   type=str, default=None, help=\"key\", required=True)\n    qread_group.add_argument(\"-u\", \"--uuid\",  type=str, default=None, help=\"uuid\", required=True)\n    qread_parser.add_argument(\"-s\", \"--save\", type=str, default=None, help=\"save to file\")\n    qread_parser.set_defaults(func=qread_handler)\n\n    # Update\n    update_parser = subparsers.add_parser('update', help=\"Update k/v\")\n    update_group = update_parser.add_argument_group('required arguments')\n    update_group.add_argument(\"-k\", \"--key\",   type=str, default=None, help=\"key\", required=True)\n    update_group.add_argument(\"-u\", \"--uuid\",  type=str, default=None, help=\"uuid\", required=True)\n    update_group.add_argument(\"-ex\", \"--expire\", type=int, default=0, help=\"expire in seconds\")\n    update = update_group.add_mutually_exclusive_group()\n    update.add_argument(\"-v\", \"--value\", type=str, default=None, help=\"value\")\n    update.add_argument(\"-f\", \"--file\",  type=str, default=None,  help=\"file to upload\")\n    update_parser.set_defaults(func=update_handler)\n\n    # delete\n    delete_parser = subparsers.add_parser('delete', help=\"Delete k/v\")\n    delete_group = delete_parser.add_argument_group('required arguments')\n    delete_group.add_argument(\"-k\", \"--key\",   type=str, default=None, help=\"key\", required=True)\n    delete_group.add_argument(\"-u\", \"--uuid\",  type=str, default=None, help=\"uuid\", required=True)\n    delete_parser.set_defaults(func=delete_handler)\n\n    # has\n    has_parser = subparsers.add_parser('has', help=\"Determine whether a key exists within a DB by UUID\")\n    has_group = has_parser.add_argument_group('requred arguments')\n    has_group.add_argument(\"-k\", \"--key\",   type=str, default=None, help=\"key\", required=True)\n    has_group.add_argument(\"-u\", \"--uuid\",  type=str, default=None, help=\"uuid\", required=True)\n    has_parser.set_defaults(func=has_handler)\n\n    # ttl\n    ttl_parser = subparsers.add_parser('ttl', help=\"Get ttl for a key within a DB by UUID\")\n    ttl_group = ttl_parser.add_argument_group('required arguments')\n    ttl_group.add_argument(\"-k\", \"--key\",   type=str, default=None, help=\"key\", required=True)\n    ttl_group.add_argument(\"-u\", \"--uuid\",  type=str, default=None, help=\"uuid\", required=True)\n    ttl_parser.set_defaults(func=ttl_handler)\n\n    # persist\n    persist_parser = subparsers.add_parser('persist', help=\"Remove expiration for a key within a DB by UUID\")\n    persist_group = persist_parser.add_argument_group('required arguments')\n    persist_group.add_argument(\"-k\", \"--key\",   type=str, default=None, help=\"key\", required=True)\n    persist_group.add_argument(\"-u\", \"--uuid\",  type=str, default=None, help=\"uuid\", required=True)\n    persist_parser.set_defaults(func=persist_handler)\n\n    # expire\n    expire_parser = subparsers.add_parser('expire', help=\"Set expire for a key within a DB by UUID\")\n    expire_group = expire_parser.add_argument_group('required arguments')\n    expire_group.add_argument(\"-k\", \"--key\",   type=str, default=None, help=\"key\", required=True)\n    expire_group.add_argument(\"-u\", \"--uuid\",  type=str, default=None, help=\"uuid\", required=True)\n    expire_group.add_argument(\"-ex\", \"--expire\", type=int, default=0, help=\"expire in seconds\")\n    expire_parser.set_defaults(func=expire_handler)\n\n    # keys\n    keys_parser = subparsers.add_parser('keys', help=\"Get all keys for a DB by UUID\")\n    keys_parser.add_argument(\"-u\", \"--uuid\",  type=str, default=None, help=\"uuid\", required=True)\n    keys_parser.set_defaults(func=keys_handler)\n\n    # size\n    size_parser = subparsers.add_parser('size', help=\"Determine the size of the DB by UUID\")\n    size_parser.add_argument(\"-u\", \"--uuid\",  type=str, default=None, help=\"uuid\", required=True)\n    size_parser.set_defaults(func=size_handler)\n\n    # subscribe\n    subscribe_parser = subparsers.add_parser('subscribe', help=\"Subscribe and monitor changes for a key\")\n    subscribe_parser.add_argument(\"-u\", \"--uuid\",  type=str, default=None, help=\"uuid\", required=True)\n    subscribe_parser.add_argument(\"-k\", \"--key\",   type=str, default=None, help=\"key\", required=True)\n    subscribe_parser.set_defaults(func=subscribe_handler)\n\n    args = parser.parse_args()\n    \n    try:\n        if args.file:\n            # if user gave us a file we need to read it as our value\n            args.value = open(args.file).read()\n    except IOError as e:\n        print(\"failed to read value from file: {}\".format(e.strerror))\n        exit(1)\n    except AttributeError:\n        # no input file specified. Value was passed via command line\n        pass\n\n    CRUD_SCRIPT_SWARM_ID = args.swarm_id\n\n    CRUD_SCRIPT_SENDER_ID += \"-\" + args.id\n    print(\"\\nClient: \" + CRUD_SCRIPT_SENDER_ID)\n\n    resp = args.func(args)\n\n    try:\n        # save to a file...\n        if args.save:\n            with open(args.save, \"w\") as outfile:\n                outfile.write(str(resp.resp.value))\n    except AttributeError:\n        # no output file specified. Result will be printed to console\n        pass\n\n    exit(0)\n"
  },
  {
    "path": "scripts/generate-key",
    "content": "#!/bin/bash\nset -e\n\nprefix=${1:-`pwd`/.state}\n\nmkdir -p $prefix\n\n# This is a very popular curve, which openssl has special optimizations for\nopenssl ecparam -name secp256r1 -genkey -noout -out $prefix/private-key.pem\necho \"Private key written to \"$prefix\"/private-key.pem\"\n\nopenssl ec -in $prefix/private-key.pem -pubout -out $prefix/public-key.pem > /dev/null 2>&1\necho \"Public key written to \"$prefix\"/public-key.pem\"\necho\n\ncat $prefix/public-key.pem\n"
  },
  {
    "path": "scripts/sign_uuid.sh",
    "content": "#!/usr/bin/env bash\n\n\nusage()\n{\n    echo \"usage: sign_uuid -k path/to/private.pem -u <uuid_of_node>\"\n    echo \"The output will be signature.txt which can be provided to the node owner.\"\n}\n\n\nwrite_uuid_to_file()\n{\n    uuid_text=$1\n    uuid_file_name=$2\n\n    echo \"Writing UUID($uuid_text) to $uuid_file_name\"\n    echo $uuid_text > ${uuid_file_name}\n}\n\n\nverify_input_files()\n{\n    private_key_file_name=$1\n    uuid_file_name=$2\n\n    if [ -f $private_key_file_name ]; then\n        echo \"Found the private key file: $private_key_file_name\"\n    else\n        echo \"Exiting - Could not find the private key file: $private_key_file_name\"\n        exit\n    fi\n\n    if [ -f $uuid_file_name ]; then\n        echo \"Found the UUID file: $uuid_file_name\"\n    else\n        echo \"Exiting - Could not find the UUID file: $uuid_file_name\"\n        exit\n    fi\n}\n\n\nuse_private_pem_to_sign_uuid()\n{\n    private_key_file_name=$1\n    uuid_file_name=$2\n    temp_sha256_binary_file=/tmp/sign.sha256\n\n    openssl dgst -sha256 -sign ${private_key_file_name} -out ${temp_sha256_binary_file} ${uuid_file_name}\n    if [ $? -ne 0 ]; then\n        echo \"***  Exiting - Unable to create the binary signature file\"\n        exit\n    else\n        echo \"Successfully created binary signature file..\"\n    fi\n\n    openssl base64 -in ${temp_sha256_binary_file} -out signature.txt\n    if [ $? -ne 0 ]; then\n        echo \"*** Exiting - Unable to base64 encode the binary signature file\"\n        exit\n    else\n        echo \"The signature has been written to signature.txt\"\n    fi\n}\n\n\n############\n### MAIN ###\nprivate_key_file_name=\nuuid_file_name=/tmp/uuid.txt\n\n# TODO Move the while block into it's own function\nwhile [ \"$1\" != \"\" ]; do\n    case $1 in\n        -k | --key )        shift\n                            private_key_file_name=$1\n                            ;;\n        -u | --uuid )       shift\n                            write_uuid_to_file $1 $uuid_file_name\n                            ;;\n        -h | --help )       usage\n                            exit\n                            ;;\n        * )                 usage\n                            exit 1\n    esac\n    shift\ndone\n\nverify_input_files $private_key_file_name $uuid_file_name\nuse_private_pem_to_sign_uuid $private_key_file_name $uuid_file_name\nexit 0\n"
  },
  {
    "path": "scripts-1.md",
    "content": "# Python CRUD Test App\n\nSteps to run the Bluzelle SwarmDB test application in a Python Virtual Environment. **Ensure that you activate your virtualenv each time you want to run the application**.\n\n## Install Virtual Environment\n\n```text\n$ sudo pip install virtualenv\n$ cd workspace\n$ virtualenv crud-app\n```\n\n## Activate Virtual Environment\n\n```text\n$ . ~/workspace/crud-app/bin/activate\n```\n\n## Install Dependencies\n\n```text\n(crud-app)$ pip install websocket-client protobuf\n```\n\n## Generate Protobuf Code\n\n```text\n(crud-app)$ cd ../workspace/swarmdb/scripts\n(crud-app)$ protoc --python_out=../scripts *.proto\n```\n\n## Run Script\n\n```text\n(crud-app)$ crud -h\n```\n\n"
  },
  {
    "path": "status/CMakeLists.txt",
    "content": "add_library(status STATIC\n        status.cpp\n        status.hpp\n        )\n\ntarget_link_libraries(status proto)\nadd_dependencies(status boost jsoncpp proto openssl)\ntarget_include_directories(status PRIVATE ${BLUZELLE_STD_INCLUDES})\n\nadd_subdirectory(test)\n"
  },
  {
    "path": "status/status.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <status/status.hpp>\n#include <swarm_version.hpp>\n#include <swarm_git_commit.hpp>\n#include <proto/status.pb.h>\n\nusing namespace bzn;\n\nnamespace\n{\n    const std::string NAME_KEY{\"name\"};\n    const std::string STATUS_KEY{\"status\"};\n    const std::string MODULE_KEY{\"module\"};\n\n    std::string get_uptime(const std::chrono::steady_clock::time_point& start_time)\n    {\n        using namespace std::chrono;\n\n        auto uptime = duration_cast<seconds>(steady_clock::now() - start_time);\n\n        auto d = duration_cast<duration<int64_t, std::ratio<3600 * 24>>>(uptime);\n        auto h = duration_cast<hours>(uptime -= d);\n        auto m = duration_cast<minutes>(uptime -= h);\n\n        std::stringstream ss;\n        ss << d.count() << \" days, \" << h.count() << \" hours, \" << m.count() << \" minutes\";\n\n        return ss.str();\n    }\n}\n\n\nstatus::status(std::shared_ptr<bzn::node_base> node, bzn::status::status_provider_list_t&& status_providers, const std::string& swarm_id)\n    : node(std::move(node))\n    , status_providers(std::move(status_providers))\n    , swarm_id(swarm_id)\n    , start_time(std::chrono::steady_clock::now())\n{\n}\n\n\nvoid\nstatus::start()\n{\n    std::call_once(this->start_once,\n        [this]()\n        {\n            if (!this->node->register_for_message(bzn_envelope::kStatusRequest,\n                std::bind(&status::handle_status_request_message, shared_from_this(), std::placeholders::_1, std::placeholders::_2)))\n            {\n                throw std::runtime_error(\"Unable to register for STATUS REQUEST messages!\");\n            }\n        });\n}\n\n\nbzn::json_message\nstatus::query_modules()\n{\n    Json::Value module_status;\n\n    for (const auto& provider : this->status_providers)\n    {\n        if (auto provider_shared_ptr = provider.lock())\n        {\n            bzn::json_message entry;\n\n            entry[NAME_KEY] = provider_shared_ptr->get_name();\n            entry[STATUS_KEY] = provider_shared_ptr->get_status();\n\n            module_status.append(entry);\n        }\n    }\n\n    return module_status;\n}\n\n\nvoid\nstatus::handle_status_request_message(const bzn_envelope& /*msg*/, std::shared_ptr<bzn::session_base> session)\n{\n    status_response srm;\n\n    srm.set_swarm_version(SWARM_VERSION);\n    srm.set_swarm_git_commit(SWARM_GIT_COMMIT);\n    srm.set_swarm_id(this->swarm_id);\n    srm.set_uptime(get_uptime(this->start_time));\n    srm.set_pbft_enabled(true);\n\n    Json::Value module_status;\n    module_status[MODULE_KEY] = this->query_modules();\n    srm.set_module_status_json(module_status.toStyledString());\n\n    LOG(debug) << srm.DebugString().substr(0, MAX_MESSAGE_SIZE);\n\n    bzn_envelope env;\n    env.set_status_response(srm.SerializeAsString());\n\n    session->send_signed_message(std::make_shared<bzn_envelope>(env));\n}\n"
  },
  {
    "path": "status/status.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <include/bluzelle.hpp>\n#include <node/node_base.hpp>\n#include <status/status_provider_base.hpp>\n#include <chrono>\n#include <memory>\n#include <mutex>\n\n\nnamespace bzn\n{\n    class status final : public std::enable_shared_from_this<status>\n    {\n    public:\n        using status_provider_list_t = std::vector<std::weak_ptr<bzn::status_provider_base>>;\n\n        status(std::shared_ptr<bzn::node_base> node, status_provider_list_t&& status_providers, const std::string& swarm_id);\n\n        void start();\n\n    private:\n        void handle_status_request_message(const bzn_envelope& msg, std::shared_ptr<bzn::session_base> session);\n\n        bzn::json_message query_modules();\n\n        std::shared_ptr<bzn::node_base> node;\n\n        status_provider_list_t status_providers;\n        const std::string swarm_id;\n        std::once_flag start_once;\n\n        const std::chrono::steady_clock::time_point start_time;\n    };\n\n} // namespace bzn\n"
  },
  {
    "path": "status/status_provider_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <include/bluzelle.hpp>\n\n\nnamespace bzn\n{\n    class status_provider_base\n    {\n    public:\n        virtual ~status_provider_base() = default;\n\n        /**\n         * get name\n         * @return name\n         */\n        virtual std::string get_name() = 0;\n\n        /**\n         * get status\n         * @return status in a json message\n         */\n        virtual bzn::json_message get_status() = 0;\n    };\n\n} // namespace bzn\n"
  },
  {
    "path": "status/test/CMakeLists.txt",
    "content": "set(test_srcs status_test.cpp)\nset(test_libs status ${Protobuf_LIBRARIES})\n\nadd_gmock_test(status)\n"
  },
  {
    "path": "status/test/status_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <status/status.hpp>\n#include <proto/status.pb.h>\n#include <swarm_git_commit.hpp>\n#include <mocks/mock_status_provider_base.hpp>\n#include <mocks/mock_session_base.hpp>\n#include <mocks/mock_node_base.hpp>\n\nusing namespace bzn;\nusing namespace testing;\n\n\nTEST(status_test, test_that_status_registers_and_responses_to_requests)\n{\n    auto mock_node = std::make_shared<mock_node_base>();\n\n    // success\n    {\n        auto status = std::make_shared<bzn::status>(mock_node, bzn::status::status_provider_list_t{}, \"1234\");\n\n        EXPECT_CALL(*mock_node, register_for_message(bzn_envelope::kStatusRequest, _)).WillOnce(Return(true));\n\n        status->start();\n    }\n\n    // failure\n    {\n        auto status = std::make_shared<bzn::status>(mock_node, bzn::status::status_provider_list_t{}, \"1234\");\n\n        EXPECT_CALL(*mock_node, register_for_message(bzn_envelope::kStatusRequest, _)).WillOnce(Return(false));\n\n        EXPECT_THROW(status->start(), std::runtime_error);\n    }\n}\n\n\nTEST(status_test, test_that_status_request_queries_status_providers)\n{\n    const std::string SWARM_ID{\"utest\"};\n\n    auto mock_node = std::make_shared<mock_node_base>();\n    auto mock_session = std::make_shared<mock_session_base>();\n\n    auto mock_status_provider = std::make_shared<mock_status_provider_base>();\n\n    auto status = std::make_shared<bzn::status>(mock_node, bzn::status::status_provider_list_t{mock_status_provider, mock_status_provider}, SWARM_ID);\n\n    bzn::protobuf_handler pbh;\n    EXPECT_CALL(*mock_node, register_for_message(bzn_envelope::kStatusRequest, _)).WillOnce(Invoke(\n        [&](auto, auto handler)\n        {\n            pbh = handler;\n            return true;\n        }));\n\n    status->start();\n\n    // make protobuf request...\n    EXPECT_CALL(*mock_status_provider, get_name()).WillOnce(Invoke(\n        [](){ return \"mock1\";})).WillOnce(Invoke([](){return \"mock2\";}));\n\n    EXPECT_CALL(*mock_status_provider, get_status()).WillRepeatedly(Invoke(\n        []()\n        {\n            bzn::json_message status;\n            status[\"line\"] = __LINE__;\n            status[\"file\"] = __FILE__;\n            return status;\n        }));\n\n    EXPECT_CALL(*mock_session, send_signed_message(_)).WillOnce(Invoke(\n        [&](auto env)\n        {\n            ASSERT_EQ(env->payload_case(), bzn_envelope::kStatusResponse);\n\n            status_response sr;\n            ASSERT_TRUE(sr.ParseFromString(env->status_response()));\n            ASSERT_TRUE(sr.pbft_enabled());\n            ASSERT_EQ(sr.swarm_version(), SWARM_VERSION);\n            ASSERT_EQ(sr.swarm_id(), SWARM_ID);\n            ASSERT_EQ(sr.swarm_git_commit(), SWARM_GIT_COMMIT);\n            ASSERT_EQ(sr.uptime(), \"0 days, 0 hours, 0 minutes\");\n\n            Json::CharReaderBuilder builder;\n            Json::CharReader* reader = builder.newCharReader();\n            bzn::json_message ms;\n            std::string error;\n            ASSERT_TRUE(reader->parse(sr.module_status_json().c_str(), sr.module_status_json().c_str() + sr.module_status_json().size(), &ms, &error));\n            ASSERT_EQ(ms[\"module\"].size(), size_t(2));\n            ASSERT_EQ(ms[\"module\"][0][\"name\"].asString(), \"mock1\");\n            ASSERT_EQ(ms[\"module\"][1][\"name\"].asString(), \"mock2\");\n            delete reader;\n        }));\n\n    pbh(bzn_envelope(), mock_session);\n}\n"
  },
  {
    "path": "storage/CMakeLists.txt",
    "content": "add_library(storage STATIC\n    mem_storage.cpp\n    mem_storage.hpp\n    storage_base.hpp\n    rocksdb_storage.hpp\n    rocksdb_storage.cpp)\n\ntarget_link_libraries(storage)\nadd_dependencies(storage boost jsoncpp rocksdb)\ntarget_include_directories(storage PRIVATE ${BLUZELLE_STD_INCLUDES})\n\nadd_subdirectory(test)\n"
  },
  {
    "path": "storage/mem_storage.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <storage/mem_storage.hpp>\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/serialization/unordered_map.hpp>\n#include <boost/serialization/map.hpp>\n#include <sstream>\n\nusing namespace bzn;\n\n\nbzn::storage_result\nmem_storage::create(const bzn::uuid_t& uuid, const bzn::key_t& key, const bzn::value_t& value)\n{\n    std::lock_guard<std::shared_mutex> lock(this->kv_store_lock); // lock for write access\n\n    if (value.size() > bzn::MAX_VALUE_SIZE)\n    {\n        return bzn::storage_result::value_too_large;\n    }\n\n    if (key.size() > bzn::MAX_KEY_SIZE)\n    {\n        return bzn::storage_result::key_too_large;\n    }\n\n    if (auto search = this->kv_store.find(uuid); search != this->kv_store.end())\n    {\n        if (search->second.second.find(key)!= search->second.second.end() )\n        {\n            return bzn::storage_result::exists;\n        }\n    }\n\n    auto& inner_db =  this->kv_store[uuid];\n\n    if (inner_db.second.find(key) == inner_db.second.end())\n    {\n        inner_db.first += value.size() + key.size();\n        inner_db.second.insert(std::make_pair(key,value));\n    }\n    else\n    {\n        return bzn::storage_result::exists;\n    }\n\n    return bzn::storage_result::ok;\n}\n\n\nstd::optional<bzn::value_t>\nmem_storage::read(const bzn::uuid_t& uuid, const bzn::key_t& key)\n{\n    std::shared_lock<std::shared_mutex> lock(this->kv_store_lock); // lock for read access\n\n    auto search = this->kv_store.find(uuid);\n\n    if (search == this->kv_store.end())\n    {\n        return std::nullopt;\n    }\n\n    // we have the db, let's see if the key exists\n    auto& inner_db = search->second;\n    auto inner_search = inner_db.second.find(key);\n    if (inner_search == inner_db.second.end())\n    {\n        return std::nullopt;\n    }\n    return inner_search->second;\n}\n\n\nbzn::storage_result\nmem_storage::update(const bzn::uuid_t& uuid, const bzn::key_t& key, const bzn::value_t& value)\n{\n    std::lock_guard<std::shared_mutex> lock(this->kv_store_lock); // lock for write access\n\n    if (value.size() > bzn::MAX_VALUE_SIZE)\n    {\n        return bzn::storage_result::value_too_large;\n    }\n\n    auto search = this->kv_store.find(uuid);\n\n    if (search == this->kv_store.end())\n    {\n        return bzn::storage_result::not_found;\n    }\n\n    // we have the db, let's see if the key exists\n    auto& inner_db = search->second;\n    auto inner_search = inner_db.second.find(key);\n\n    if (inner_search == inner_db.second.end())\n    {\n        return bzn::storage_result::not_found;\n    }\n\n    inner_db.first -= inner_search->second.size();\n    inner_search->second = value;\n    inner_db.first += inner_search->second.size();\n\n    return bzn::storage_result::ok;\n}\n\n\nbzn::storage_result\nmem_storage::remove(const bzn::uuid_t& uuid, const bzn::key_t& key)\n{\n    std::lock_guard<std::shared_mutex> lock(this->kv_store_lock); // lock for write access\n\n    auto search = this->kv_store.find(uuid);\n\n    if (search == this->kv_store.end())\n    {\n        return bzn::storage_result::not_found;\n    }\n\n    auto record = search->second.second.find(key);\n\n    if (record == search->second.second.end())\n    {\n        return bzn::storage_result::not_found;\n    }\n\n    search->second.first -= (record->second.size() + key.size());\n    search->second.second.erase(record);\n    return bzn::storage_result::ok;\n}\n\n\nstd::vector<bzn::key_t>\nmem_storage::get_keys(const bzn::uuid_t& uuid)\n{\n    std::shared_lock<std::shared_mutex> lock(this->kv_store_lock); // lock for read access\n\n    auto inner_db = this->kv_store.find(uuid);\n\n    if (inner_db == this->kv_store.end())\n    {\n        return {};\n    }\n\n    std::vector<bzn::key_t> keys;\n    for (const auto& p : inner_db->second.second)\n    {\n        keys.emplace_back(p.first);\n    }\n\n    return keys;\n}\n\n\nbool\nmem_storage::has(const bzn::uuid_t& uuid, const bzn::key_t& key)\n{\n    const auto v = this->get_keys(uuid);\n    return std::find(v.begin(), v.end(), key) != v.end();\n}\n\n\nstd::pair<std::size_t, std::size_t>\nmem_storage::get_size(const bzn::uuid_t& uuid)\n{\n    std::shared_lock<std::shared_mutex> lock(this->kv_store_lock); // lock for read access\n\n    auto it = this->kv_store.find(uuid);\n\n    if (it == this->kv_store.end())\n    {\n        // database not found...\n        return std::make_pair(0,0);\n    }\n\n    return std::make_pair(it->second.second.size(), it->second.first);\n}\n\n\nstd::optional<std::size_t>\nmem_storage::get_key_size(const bzn::uuid_t& uuid, const bzn::key_t& key)\n{\n    std::shared_lock<std::shared_mutex> lock(this->kv_store_lock); // lock for read access\n\n    auto search = this->kv_store.find(uuid);\n\n    if (search == this->kv_store.end())\n    {\n        return std::nullopt;\n    }\n\n    // we have the db, let's see if the key exists\n    auto& inner_db = search->second;\n    auto inner_search = inner_db.second.find(key);\n    if (inner_search == inner_db.second.end())\n    {\n        return std::nullopt;\n    }\n\n    return inner_search->first.size() + inner_search->second.size();\n}\n\n\nbzn::storage_result\nmem_storage::remove(const bzn::uuid_t& uuid)\n{\n    std::lock_guard<std::shared_mutex> lock(this->kv_store_lock); // lock for write access\n\n    if (auto it = this->kv_store.find(uuid); it != this->kv_store.end())\n    {\n        this->kv_store.erase(it);\n\n        return bzn::storage_result::ok;\n    }\n\n    return bzn::storage_result::not_found;\n}\n\n\nbool\nmem_storage::create_snapshot()\n{\n    std::shared_lock<std::shared_mutex> lock(this->kv_store_lock); // lock for read access\n\n    try\n    {\n        std::stringstream strm;\n        boost::archive::text_oarchive archive(strm);\n        archive << this->kv_store;\n        this->latest_snapshot = std::make_shared<std::string>(strm.str());\n\n        return true;\n    }\n    catch (std::exception& ex)\n    {\n        LOG(error) << \"Exception creating snapshot: \" << ex.what();\n    }\n\n    return false;\n}\n\n\nstd::shared_ptr<std::string>\nmem_storage::get_snapshot()\n{\n    std::shared_lock<std::shared_mutex> lock(this->kv_store_lock); // lock for read access\n    return this->latest_snapshot;\n}\n\n\nbool\nmem_storage::load_snapshot(const std::string& data)\n{\n    std::shared_lock<std::shared_mutex> lock(this->kv_store_lock); // lock for write access\n\n    try\n    {\n        std::stringstream strm(data);\n        boost::archive::text_iarchive archive(strm);\n        archive >> this->kv_store;\n        this->latest_snapshot = std::make_shared<std::string>(data);\n\n        return true;\n    }\n    catch (std::exception& ex)\n    {\n        LOG(error) << \"Exception loading snapshot: \" << ex.what();\n    }\n\n    return false;\n}\n\n\nvoid\nmem_storage::remove_range(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last)\n{\n    std::lock_guard<std::shared_mutex> lock(this->kv_store_lock); // lock for write access\n\n    auto inner_db = this->kv_store.find(uuid);\n    if (inner_db != this->kv_store.end())\n    {\n        auto match = inner_db->second.second.lower_bound(first);\n        auto end = inner_db->second.second.lower_bound(last);\n        while (match != end)\n        {\n            inner_db->second.first -= (match->second.size() + match->first.size());\n            match = inner_db->second.second.erase(match);\n        }\n    }\n}\n\n\nvoid\nmem_storage::do_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last,\n    std::optional<std::function<bool(const bzn::key_t&, const bzn::value_t&)>> predicate,\n    std::function<void(const bzn::key_t&, const bzn::value_t&)> action)\n{\n    if (!last.empty() && last <= first)\n    {\n        return;\n    }\n\n    std::shared_lock<std::shared_mutex> lock(this->kv_store_lock); // lock for read access\n\n    auto inner_db = this->kv_store.find(uuid);\n    if (inner_db != this->kv_store.end())\n    {\n        auto end_it = last.empty() ? inner_db->second.second.end() : inner_db->second.second.lower_bound(last);\n        for (auto it = inner_db->second.second.lower_bound(first); it != inner_db->second.second.end() && it != end_it; it++)\n        {\n            if (!predicate || (*predicate)(it->first, it->second))\n            {\n                action(it->first, it->second);\n            }\n        }\n    }\n}\n\n\nstd::vector<std::pair<bzn::key_t, bzn::value_t>>\nmem_storage::read_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last,\n    std::optional<std::function<bool(const bzn::key_t&, const bzn::value_t&)>> predicate)\n{\n    std::vector<std::pair<bzn::key_t, bzn::value_t>> matches;\n\n    this->do_if(uuid, first, last, predicate, [&](auto key, auto value)\n    {\n        matches.emplace_back(std::make_pair(key, value));\n    });\n\n    return matches;\n}\n\n\nstd::vector<bzn::key_t>\nmem_storage::get_keys_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last\n    , std::optional<std::function<bool(const bzn::key_t&, const bzn::value_t&)>> predicate)\n{\n    std::vector<bzn::key_t> keys;\n    this->do_if(uuid, first, last, predicate, [&](auto key, auto /*value*/)\n    {\n        keys.emplace_back(key);\n    });\n\n    return keys;\n}\n"
  },
  {
    "path": "storage/mem_storage.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <include/bluzelle.hpp>\n#include <storage/storage_base.hpp>\n#include <unordered_map>\n#include <shared_mutex>\n\n\nnamespace bzn\n{\n    class mem_storage : public bzn::storage_base\n    {\n    public:\n\n        bzn::storage_result create(const bzn::uuid_t& uuid, const bzn::key_t& key, const bzn::value_t& value) override;\n\n        std::optional<bzn::value_t> read(const bzn::uuid_t& uuid, const bzn::key_t& key) override;\n\n        bzn::storage_result update(const bzn::uuid_t& uuid, const bzn::key_t& key, const bzn::value_t& value) override;\n\n        bzn::storage_result remove(const bzn::uuid_t& uuid, const bzn::key_t& key) override;\n\n        std::vector<bzn::key_t> get_keys(const bzn::uuid_t& uuid) override;\n\n        bool has(const bzn::uuid_t& uuid, const bzn::key_t& key) override;\n\n        std::pair<std::size_t, std::size_t> get_size(const bzn::uuid_t& uuid) override;\n\n        std::optional<std::size_t> get_key_size(const bzn::uuid_t& uuid, const bzn::key_t& key) override;\n\n        bzn::storage_result remove(const bzn::uuid_t& uuid) override;\n\n        bool create_snapshot() override;\n\n        std::shared_ptr<std::string> get_snapshot() override;\n\n        bool load_snapshot(const std::string& data) override;\n\n        void remove_range(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last) override;\n\n        std::vector<std::pair<bzn::key_t, bzn::value_t>> read_if(const bzn::uuid_t& uuid,\n            const bzn::key_t& first, const bzn::key_t& last,\n            std::optional<std::function<bool(const bzn::key_t&, const bzn::value_t&)>> predicate = std::nullopt) override;\n\n        std::vector<bzn::key_t> get_keys_if(const bzn::uuid_t& uuid,\n            const bzn::key_t& first, const bzn::key_t& last,\n            std::optional<std::function<bool(const bzn::key_t&, const bzn::value_t&)>> predicate = std::nullopt) override;\n\n    private:\n        std::unordered_map<bzn::uuid_t, std::pair<uint32_t, std::map<bzn::key_t, bzn::value_t>>> kv_store;\n\n        std::shared_mutex kv_store_lock; // for multi-reader and single writer access\n\n        std::shared_ptr<std::string> latest_snapshot;\n\n        void do_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last,\n            std::optional<std::function<bool(const bzn::key_t&, const bzn::value_t&)>> predicate,\n            std::function<void(const bzn::key_t&, const bzn::value_t&)> action);\n    };\n\n} // bzn\n"
  },
  {
    "path": "storage/rocksdb_storage.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <storage/rocksdb_storage.hpp>\n#include <boost/filesystem.hpp>\n#include <rocksdb/db_dump_tool.h>\n#include <thread>\n\nusing namespace bzn;\n\nnamespace\n{\n    const bzn::key_t METADATA_UUID{\"METADATA\"};\n    const bzn::key_t NAMESPACE_KEY{\"NAMESPACE\"};\n    const bzn::key_t SIZE_KEY{\"SIZE\"};\n\n    inline bzn::key_t generate_key(const bzn::uuid_t& uuid, const bzn::key_t& key)\n    {\n        return uuid+key;\n    }\n}\n\n\nrocksdb_storage::rocksdb_storage(const std::string& state_dir, const std::string& db_name, const bzn::uuid_t& uuid)\n    : db_path(boost::filesystem::path(state_dir).append(uuid).append(db_name).string())\n    , snapshot_file(boost::filesystem::path(state_dir).append(uuid).append(\"SNAPSHOT.\" + db_name).string())\n{\n    this->open();\n}\n\n\nvoid\nrocksdb_storage::open()\n{\n    rocksdb::Options options;\n\n    options.IncreaseParallelism(std::thread::hardware_concurrency());\n    options.OptimizeLevelStyleCompaction();\n    options.create_if_missing = true;\n\n    rocksdb::DB* rocksdb;\n\n    boost::filesystem::create_directories(db_path);\n\n    LOG(info) << \"database path: \" << db_path;\n\n    rocksdb::Status s = rocksdb::DB::Open(options, db_path, &rocksdb);\n\n    if (!s.ok())\n    {\n        throw std::runtime_error(\"Could not open database: \" + s.ToString());\n    }\n\n    this->db.reset(rocksdb);\n}\n\n\nbzn::storage_result\nrocksdb_storage::create(const bzn::uuid_t& uuid, const bzn::key_t& key, const bzn::value_t& value)\n{\n    if (value.size() > bzn::MAX_VALUE_SIZE)\n    {\n        return bzn::storage_result::value_too_large;\n    }\n\n    if (key.size() > bzn::MAX_KEY_SIZE)\n    {\n        return bzn::storage_result::key_too_large;\n    }\n\n    rocksdb::WriteOptions write_options;\n    write_options.sync = true;\n\n    std::lock_guard<std::shared_mutex> lock(this->lock); // lock for write access\n\n    if (!this->has_priv(uuid, key))\n    {\n        const uint32_t ns_prev_size = this->get_metadata_size(uuid, NAMESPACE_KEY, SIZE_KEY);\n\n        auto s = this->db->Put(write_options, generate_key(uuid, key), value);\n\n        if (!s.ok())\n        {\n            LOG(error) << \"save failed: \" << uuid << \":\" << key << \":\" <<\n                value.substr(0,MAX_MESSAGE_SIZE) << \"... - \" << s.ToString();\n\n            return bzn::storage_result::not_saved;\n        }\n\n        // update metadata...\n        this->update_metadata_size(uuid, NAMESPACE_KEY, SIZE_KEY, ns_prev_size + value.size() + key.size());\n        this->update_metadata_size(uuid, SIZE_KEY, key, value.size() + key.size());\n\n#ifdef __APPLE__\n        this->db_flush();\n#endif\n\n        return bzn::storage_result::ok;\n    }\n\n    return bzn::storage_result::exists;\n}\n\n\nvoid\nrocksdb_storage::db_flush() const\n{\n    rocksdb::FlushOptions flush_options;\n    flush_options.wait = false;\n    db->Flush(flush_options);\n}\n\n\nstd::optional<bzn::value_t>\nrocksdb_storage::read(const bzn::uuid_t& uuid, const bzn::key_t& key)\n{\n    std::shared_lock<std::shared_mutex> lock(this->lock); // lock for read access\n\n    bzn::value_t value;\n    auto s = this->db->Get(rocksdb::ReadOptions(), generate_key(uuid, key), &value);\n\n    if (!s.ok())\n    {\n        return std::nullopt;\n    }\n\n    return value;\n}\n\n\nbzn::storage_result\nrocksdb_storage::update(const bzn::uuid_t& uuid, const bzn::key_t& key, const bzn::value_t& value)\n{\n    if (value.size() > bzn::MAX_VALUE_SIZE)\n    {\n        return bzn::storage_result::value_too_large;\n    }\n\n    std::lock_guard<std::shared_mutex> lock(this->lock); // lock for write access\n\n    if (this->has_priv(uuid, key))\n    {\n        const uint32_t prev_size = this->get_metadata_size(uuid, SIZE_KEY, key);\n        const uint32_t ns_prev_size = this->get_metadata_size(uuid, NAMESPACE_KEY, SIZE_KEY);\n\n        rocksdb::WriteOptions write_options;\n        write_options.sync = true;\n\n        auto s = this->db->Put(write_options, generate_key(uuid, key), value);\n\n        if (!s.ok())\n        {\n            LOG(error) << \"update failed: \" << uuid << \":\" << key << \":\" <<\n                value.substr(0,MAX_MESSAGE_SIZE) << \"... - \" << s.ToString();\n\n            return bzn::storage_result::not_saved;\n        }\n\n        // update metadata...\n        this->update_metadata_size(uuid, NAMESPACE_KEY, SIZE_KEY, ns_prev_size - prev_size + value.size() + key.size());\n        this->update_metadata_size(uuid, SIZE_KEY, key, value.size() + key.size());\n\n#ifdef __APPLE__\n        this->db_flush();\n#endif\n\n        return bzn::storage_result::ok;\n    }\n\n    return bzn::storage_result::not_found;\n}\n\n\nbzn::storage_result\nrocksdb_storage::remove(const bzn::uuid_t& uuid, const bzn::key_t& key)\n{\n    rocksdb::WriteOptions write_options;\n    write_options.sync = true;\n\n    std::lock_guard<std::shared_mutex> lock(this->lock); // lock for write access\n\n    if (this->has_priv(uuid, key))\n    {\n        const uint32_t prev_size = this->get_metadata_size(uuid, SIZE_KEY, key);\n        const uint32_t ns_prev_size = this->get_metadata_size(uuid, NAMESPACE_KEY, SIZE_KEY);\n\n        auto s = this->db->Delete(write_options, generate_key(uuid, key));\n\n        if (!s.ok())\n        {\n            return bzn::storage_result::not_found;\n        }\n\n        // update metadata...\n        this->update_metadata_size(uuid, NAMESPACE_KEY, SIZE_KEY, ns_prev_size - prev_size);\n        this->delete_metadata_size(uuid, SIZE_KEY, key);\n\n        return bzn::storage_result::ok;\n    }\n\n    return bzn::storage_result::not_found;\n}\n\n\nstd::vector<bzn::key_t>\nrocksdb_storage::get_keys(const bzn::uuid_t& uuid)\n{\n    std::shared_lock<std::shared_mutex> lock(this->lock); // lock for read access\n\n    std::unique_ptr<rocksdb::Iterator> iter(this->db->NewIterator(rocksdb::ReadOptions()));\n\n    std::vector<bzn::key_t> v;\n    for (iter->Seek(uuid); iter->Valid() && iter->key().starts_with(uuid); iter->Next())\n    {\n        v.emplace_back(iter->key().ToString().substr(uuid.size()));\n    }\n\n    return v;\n}\n\n\nbool\nrocksdb_storage::has(const bzn::uuid_t& uuid, const bzn::key_t& key)\n{\n    std::shared_lock<std::shared_mutex> lock(this->lock); // lock for read access\n\n    return this->has_priv(uuid, key);\n}\n\n\nstd::pair<std::size_t, std::size_t>\nrocksdb_storage::get_size(const bzn::uuid_t& uuid)\n{\n    std::unique_ptr<rocksdb::Iterator> iter(this->db->NewIterator(rocksdb::ReadOptions()));\n\n    std::size_t keys{};\n\n    std::shared_lock<std::shared_mutex> lock(this->lock); // lock for read access\n\n    for (iter->Seek(uuid); iter->Valid() && iter->key().starts_with(uuid); iter->Next())\n    {\n        ++keys;\n    }\n\n    return std::make_pair(keys, this->get_metadata_size(uuid, NAMESPACE_KEY, SIZE_KEY));\n}\n\n\nstd::optional<std::size_t>\nrocksdb_storage::get_key_size(const bzn::uuid_t& uuid, const bzn::key_t& key)\n{\n    std::shared_lock<std::shared_mutex> lock(this->lock); // lock for read access\n\n    if (this->has_priv(uuid, key))\n    {\n        return this->get_metadata_size(uuid, SIZE_KEY, key);\n    }\n\n    return std::nullopt;\n}\n\n\nbzn::storage_result\nrocksdb_storage::remove(const bzn::uuid_t& uuid)\n{\n    rocksdb::WriteOptions write_options;\n    write_options.sync = true;\n\n    std::unique_ptr<rocksdb::Iterator> iter(this->db->NewIterator(rocksdb::ReadOptions()));\n\n    std::lock_guard<std::shared_mutex> lock(this->lock); // lock for write access\n\n    std::size_t keys_removed{};\n\n    for (iter->Seek(uuid); iter->Valid() && iter->key().starts_with(uuid); iter->Next())\n    {\n        auto s = this->db->Delete(write_options, iter->key());\n\n        if (!s.ok())\n        {\n            LOG(error) << \"delete failed: \" << uuid << \":\" <<  s.ToString();\n        }\n\n        ++keys_removed;\n    }\n\n    for (iter->Seek(METADATA_UUID+uuid); iter->Valid() && iter->key().starts_with(METADATA_UUID+uuid); iter->Next())\n    {\n        auto s = this->db->Delete(write_options, iter->key());\n\n        if (!s.ok())\n        {\n            LOG(error) << \"metadata delete failed: \" << uuid << \":\" <<  s.ToString();\n        }\n    }\n\n    return (keys_removed) ? bzn::storage_result::ok : bzn::storage_result::not_found;\n}\n\n\nbool\nrocksdb_storage::has_priv(const bzn::uuid_t& uuid, const bzn::key_t& key)\n{\n    const bzn::key_t has_key = generate_key(uuid, key);\n\n    std::unique_ptr<rocksdb::Iterator> iter(this->db->NewIterator(rocksdb::ReadOptions()));\n\n    for (iter->Seek(uuid); iter->Valid() && iter->key().starts_with(uuid); iter->Next())\n    {\n        if (iter->key() == has_key)\n        {\n            return true;\n        }\n    }\n\n    return false;\n}\n\n\nbool\nrocksdb_storage::create_snapshot()\n{\n    rocksdb::DumpOptions dump_options;\n\n    dump_options.db_path = this->db_path;\n    dump_options.dump_location = this->snapshot_file;\n    dump_options.anonymous = true;\n\n    std::shared_lock<std::shared_mutex> lock(this->lock); // lock for read access\n\n    return rocksdb::DbDumpTool().Run(dump_options);\n}\n\n\nstd::shared_ptr<std::string>\nrocksdb_storage::get_snapshot()\n{\n    std::shared_lock<std::shared_mutex> lock(this->lock); // lock for read access\n\n    std::stringstream snapshot;\n\n    // check if file exists...\n    try\n    {\n        std::ifstream s(this->snapshot_file);\n        snapshot << s.rdbuf();\n    }\n    catch (std::exception& ex)\n    {\n        LOG(error) << \"Exception reading snapshot: \" << ex.what();\n\n        return {};\n    }\n\n    return std::make_shared<std::string>(snapshot.str());\n}\n\n\nbool\nrocksdb_storage::load_snapshot(const std::string& data)\n{\n    std::lock_guard<std::shared_mutex> lock(this->lock); // lock for write access\n\n    const std::string tmp_snapshot(this->snapshot_file + \".tmp\");\n\n    try\n    {\n        std::ofstream snapshot(tmp_snapshot);\n        snapshot << data;\n    }\n    catch (std::exception& ex)\n    {\n        LOG(error) << \"saving snapshot failed: \" << ex.what();\n\n        return false;\n    }\n\n    // bring down the database...\n    this->db.reset();\n\n    // move current database out of the way...\n    const std::string tmp_path(this->db_path + \".tmp\");\n\n    boost::system::error_code ec;\n    boost::filesystem::rename(this->db_path, tmp_path, ec);\n\n    if (ec)\n    {\n        LOG(error) << \"creating temporary db backup failed: \" << ec.message();\n\n        // bring db back online...\n        this->open();\n\n        return false;\n    }\n\n    rocksdb::UndumpOptions undump_options;\n\n    undump_options.db_path = this->db_path;\n    undump_options.dump_location = tmp_snapshot;\n    undump_options.compact_db = true;\n\n    if (rocksdb::DbUndumpTool().Run(undump_options))\n    {\n        boost::system::error_code ec;\n        boost::filesystem::remove_all(tmp_path, ec);\n        boost::filesystem::remove(this->snapshot_file);\n        boost::filesystem::rename(tmp_snapshot, this->snapshot_file);\n\n        if (ec)\n        {\n            LOG(error) << \"failed to remove temporary db backup: \" << ec.message();\n        }\n\n        // bring db back online...\n        this->open();\n\n        return true;\n    }\n\n    LOG(error) << \"failed to load snapshot\";\n\n    // any exceptions will be fatal...\n    boost::filesystem::remove_all(this->db_path);\n    boost::filesystem::rename(tmp_path, this->db_path);\n    boost::filesystem::remove(tmp_snapshot);\n\n    // bring db back online...\n    this->open();\n\n    return false;\n}\n\n\nvoid\nrocksdb_storage::remove_range(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last)\n{\n    std::lock_guard<std::shared_mutex> lock(this->lock); // lock for write access\n\n    std::vector<bzn::key_t> v;\n\n    auto begin_str = generate_key(uuid, first);\n    rocksdb::Slice begin(begin_str);\n\n    auto end_str = generate_key(uuid, last);\n    rocksdb::Slice end(end_str);\n\n    rocksdb::WriteOptions write_options;\n    write_options.sync = true;\n\n    // TODO: Normal db usage does not use delete range.\n    // If it ever does then namespace metadata will need to know each key\n    // removed so that it can account for it.\n\n    this->db->DeleteRange(write_options, nullptr, begin, end);\n}\n\n\nvoid\nrocksdb_storage::do_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last,\n    std::optional<std::function<bool(const bzn::key_t&, const bzn::value_t&)>> predicate,\n    std::function<void(const bzn::key_t&, const bzn::value_t&)> action)\n{\n    const auto start_key = uuid + first;\n    const auto end_key = last.empty() ? \"\" : uuid + last;\n\n    std::shared_lock<std::shared_mutex> lock(this->lock); // lock for read access\n    std::unique_ptr<rocksdb::Iterator> iter(this->db->NewIterator(rocksdb::ReadOptions()));\n\n    for (iter->Seek(start_key); iter->Valid() && iter->key().starts_with(uuid) && iter->key().ToString() >= start_key\n        && (end_key.empty() || iter->key().ToString() < end_key); iter->Next())\n    {\n        if (!predicate || (*predicate)(iter->key().ToString().substr(uuid.size()), iter->value().ToString()))\n        {\n            action(iter->key().ToString().substr(uuid.size()), iter->value().ToString());\n        }\n    }\n}\n\n\nstd::vector<std::pair<bzn::key_t, bzn::value_t>>\nrocksdb_storage::read_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last,\n    std::optional<std::function<bool(const bzn::key_t&, const bzn::value_t&)>> predicate)\n{\n    std::vector<std::pair<bzn::key_t, bzn::value_t>> matches;\n\n    this->do_if(uuid, first, last, predicate, [&](auto key, auto value)\n    {\n        matches.emplace_back(std::make_pair(key, value));\n    });\n\n    return matches;\n}\n\n\nstd::vector<bzn::key_t>\nrocksdb_storage::get_keys_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last,\n    std::optional<std::function<bool(const bzn::key_t&, const bzn::value_t&)>> predicate)\n{\n    std::vector<bzn::key_t> keys;\n    this->do_if(uuid, first, last, predicate, [&](auto key, auto /*value*/)\n    {\n        keys.emplace_back(key);\n    });\n\n    return keys;\n}\n\n\nvoid\nrocksdb_storage::update_metadata_size(const bzn::uuid_t& uuid, const bzn::key_t& metadata_key, const bzn::key_t& key,\n    uint32_t size)\n{\n    rocksdb::WriteOptions write_options;\n    write_options.sync = true;\n\n    if (!this->db->Put(write_options, generate_key(METADATA_UUID + uuid + metadata_key, key), std::to_string(size)).ok())\n    {\n        LOG(error) << \"update namespace metadata key size failed: \" << uuid << \":\" << key.substr(0, MAX_MESSAGE_SIZE);\n    }\n}\n\n\nvoid\nrocksdb_storage::delete_metadata_size(const bzn::uuid_t& uuid, const bzn::key_t& metadata_key, const bzn::key_t& key)\n{\n    rocksdb::WriteOptions write_options;\n    write_options.sync = true;\n\n    if (!this->db->Delete(write_options, generate_key(METADATA_UUID + uuid + metadata_key, key)).ok())\n    {\n        LOG(error) << \"delete namespace metadata key size failed: \" << uuid << \":\" << key.substr(0, MAX_MESSAGE_SIZE);\n    }\n}\n\n\nuint32_t\nrocksdb_storage::get_metadata_size(const bzn::uuid_t& uuid, const bzn::key_t& metadata_key, const bzn::key_t& key)\n{\n    bzn::value_t value;\n\n    if (!this->db->Get(rocksdb::ReadOptions(), generate_key(METADATA_UUID + uuid + metadata_key, key), &value).ok())\n    {\n        LOG(error) << \"reading of namespace metadata key size failed: \" << uuid << \":\" << key.substr(0, MAX_MESSAGE_SIZE);\n\n        return 0;\n    }\n\n    return boost::lexical_cast<uint32_t>(value);\n}\n"
  },
  {
    "path": "storage/rocksdb_storage.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <include/bluzelle.hpp>\n#include <storage/storage_base.hpp>\n#include <options/options_base.hpp>\n#include <rocksdb/db.h>\n#include <shared_mutex>\n\n\nnamespace bzn\n{\n    class rocksdb_storage : public bzn::storage_base\n    {\n    public:\n        rocksdb_storage(const std::string& state_dir, const std::string& db_name, const bzn::uuid_t& uuid);\n\n        bzn::storage_result create(const bzn::uuid_t& uuid, const bzn::key_t& key, const bzn::value_t& value) override;\n\n        std::optional<bzn::value_t> read(const bzn::uuid_t& uuid, const bzn::key_t& key) override;\n\n        bzn::storage_result update(const bzn::uuid_t& uuid, const bzn::key_t& key, const bzn::value_t& value) override;\n\n        bzn::storage_result remove(const bzn::uuid_t& uuid, const bzn::key_t& key) override;\n\n        std::vector<bzn::key_t> get_keys(const bzn::uuid_t& uuid) override;\n\n        bool has(const bzn::uuid_t& uuid, const  bzn::key_t& key) override;\n\n        std::pair<std::size_t, std::size_t> get_size(const bzn::uuid_t& uuid) override;\n\n        std::optional<std::size_t> get_key_size(const bzn::uuid_t& uuid, const bzn::key_t& key) override;\n\n        bzn::storage_result remove(const bzn::uuid_t& uuid) override;\n\n        bool create_snapshot() override;\n\n        std::shared_ptr<std::string> get_snapshot() override;\n\n        bool load_snapshot(const std::string& data) override;\n\n        void remove_range(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last) override;\n\n        std::vector<std::pair<bzn::key_t, bzn::value_t>> read_if(const bzn::uuid_t& uuid,\n            const bzn::key_t& first, const bzn::key_t& last,\n            std::optional<std::function<bool(const bzn::key_t&, const bzn::value_t&)>> predicate = std::nullopt) override;\n\n        std::vector<bzn::key_t> get_keys_if(const bzn::uuid_t& uuid,\n            const bzn::key_t& first, const bzn::key_t& last,\n            std::optional<std::function<bool(const bzn::key_t&, const bzn::value_t&)>> predicate = std::nullopt) override;\n\n    private:\n        void open();\n\n        // metadata....\n        void update_metadata_size(const bzn::uuid_t& uuid, const bzn::key_t& metadata_key, const bzn::key_t& key,uint32_t size);\n        void delete_metadata_size(const bzn::uuid_t& uuid, const bzn::key_t& meta_key, const bzn::key_t& key);\n        uint32_t get_metadata_size(const bzn::uuid_t& uuid, const bzn::key_t& meta_key, const bzn::key_t& key);\n\n        const std::string db_path;\n        const std::string snapshot_file;\n\n        std::unique_ptr<rocksdb::DB> db;\n\n        bool has_priv(const bzn::uuid_t& uuid, const bzn::key_t& key);\n\n        std::shared_mutex lock; // for multi-reader and single writer access\n\n        void do_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last,\n            std::optional<std::function<bool(const bzn::key_t&, const bzn::value_t&)>> predicate,\n            std::function<void(const bzn::key_t&, const bzn::value_t&)> action);\n\n        void db_flush() const;\n    };\n\n} // bzn\n"
  },
  {
    "path": "storage/storage_base.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <include/bluzelle.hpp>\n#include <optional>\n#include <unordered_map>\n#include <vector>\n\n\nnamespace bzn\n{\n    const size_t MAX_KEY_SIZE   = 4096;\n    const size_t MAX_VALUE_SIZE = 256000;\n\n    enum class storage_result : uint8_t\n    {\n        ok=0,\n        not_found,\n        exists,\n        ttl_not_found,\n        not_saved,\n        value_too_large,\n        key_too_large,\n        db_not_found,\n        db_exists,\n        db_full,\n        access_denied,\n        delete_pending,\n        invalid_argument,\n        invalid_size\n    };\n\n    const std::unordered_map<storage_result, const std::string> storage_result_msg{\n        {storage_result::ok,              \"OK\"},\n        {storage_result::not_found,       \"RECORD_NOT_FOUND\"},\n        {storage_result::exists,          \"RECORD_EXISTS\"},\n        {storage_result::ttl_not_found,   \"TTL_RECORD_NOT_FOUND\"},\n        {storage_result::not_saved,       \"NOT_SAVED\"},\n        {storage_result::value_too_large, \"VALUE_SIZE_TOO_LARGE\"},\n        {storage_result::key_too_large,   \"KEY_SIZE_TOO_LARGE\"},\n        {storage_result::db_not_found,    \"DATABASE_NOT_FOUND\"},\n        {storage_result::db_exists,       \"DATABASE_EXISTS\"},\n        {storage_result::db_full,         \"INSUFFICIENT_SPACE\"},\n        {storage_result::access_denied,   \"ACCESS_DENIED\"},\n        {storage_result::delete_pending,  \"DELETE_PENDING\"},\n        {storage_result::invalid_argument,\"INVALID_ARGUMENT\"},\n        {storage_result::invalid_size,    \"INVALID_SIZE_LIMITS_SET\"}};\n\n\n    class storage_base\n    {\n    public:\n        virtual ~storage_base() = default;\n\n        virtual bzn::storage_result create(const bzn::uuid_t& uuid, const bzn::key_t& key, const bzn::value_t& value) = 0;\n\n        virtual std::optional<bzn::value_t> read(const bzn::uuid_t& uuid, const bzn::key_t& key) = 0;\n\n        virtual bzn::storage_result update(const bzn::uuid_t& uuid, const bzn::key_t& key, const bzn::value_t& value) = 0;\n\n        virtual bzn::storage_result remove(const bzn::uuid_t& uuid, const bzn::key_t& key) = 0;\n\n        virtual std::vector<bzn::key_t> get_keys(const bzn::uuid_t& uuid) = 0;\n\n        virtual bool has(const bzn::uuid_t& uuid, const bzn::key_t& key) = 0;\n\n        virtual std::pair<std::size_t, std::size_t> get_size(const bzn::uuid_t& uuid) = 0;\n\n        virtual std::optional<std::size_t> get_key_size(const bzn::uuid_t& uuid, const bzn::key_t& key) = 0;\n\n        virtual bzn::storage_result remove(const bzn::uuid_t& uuid) = 0;\n\n        virtual bool create_snapshot() = 0;\n\n        virtual std::shared_ptr<std::string> get_snapshot() = 0;\n\n        virtual bool load_snapshot(const std::string& data) = 0;\n\n        virtual void remove_range(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last) = 0;\n\n        virtual std::vector<std::pair<bzn::key_t, bzn::value_t>> read_if(const bzn::uuid_t& uuid,\n            const bzn::key_t& first, const bzn::key_t& last,\n            std::optional<std::function<bool(const bzn::key_t&, const bzn::value_t&)>> predicate = std::nullopt) = 0;\n\n        virtual std::vector<bzn::key_t> get_keys_if(const bzn::uuid_t& uuid,\n            const bzn::key_t& first, const bzn::key_t& last,\n            std::optional<std::function<bool(const bzn::key_t&, const bzn::value_t&)>> predicate = std::nullopt) = 0;\n\n    };\n\n} // bzn\n"
  },
  {
    "path": "storage/test/CMakeLists.txt",
    "content": "set(test_srcs storage_test.cpp)\nset(test_libs storage node)\nset(test_deps rocksdb)\nset(test_link pbft pbft_operations proto ${Protobuf_LIBRARIES} ${ROCKSDB_LIBRARIES})\n\nadd_gmock_test(storage)\n"
  },
  {
    "path": "storage/test/storage_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <storage/mem_storage.hpp>\n#include <storage/rocksdb_storage.hpp>\n#include <mocks/mock_node_base.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int_distribution.hpp>\n#include <boost/filesystem.hpp>\n#include <boost/format.hpp>\n#include <cstdlib>\n#include <regex>\n#include <boost/range/irange.hpp>\n\nusing namespace ::testing;\n\nnamespace\n{\n    const bzn::uuid_t NODE_UUID = \"d1e04722-41f0-4c43-a6c0-86a9e62a88e3\";\n    const bzn::uuid_t USER_UUID = \"4bba2aeb-44fe-441e-bb6b-8817561eb716\";\n    const std::string KEY = \"bluzelle.json\";\n    std::string value = \"ewogICJsaXN0ZW5lcl9hZGRyZXNzIiA6ICIxMjcuMC4wLjEiLAogICJsaXN0ZW5lcl9wb3J0IiA6\"\n                        \"IDQ5MTUyLAogICJldGhlcmV1bSIgOiAiMHgwMDZlYWU3MjA3NzQ0OWNhY2E5MTA3OGVmNzg1NTJj\"\n                        \"MGNkOWJjZThmIgp9Cg==\";\n\n    boost::random::mt19937 gen;\n\n    std::string\n    generate_test_string(int n = 100)\n    {\n        std::string test_data;\n        test_data.resize(n);\n\n        boost::random::uniform_int_distribution<> dist('a', 'z');\n        for (auto& c : test_data)\n        {\n            c = (char) dist(gen);\n        }\n        return test_data;\n    }\n\n    // factory functions...\n    template<class T>\n    std::shared_ptr<bzn::storage_base> create_storage();\n\n    template<>\n    std::shared_ptr<bzn::storage_base> create_storage<bzn::mem_storage>()\n    {\n        return std::make_shared<bzn::mem_storage>();\n    }\n\n    template<>\n    std::shared_ptr<bzn::storage_base> create_storage<bzn::rocksdb_storage>()\n    {\n        return std::make_shared<bzn::rocksdb_storage>(\"./\", \"utest\", NODE_UUID);\n    }\n}\n\n\ntemplate<typename T>\nclass storageTest : public Test\n{\npublic:\n    storageTest()\n    {\n        // just to be safe...\n        if (system(std::string(\"rm -r -f \" + NODE_UUID).c_str())) {}\n        this->storage = create_storage<T>();\n    }\n\n    ~storageTest()\n    {\n        // For each run, the database has to be cleared out...\n        this->storage.reset();\n        if (system(std::string(\"rm -r -f \" + NODE_UUID).c_str())) {}\n    }\n\n    std::shared_ptr<bzn::storage_base> storage;\n};\n\nusing Implementations = Types<bzn::mem_storage, bzn::rocksdb_storage>;\n\nTYPED_TEST_CASE(storageTest, Implementations);\n\n\nTYPED_TEST(storageTest, test_that_storage_can_create_a_record_and_read_the_same_record)\n{\n    EXPECT_EQ(bzn::storage_result::ok, this->storage->create(USER_UUID, KEY, value));\n\n    const auto returned_record = this->storage->read(USER_UUID, KEY);\n\n    EXPECT_EQ((*returned_record).size() + KEY.size(), this->storage->get_size(USER_UUID).second);\n    EXPECT_EQ(size_t(1), this->storage->get_size(USER_UUID).first);\n\n    // add another one...\n    EXPECT_EQ(bzn::storage_result::ok, this->storage->create(USER_UUID, \"another_key\", value));\n    EXPECT_EQ(value.size()*2 + KEY.size()+std::string(\"another_key\").size(), this->storage->get_size(USER_UUID).second);\n    EXPECT_EQ(size_t(2), this->storage->get_size(USER_UUID).first);\n\n    EXPECT_EQ(*returned_record, value);\n\n    // remove first key\n    size_t size = this->storage->get_size(USER_UUID).second;\n    this->storage->remove(USER_UUID, KEY);\n    EXPECT_EQ(size-(KEY.size()+value.size()), this->storage->get_size(USER_UUID).second);\n}\n\n\nTYPED_TEST(storageTest, test_that_storage_can_retieve_a_key_size)\n{\n    EXPECT_EQ(bzn::storage_result::ok, this->storage->create(USER_UUID, KEY, value));\n\n    const auto key_size = this->storage->get_key_size(USER_UUID, KEY);\n\n    EXPECT_EQ(key_size, KEY.size() + value.size());\n}\n\n\nTYPED_TEST(storageTest, test_that_storage_fails_to_create_a_record_that_already_exists)\n{\n    EXPECT_EQ(bzn::storage_result::ok, this->storage->create(USER_UUID, KEY, value));\n\n    EXPECT_EQ(bzn::storage_result::exists, this->storage->create(USER_UUID, KEY, value));\n}\n\n\nTYPED_TEST(storageTest, test_that_attempting_to_read_a_record_from_storage_that_does_not_exist_returns_null)\n{\n    EXPECT_EQ(std::nullopt, this->storage->read(USER_UUID, \"nokey\"));\n}\n\n\nTYPED_TEST(storageTest, test_that_storage_can_update_an_existing_record)\n{\n    const std::string updated_value = \"I have changed the value of the text\";\n\n    // try updating a record that does not exist\n    EXPECT_EQ(bzn::storage_result::not_found, this->storage->update(USER_UUID, KEY, updated_value));\n\n    EXPECT_EQ(bzn::storage_result::ok, this->storage->create(USER_UUID, KEY, value));\n\n    EXPECT_EQ(bzn::storage_result::ok, this->storage->update(USER_UUID, KEY, updated_value));\n\n    const auto returned_record = this->storage->read(USER_UUID, KEY);\n\n    EXPECT_EQ(*returned_record, updated_value);\n}\n\n\nTYPED_TEST(storageTest, test_that_storage_can_delete_a_record)\n{\n    EXPECT_EQ(bzn::storage_result::ok, this->storage->create(USER_UUID, KEY, value));\n\n    const auto returned_record = this->storage->read(USER_UUID, KEY);\n\n    EXPECT_EQ(*returned_record, value);\n\n    EXPECT_EQ(bzn::storage_result::ok, this->storage->remove(USER_UUID, KEY));\n\n    EXPECT_EQ(this->storage->read(USER_UUID, KEY), std::nullopt);\n\n    EXPECT_EQ(bzn::storage_result::not_found, this->storage->remove(USER_UUID, KEY));\n}\n\n\nTYPED_TEST(storageTest, test_get_keys_returns_all_keys)\n{\n    const bzn::uuid_t user_0{\"b9dc2595-15ee-435a-8af7-7cafc132f527\"};\n    const bzn::uuid_t user_1{\"fa82925e-4657-11e8-842f-0ed5f89f718b\"};\n    const bzn::uuid_t user_2{\"f3f72dd5-efcb-4db9-b0a1-47f7891ffdef\"};\n\n    std::vector<std::string> user_keys;\n\n    std::string key;\n\n    for(int i=0; i<100; ++i)\n    {\n        key = \"key\";\n        key.append(std::to_string(i));\n        user_keys.emplace_back(key);\n\n        this->storage->create(user_0, key, generate_test_string());\n        this->storage->create(user_1, key, generate_test_string());\n        this->storage->create(user_2, key, generate_test_string());\n    }\n\n    std::vector<std::string> user_0_keys = this->storage->get_keys(user_0);\n    std::vector<std::string> user_1_keys = this->storage->get_keys(user_1);\n    std::vector<std::string> user_2_keys = this->storage->get_keys(user_2);\n\n    EXPECT_EQ(user_0_keys.size(), user_keys.size());\n    EXPECT_EQ(user_1_keys.size(), user_keys.size());\n    EXPECT_EQ(user_2_keys.size(), user_keys.size());\n\n\n    std::sort(user_keys.begin(), user_keys.end());\n    std::sort(user_0_keys.begin(), user_0_keys.end());\n    std::sort(user_1_keys.begin(), user_1_keys.end());\n    std::sort(user_2_keys.begin(), user_2_keys.end());\n\n    if (user_0_keys.size() >0)\n    {\n        EXPECT_TRUE(std::equal(user_keys.begin(), user_keys.end(), user_0_keys.begin() ));\n        EXPECT_TRUE(std::equal(user_keys.begin(), user_keys.end(), user_1_keys.begin() ));\n        EXPECT_TRUE(std::equal(user_keys.begin(), user_keys.end(), user_2_keys.begin() ));\n    }\n}\n\n\nTYPED_TEST(storageTest, test_has_returns_true_if_key_exists_false_otherwise)\n{\n    const bzn::uuid_t user_0{\"b9dc2595-15ee-435a-8af7-7cafc132f527\"};\n    const bzn::uuid_t user_1{\"fa82925e-4657-11e8-842f-0ed5f89f718b\"};\n    const bzn::uuid_t user_2{\"f3f72dd5-efcb-4db9-b0a1-47f7891ffdef\"};\n\n    std::vector<std::string> user_keys;\n\n    std::string key;\n\n    for(int i=0; i<100; ++i)\n    {\n        key = \"key\";\n        key.append(std::to_string(i));\n        user_keys.emplace_back(key);\n\n        this->storage->create(user_0, key, generate_test_string());\n        this->storage->create(user_1, key, generate_test_string());\n        this->storage->create(user_2, key, generate_test_string());\n    }\n\n    EXPECT_TRUE(this->storage->has(user_0, \"key0\"));\n    EXPECT_FALSE(this->storage->has(user_0, \"notkey0\"));\n\n    EXPECT_TRUE(this->storage->has(user_1, \"key1\"));\n    EXPECT_FALSE(this->storage->has(user_1, \"notkey\"));\n\n    EXPECT_TRUE(this->storage->has(user_2, \"key2\"));\n    EXPECT_FALSE(this->storage->has(user_2, \"notkey\"));\n}\n\n\nTYPED_TEST(storageTest, test_that_storage_fails_to_create_a_value_that_exceeds_the_size_limit)\n{\n    std::string value{\"\"};\n    value.resize(bzn::MAX_VALUE_SIZE+1, 'c');\n    EXPECT_EQ(bzn::storage_result::value_too_large, this->storage->create(USER_UUID, KEY, value));\n    EXPECT_EQ(std::nullopt, this->storage->read(USER_UUID, KEY));\n}\n\n\nTYPED_TEST(storageTest, test_that_storage_fails_to_update_with_a_value_that_exceeds_the_size_limit)\n{\n    std::string expected_value{\"gooddata\"};\n    EXPECT_EQ(bzn::storage_result::ok, this->storage->create(USER_UUID, KEY, expected_value));\n    auto actual_record = this->storage->read(USER_UUID, KEY);\n    EXPECT_EQ(expected_value, actual_record);\n\n    std::string bad_value{\"\"};\n    bad_value.resize(bzn::MAX_VALUE_SIZE+1, 'c');\n    EXPECT_EQ(bzn::storage_result::value_too_large, this->storage->update(USER_UUID, KEY, bad_value));\n    EXPECT_EQ(expected_value, *this->storage->read(USER_UUID, KEY));\n}\n\n\nTYPED_TEST(storageTest, test_that_storage_can_remove_all_keys_values_associated_with_a_uuid)\n{\n    EXPECT_EQ(bzn::storage_result::ok, this->storage->create(USER_UUID, \"key1\", \"\"));\n    EXPECT_EQ(bzn::storage_result::ok, this->storage->create(USER_UUID, \"key2\", \"\"));\n    EXPECT_EQ(bzn::storage_result::ok, this->storage->create(USER_UUID, \"key3\", \"\"));\n    EXPECT_EQ(bzn::storage_result::ok, this->storage->remove(USER_UUID));\n    EXPECT_EQ(std::nullopt, this->storage->read(USER_UUID, KEY));\n}\n\n\nTYPED_TEST(storageTest, test_snapshot)\n{\n    const bzn::uuid_t user_0{\"b9dc2595-15ee-435a-8af7-7cafc132f527\"};\n\n    this->storage->create(user_0, \"key1\", \"value1\");\n    EXPECT_TRUE(this->storage->has(user_0, \"key1\"));\n    EXPECT_TRUE(this->storage->create_snapshot());\n\n    this->storage->create(user_0, \"key2\", \"value2\");\n    this->storage->create(user_0, \"key3\", \"value3\");\n    EXPECT_TRUE(this->storage->has(user_0, \"key2\"));\n    EXPECT_TRUE(this->storage->has(user_0, \"key3\"));\n\n    auto state = this->storage->get_snapshot();\n    EXPECT_NE(state, nullptr);\n\n    EXPECT_FALSE(this->storage->load_snapshot(\"aslkdfkslfdk\"));\n    EXPECT_TRUE(this->storage->load_snapshot(*state));\n    EXPECT_TRUE(this->storage->has(user_0, \"key1\"));\n    EXPECT_FALSE(this->storage->has(user_0, \"key2\"));\n    EXPECT_FALSE(this->storage->has(user_0, \"key3\"));\n}\n\nTYPED_TEST(storageTest, test_range_queries)\n{\n    const bzn::uuid_t user_0{\"b9dc2595-15ee-435a-8af7-7cafc132f527\"};\n\n    this->storage->create(user_0, \"aaa\", \"value\");\n    this->storage->create(user_0, \"aab\", \"value\");\n    this->storage->create(user_0, \"abb\", \"value\");\n    this->storage->create(user_0, \"abc\", \"value\");\n    this->storage->create(user_0, \"bbc\", \"value\");\n    this->storage->create(user_0, \"bcc\", \"value\");\n    this->storage->create(user_0, \"bcd\", \"value\");\n    this->storage->create(user_0, \"bdd\", \"value\");\n    this->storage->create(user_0, \"bde\", \"value\");\n    EXPECT_EQ(this->storage->get_size(user_0).first, 9u);\n\n    EXPECT_EQ(this->storage->get_keys_if(user_0, \"a\", \"b\").size(), 4u);\n    EXPECT_EQ(this->storage->read_if(user_0, \"b\", \"c\").size(), 5u);\n    EXPECT_EQ(this->storage->get_keys_if(user_0, \"c\", \"d\").size(), 0u);\n    EXPECT_EQ(this->storage->read_if(user_0, \"ab\", \"ac\").size(), 2u);\n\n    this->storage->remove_range(user_0, \"a\", \"abb\");\n    EXPECT_EQ(this->storage->get_size(user_0).first, 7u);\n\n    this->storage->remove_range(user_0, \"aa\", \"bdd\");\n    EXPECT_EQ(this->storage->get_size(user_0).first, 2u);\n\n    this->storage->remove_range(user_0, \"be\", \"z\");\n    EXPECT_EQ(this->storage->get_size(user_0).first, 2u);\n}\n\nTYPED_TEST(storageTest, test_predicate_queries)\n{\n    const bzn::uuid_t user_0{\"b9dc2595-15ee-435a-8af7-7cafc132f527\"};\n\n    for (auto i : boost::irange(0, 100))\n    {\n        // this line, for some unknown reason, causes the following build error:\n        // in function `bzn::pbft_persistent_operation::is_committed() const':\n        // undefined reference to `bzn::pbft::honest_majority_size(unsigned long)'\n        //auto suffix = (boost::format(\"%04u\") % i).str();\n\n        auto suffix = i < 10 ? std::string{\"000\"} + std::to_string(i) : std::string{\"00\"} + std::to_string(i);\n        this->storage->create(user_0, \"key_\" + suffix, \"value_\" + suffix);\n    }\n\n    for (auto i : boost::irange(1, 10))\n    {\n        size_t count{};\n        auto res = this->storage->read_if(user_0, \"\", \"\",\n            [&](const std::string& /*key*/, const std::string& /*value*/) -> bool\n            {\n                return ++count % i == 0;\n            });\n\n        EXPECT_EQ(res.size(), count / i);\n    }\n\n    for (auto i : boost::irange(1, 10))\n    {\n        size_t count{};\n        auto res = this->storage->get_keys_if(user_0, \"\", \"\",\n            [&](const std::string& /*key*/, const std::string& /*value*/) -> bool\n            {\n                return ++count % i == 0;\n            });\n\n        EXPECT_EQ(res.size(), count / i);\n    }\n}\n\nTYPED_TEST(storageTest, test_regex_match_queries)\n{\n    const bzn::uuid_t user_0{\"b9dc2595-15ee-435a-8af7-7cafc132f527\"};\n\n    this->storage->create(user_0, \"0001_somehash_1_0\", \"value\");\n    this->storage->create(user_0, \"0001_somehash_1_1\", \"value\");\n    this->storage->create(user_0, \"0001_somehash_1_2\", \"value\");\n\n    this->storage->create(user_0, \"0002_somehash_1_0\", \"value\");\n    this->storage->create(user_0, \"0002_somehash_1_1\", \"value\");\n\n    this->storage->create(user_0, \"0003_otherhash_1_0\", \"value\");\n    this->storage->create(user_0, \"0003_somehash_1_11\", \"value\");\n    this->storage->create(user_0, \"0003_somehash_1_2\", \"value\");\n\n    this->storage->create(user_0, \"0004_somehash_2_0\", \"value\");\n\n    this->storage->create(user_0, \"0005_otherhash_2_0\", \"value\");\n    this->storage->create(user_0, \"0005_another_hash_2_1\", \"value\");\n    this->storage->create(user_0, \"0005_somehash_2_2\", \"value\");\n\n    this->storage->create(user_0, \"0006_somehash_1_0\", \"value\");\n    this->storage->create(user_0, \"0006_somehash_1_1\", \"value\");\n    this->storage->create(user_0, \"0006_another_hash_1_2\", \"value\");\n\n    EXPECT_EQ(this->storage->read_if(user_0, \"\", \"\").size(), 15u);\n    EXPECT_EQ(this->storage->read_if(user_0, \"0003\", \"0004\").size(), 3u);\n    EXPECT_EQ(this->storage->read_if(user_0, \"0003\", \"\").size(), 10u);\n    EXPECT_EQ(this->storage->read_if(user_0, \"0003\", \"0003\").size(), 0u);\n    EXPECT_EQ(this->storage->read_if(user_0, \"0003\", \"0002\").size(), 0u);\n\n    std::regex exp1(\".*_.*_1_.*\");\n    auto match_key1 = [&](const std::string& key, const std::string& /*value*/)->bool\n    {\n        return std::regex_search(key, exp1, std::regex_constants::match_continuous);\n    };\n\n    EXPECT_EQ(this->storage->read_if(user_0, \"\", \"\", match_key1).size(), 11u);\n    EXPECT_EQ(this->storage->read_if(user_0, \"0002\", \"\", match_key1).size(), 8u);\n    EXPECT_EQ(this->storage->read_if(user_0, \"0002\", \"0006\", match_key1).size(), 5u);\n\n    std::regex exp2(\".*_.*_.*_1$\");\n    auto match_key2 = [&](const std::string& key, const std::string& /*value*/)->bool\n    {\n        return std::regex_search(key, exp2, std::regex_constants::match_continuous);\n    };\n\n    EXPECT_EQ(this->storage->read_if(user_0, \"\", \"\", match_key2).size(), 4u);\n    EXPECT_EQ(this->storage->read_if(user_0, \"0002\", \"\", match_key2).size(), 3u);\n    EXPECT_EQ(this->storage->read_if(user_0, \"0002\", \"0006\", match_key2).size(), 2u);\n\n    std::regex exp3(\".*_.*_.*_[1-2]$\");\n    auto match_key3 = [&](const std::string& key, const std::string& /*value*/)->bool\n    {\n        return std::regex_search(key, exp3, std::regex_constants::match_continuous);\n    };\n\n    EXPECT_EQ(this->storage->read_if(user_0, \"\", \"\", match_key3).size(), 8u);\n    EXPECT_EQ(this->storage->read_if(user_0, \"0002\", \"\", match_key3).size(), 6u);\n    EXPECT_EQ(this->storage->read_if(user_0, \"0002\", \"0006\", match_key3).size(), 4u);\n}\n"
  },
  {
    "path": "swarm/CMakeLists.txt",
    "content": "add_executable(swarm main.cpp)\nadd_dependencies(swarm boost jsoncpp rocksdb)\ntarget_include_directories(swarm PRIVATE ${BLUZELLE_STD_INCLUDES})\ntarget_link_libraries(swarm node pbft audit crud chaos options utils peers_beacon storage crypto monitor proto ${Protobuf_LIBRARIES} status ${ROCKSDB_LIBRARIES} ${Boost_LIBRARIES} ${JSONCPP_LIBRARIES} pthread)\n"
  },
  {
    "path": "swarm/main.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <audit/audit.hpp>\n#include <peers_beacon/peers_beacon.hpp>\n#include <chaos/chaos.hpp>\n#include <crud/crud.hpp>\n#include <crud/subscription_manager.hpp>\n#include <crypto/crypto.hpp>\n#include <crypto/crypto_base.hpp>\n#include <node/node.hpp>\n#include <options/options.hpp>\n#include <options/simple_options.hpp>\n#include <pbft/pbft.hpp>\n#include <pbft/database_pbft_service.hpp>\n#include <status/status.hpp>\n#include <storage/mem_storage.hpp>\n#include <storage/rocksdb_storage.hpp>\n#include <monitor/monitor.hpp>\n#include <utils/utils_interface.hpp>\n\n#ifdef __APPLE__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wunused-parameter\"\n#endif\n#include <boost/log/utility/setup/console.hpp>\n#ifdef __APPLE__\n#pragma GCC diagnostic pop\n#endif\n\n#include <boost/log/utility/setup/file.hpp>\n#include <boost/program_options.hpp>\n#include <boost/filesystem.hpp>\n#include <boost/log/expressions.hpp>\n#include <boost/log/support/date_time.hpp>\n#include <boost/log/utility/setup/common_attributes.hpp>\n#include <thread>\n\n\nvoid\ninit_logging(const bzn::options& options)\n{\n    namespace keywords = boost::log::keywords;\n\n    const auto format = boost::log::expressions::stream\n            << boost::log::expressions::format_date_time< boost::posix_time::ptime >(\"TimeStamp\", \"[%Y-%m-%d %H:%M:%S.%f UTC]\")\n            << \" [\" << boost::log::expressions::attr< boost::log::attributes::current_thread_id::value_type >(\"ThreadID\")\n            << \"] [\" << std::setw(5) << std::left << boost::log::trivial::severity << \"] \" << boost::log::expressions::smessage;\n\n    auto sink = boost::log::add_file_log\n        (\n            keywords::file_name = options.get_logfile_dir() + \"/bluzelle-%5N.log\",\n            keywords::rotation_size = options.get_logfile_rotation_size(),\n            keywords::open_mode = std::ios_base::app,\n            keywords::auto_flush = true,\n            keywords::format = format\n        );\n\n    boost::log::core::get()->add_global_attribute(\"TimeStamp\", boost::log::attributes::utc_clock());\n\n    if (options.get_log_to_stdout())\n    {\n        boost::log::add_console_log(std::cout, keywords::format = format, keywords::auto_flush = true);\n    }\n\n    boost::log::add_common_attributes();\n\n    sink->locked_backend()->set_file_collector(boost::log::sinks::file::make_collector\n        (\n            keywords::target = options.get_logfile_dir(),\n            keywords::max_size = options.get_logfile_max_size()\n        ));\n\n    sink->locked_backend()->scan_for_files();\n\n    boost::log::core::get()->add_sink(sink);\n\n    if (options.get_debug_logging())\n    {\n        LOG(info) << \"debug logging enabled\";\n\n        boost::log::core::get()->set_filter(boost::log::trivial::severity >= boost::log::trivial::debug);\n    }\n    else\n    {\n        LOG(info) << \"debug logging disabled\";\n\n        boost::log::core::get()->set_filter(boost::log::trivial::severity > boost::log::trivial::debug);\n    }\n}\n\n\nboost::uintmax_t\nget_dir_size(const boost::filesystem::path& dir)\n{\n    namespace fs = boost::filesystem;\n\n    if (fs::is_directory(dir))\n    {\n        boost::uintmax_t size{};\n\n        fs::directory_iterator dir_it(dir);\n\n        for (dir_it = fs::begin(dir_it); dir_it != fs::end(dir_it); ++dir_it)\n        {\n            const fs::directory_entry& dir_entry = *dir_it;\n\n            if (fs::is_regular_file(dir_entry.path()))\n            {\n                size += fs::file_size(dir_entry.path());\n            }\n            else\n            {\n                if (fs::is_directory(dir_entry.path()))\n                {\n                    size += get_dir_size(dir_entry.path());\n                }\n            }\n        }\n        return size;\n    }\n    return 0;\n}\n\n\nvoid\nprint_banner(const bzn::options& options)\n{\n    std::stringstream ss;\n\n    ss << '\\n';\n    ss << \"              Swarm ID: \" << options.get_swarm_id() << \"\\n\"\n       << \"  Running node with ID: \" << options.get_uuid() << \"\\n\"\n       << \"      Local IP Address: \" << options.get_listener().address().to_string() << \"\\n\"\n       << \"               On port: \" << options.get_listener().port() << \"\\n\"\n       << \" Maximum Swarm Storage: \" << options.get_max_swarm_storage() << \" Bytes\" << \"\\n\"\n       << \"                 Stack: \" << options.get_stack() << \"\\n\"\n       << '\\n';\n\n    LOG(info) << ss.str();\n\n    if (!options.get_log_to_stdout())\n    {\n        std::cout << ss.str();\n    }\n}\n\n\nvoid\nstart_worker_threads_and_wait(std::shared_ptr<bzn::asio::io_context_base> io_context, std::shared_ptr<bzn::options_base> options)\n{\n    std::vector<std::thread> workers;\n\n    size_t thread_count;\n    if (options->get_simple_options().has(bzn::option_names::OVERRIDE_NUM_THREADS))\n    {\n        thread_count = options->get_simple_options().get<size_t>(bzn::option_names::OVERRIDE_NUM_THREADS);\n    }\n    else\n    {\n        thread_count = std::thread::hardware_concurrency();\n    }\n\n    LOG(info) << \"starting \" << thread_count << \" worker threads\";\n\n\n    for (size_t i = 0; i < thread_count; ++i)\n    {\n        workers.emplace_back(std::thread([io_context]\n        {\n            io_context->run();\n        }));\n    }\n\n    // wait for shutdown...\n    for (auto& t : workers)\n    {\n        t.join();\n    }\n}\n\n\nint\nmain(int argc, const char* argv[])\n{\n    try\n    {\n        auto options = std::make_shared<bzn::options>();\n        if (!options->parse_command_line(argc, argv))\n        {\n            return 1;\n        }\n\n        init_logging(*options);\n\n        auto io_context = std::make_shared<bzn::asio::io_context>();\n        auto utils = std::make_shared<bzn::utils_interface>();\n\n        auto peers = std::make_shared<bzn::peers_beacon>(io_context, utils, options);\n        peers->start();\n\n        // setup signal handler...\n        boost::asio::signal_set signals(io_context->get_io_context(), SIGINT, SIGTERM);\n\n        signals.async_wait([io_context](const boost::system::error_code& error, int signal_number)\n            {\n                if (!error)\n                {\n                    LOG(info) << \"signal received -- shutting down (\" << signal_number << \")\";\n                    io_context->stop();\n                }\n            });\n\n        // startup...\n        auto monitor = std::make_shared<bzn::monitor>(options, io_context, std::make_shared<bzn::system_clock>());\n        auto crypto = std::make_shared<bzn::crypto>(options, monitor);\n        auto chaos = std::make_shared<bzn::chaos>(io_context, options);\n        auto websocket = std::make_shared<bzn::beast::websocket>();\n        auto node = std::make_shared<bzn::node>(io_context, websocket, chaos, boost::asio::ip::tcp::endpoint{options->get_listener()}, crypto, options, monitor);\n        auto audit = std::make_shared<bzn::audit>(io_context, node, options->get_audit_mem_size(), monitor);\n\n        // which type of storage?\n        std::shared_ptr<bzn::storage_base> stable_storage;\n        std::shared_ptr<bzn::storage_base> unstable_storage;\n\n        if (options->get_mem_storage())\n        {\n            LOG(info) << \"Using in-memory testing storage\";\n\n            stable_storage = std::make_shared<bzn::mem_storage>();\n            unstable_storage = std::make_shared<bzn::mem_storage>();\n        }\n        else\n        {\n            LOG(info) << \"Using RocksDB storage\";\n\n            stable_storage = std::make_shared<bzn::rocksdb_storage>(options->get_state_dir(), \"db\", options->get_uuid());\n            unstable_storage = std::make_shared<bzn::rocksdb_storage>(options->get_state_dir(), \"pbft\", options->get_uuid());\n        }\n\n        auto crud = std::make_shared<bzn::crud>(io_context, stable_storage, std::make_shared<bzn::subscription_manager>(io_context), node, options->get_owner_public_key());\n        auto operation_manager = std::make_shared<bzn::pbft_operation_manager>(peers, unstable_storage);\n\n        auto pbft = std::make_shared<bzn::pbft>(node, io_context, peers, options,\n            std::make_shared<bzn::database_pbft_service>(io_context, unstable_storage, crud, monitor, options->get_uuid())\n            , crypto, operation_manager, unstable_storage, monitor);\n\n        pbft->set_audit_enabled(options->get_simple_options().get<bool>(bzn::option_names::AUDIT_ENABLED));\n\n        auto status = std::make_shared<bzn::status>(node, bzn::status::status_provider_list_t{pbft,crud}, options->get_swarm_id());\n\n        node->start(pbft);\n        chaos->start();\n        crud->start(pbft, options->get_max_swarm_storage());\n        pbft->start();\n        status->start();\n        chaos->start();\n\n        if (options->get_simple_options().get<bool>(bzn::option_names::AUDIT_ENABLED))\n        {\n            audit->start();\n        }\n\n        print_banner(*options);\n\n        start_worker_threads_and_wait(io_context, options);\n    }\n    catch(std::exception& ex)\n    {\n        LOG(fatal) << ex.what();\n        std::cerr << '\\n' << ex.what() << '\\n';\n        return 1;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "utils/CMakeLists.txt",
    "content": "add_library(utils STATIC\n    blacklist.cpp\n    blacklist.hpp\n    make_endpoint.hpp\n    make_endpoint.cpp\n    bytes_to_debug_string.cpp\n    bytes_to_debug_string.hpp\n    crypto.cpp\n    crypto.hpp\n    utils_interface_base.hpp\n    utils_interface.hpp\n    esr_peer_info.cpp\n    http_req.cpp\n    test/make_endpoint_test.cpp)\n\ntarget_link_libraries(utils ${JSONCPP_LIBRARIES} ${OPENSSL_LIBRARIES})\n\nadd_dependencies(utils boost jsoncpp openssl)\ntarget_include_directories(utils PRIVATE ${BLUZELLE_STD_INCLUDES})\n\nadd_subdirectory(test)\n"
  },
  {
    "path": "utils/blacklist.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <include/bluzelle.hpp>\n#include <utils/utils_interface.hpp>\n#include <boost/format.hpp>\n\nnamespace\n{\n    const std::string ROPSTEN_REQUEST_DATA{R\"({\"jsonrpc\":\"2.0\",\"method\":\"eth_call\",\"params\":[{\"to\":\"0x58261EEc3fCD83DACB5E0532277c27f1cA58270E\",\"data\": \"0x3a4e44a0%s\" },\"latest\"],\"id\":1})\"};\n    const std::string ERR_INVALID_RESPONSE{\"Invalid response from Bluzelle blacklist server: \"};\n\n    bzn::uuid_t\n    clean_uuid(const bzn::uuid_t& uuid)\n    {\n        bzn::uuid_t cleaned_uuid;\n        std::copy_if(uuid.begin(), uuid.end(), std::back_inserter(cleaned_uuid), [](auto c) { return c != '-'; });\n        return cleaned_uuid;\n    }\n}\n\n\nnamespace bzn::utils::blacklist\n{\n    bool\n    is_blacklisted(const bzn::uuid_t& raw_uuid, const std::string& url)\n    {\n        // We get the uuid in the following format: \"9dc2f619-2e77-49f7-9b20-5b55fd87ea44\", the contract expects a\n        // string of 32 hex values, so let's at least remove the dashes.\n        const std::string post_fields{boost::str(boost::format(ROPSTEN_REQUEST_DATA) % clean_uuid(raw_uuid))};\n        bzn::json_message response;\n\n        Json::CharReaderBuilder rbuilder;\n        std::unique_ptr<Json::CharReader> const reader(rbuilder.newCharReader());\n        std::string parse_errors;\n\n        bzn::utils_interface utils_object;\n\n        auto res = utils_object.sync_req(url, post_fields);\n        if (!reader->parse(res.c_str(), res.c_str() + res.size(), &response, &parse_errors))\n        {\n            LOG(error) << \"Unable to parse response from Ropsten - could not validate peer (\" << parse_errors << \")\";\n            return false;\n        }\n\n        try\n        {\n            // The result must be \"0x0000000000000000000000000000000000000000000000000000000000000000\" or\n            // \"0x0000000000000000000000000000000000000000000000000000000000000001\" we will only accept a value of 1 as\n            // true.\n            return (std::stoul(response[\"result\"].asString().c_str(), nullptr, 16) == 1);\n        }\n        catch(std::exception& ex)\n        {\n            LOG(error) << ERR_INVALID_RESPONSE << ex.what();\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "utils/blacklist.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <include/bluzelle.hpp>\n\n\nnamespace bzn::utils::blacklist\n{\n    bool is_blacklisted(const bzn::uuid_t& uuid, const std::string& url = bzn::utils::ROPSTEN_URL);\n}\n"
  },
  {
    "path": "utils/bytes_to_debug_string.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <utils/bytes_to_debug_string.hpp>\n#include <include/bluzelle.hpp>\n\n#include <iostream>\n#include <sstream>\n\nstd::string\nbzn::bytes_to_debug_string(const std::string& input, bool preserve_full)\n{\n    std::stringstream ss;\n    ss << std::hex;\n\n    for(const char& c : input)\n    {\n        // This is not a remotely rigorous way to do this, but as long as the goal is just to make\n        // hashes distinguishable in logs it will suffice.\n        ss << std::hex << (0x00ff & static_cast<const unsigned short&>(c));\n    }\n\n    auto result = ss.str();\n    if (result.size() > MAX_SHORT_MESSAGE_SIZE && !preserve_full)\n    {\n        result.erase(MAX_SHORT_MESSAGE_SIZE/2, result.size() - MAX_SHORT_MESSAGE_SIZE);\n        result.insert(MAX_SHORT_MESSAGE_SIZE/2, \"...\");\n    }\n\n    return result;\n}"
  },
  {
    "path": "utils/bytes_to_debug_string.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <string>\n\nnamespace bzn\n{\n    std::string bytes_to_debug_string(const std::string& input, bool preserve_full = false);\n}\n\n\n\n"
  },
  {
    "path": "utils/crypto.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * The uuid/public key/signature validation code for this module was taken\n * with modification from\n *\n * https://eclipsesource.com/blogs/2016/09/07/tutorial-code-signing-and-verification-with-openssl/\n *\n * This module duplicates the following functionality that can be performed\n * on the command line: convert base64 encoded signature to binary\n *\n *          openssl base64 -d -in signature.txt -out /tmp/sign.sha256\n * verify the uuid\n *          openssl dgst -sha256 -verify public.pem -signature /tmp/sign.sha256 uuid.txt\n */\n\n#include <include/bluzelle.hpp>\n#include \"crypto.hpp\"\n#include <openssl/ssl.h>\n#include <openssl/err.h>\n#include <string>\n#include <stdexcept>\n#include <iostream>\n#include <memory>\n#include <cstdio>\n#include <boost/format.hpp>\n#include <iomanip>\n\nnamespace\n{\n    const std::string ROPSTEN_URL       {\"https://ropsten.infura.io\"};\n    const std::string MSG_ERROR_CURL    {\"curl_easy_perform() failed: \"};\n\n    /**\n     * This function is used by base_64_decode to determine the amount of memory required\n     * for the binary buffer represented by the base64 encoded string.\n     *\n     * @param base_64_input base64 encoded string\n     * @return a size_t containing the number of bytes expected in the decoded string.\n    */\n    size_t\n    calculate_decode_length(const std::string& base_64_input)\n    {\n        if (base_64_input.empty())\n        {\n            return 0;\n        }\n        const size_t len{base_64_input.size()};\n        const size_t padding = (base_64_input[len - 1] == '=' && base_64_input[len - 2] == '=') ? 2 : 1;\n        return (len * 3) / 4 - padding;\n    }\n\n\n    void\n    compose_and_log_OpenSSL_error(const std::string& failing_function_name)\n    {\n        char buffer[126]{0};\n        ERR_error_string_n(ERR_get_error(), buffer, sizeof(buffer));\n        LOG(error) << \"While verifiying a node uuid \" << failing_function_name << \" failed with error \" << buffer;\n    }\n\n\n    /**\n     * Given the public key string in PEM format, this function will return the\n     * RSA public key structure that OpenSSL functions use.\n     *\n     * @param key a const std::string reference containing the public key in PEM format\n     * @return a pointer to the RSA structure contqining the public key\n     */\n    RSA* create_public_RSA(const std::string& key)\n    {\n        std::unique_ptr<BIO,std::function<void(BIO*)>> keybio(BIO_new_mem_buf((void*)(key.c_str()), -1), BIO_free);\n        if (!keybio)\n        {\n            return 0;\n        }\n\n        // Note that calling RSA_free on rsa will cause a segfault at it is not allocated in the PEM function. So I am\n        // not going to create a unique_ptr in this case.\n        RSA* rsa{nullptr};\n        PEM_read_bio_RSA_PUBKEY(keybio.get(), &rsa, nullptr, nullptr);\n        return rsa;\n    }\n\n\n    /**\n     * Given the RSA structure containing the Bluzelle public key, the\n     * signature of the node's uuid, and the node's uuid, this method verifies\n     * that the signature is valid.\n     *\n     * @param rsa a pointer to the public key structure\n     * @param signature a const vector reference to the signature associated with the uuid\n     * @param uuid a const string reference to the nodes' uuid\n     * @param is_authentic an reference to a bool that will be set to true if the signature is valid, false otherwise.\n     * @return a bool that returns true if the validation process was successful.\n     */\n    bool\n    RSA_verify_signature(const RSA* rsa, const std::vector<unsigned char>& signature, const std::string& uuid, bool& is_authentic)\n    {\n        std::unique_ptr<EVP_PKEY, std::function<void(EVP_PKEY*)>> public_key{EVP_PKEY_new(), EVP_PKEY_free};\n\n        std::unique_ptr<EVP_MD_CTX, std::function<void(EVP_MD_CTX*)>> RSA_verification_context{EVP_MD_CTX_new(), EVP_MD_CTX_free};\n\n        // I could find no guidance in the OpenSSL documentation that suggests that the EVP_MD\n        // pointer needs to be released after use, though in the same page the documentation\n        // points out that EVP_MD_CTX pointers *do* need to be released. For now I will leave\n        // the following as a raw pointer.\n        const EVP_MD* sha256_message_digest = EVP_sha256();\n\n        is_authentic = false;\n        EVP_PKEY_assign_RSA(public_key.get(), rsa);\n\n        EVP_DigestInit_ex( RSA_verification_context.get(), sha256_message_digest, nullptr);\n\n        if (1 != EVP_DigestVerifyInit(RSA_verification_context.get(), nullptr, sha256_message_digest, nullptr, public_key.get()))\n        {\n            compose_and_log_OpenSSL_error(\"EVP_DigestVerifyInit\");\n            return false;\n        }\n\n        if (1 != EVP_DigestVerifyUpdate(RSA_verification_context.get(), uuid.c_str(), uuid.size()))\n        {\n            compose_and_log_OpenSSL_error(\"EVP_DigestVerifyUpdate\");\n            return false;\n        }\n        // The const cast is for the unix gcc c++ compiler\n        const int auth_status = EVP_DigestVerifyFinal(RSA_verification_context.get(), const_cast<unsigned char*>(signature.data()), signature.size());\n\n        // There are a couple of options here, the signature was successfully\n        // validated or invalidated, or something went wrong during the\n        // validation process.\n        if ( auth_status==0 || auth_status==1)\n        {\n            is_authentic = (auth_status==1);\n            return true;\n        }\n        else\n        {\n            compose_and_log_OpenSSL_error(\"EVP_DigestVerifyUpdate\");\n            return false;\n        }\n    }\n}\n\n\nnamespace bzn::utils::crypto\n{\n    int\n    base64_decode(const std::string& base64_message, std::vector<unsigned char>& decoded_message)\n    {\n        if (base64_message.empty())\n        {\n            LOG(error) << \"Input string to base64_decode must not be empty\";\n            return 1;\n        }\n\n        const size_t decoded_length = calculate_decode_length(base64_message);\n        decoded_message.resize(decoded_length);\n\n        // I have chosen to *not* use unique pointers for bio and b64 here, as the memory handling\n        // is completely self contained within this function.\n\n        // new_mem_buf requires a non const void*, I needed to copy the const base64_message into a\n        // non const string so that gcc C++ wouldn't complain. The alternative, using const_cast\n        // didn't seem right as I am not completely sure that new_mem_buf doesn't modify the input,\n        // it probably doesn't.\n        std::string nonconst{base64_message};\n        BIO* bio = BIO_new_mem_buf(nonconst.data(), -1);\n\n        BIO* b64 = BIO_new(BIO_f_base64());\n        bio = BIO_push(b64, bio);\n\n        BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); //Do not use newlines to flush buffer\n\n        const int length = BIO_read(bio, decoded_message.data(), static_cast<int>(base64_message.size()));\n\n        // free all is used here as b64 was pushed onto bio making it a BIO chain.\n        BIO_free_all(bio);\n\n        if (static_cast<size_t>(length) != decoded_length) //length should equal decoded_length, else something went horribly wrong\n        {\n            LOG(error) << \"base64_decode failed to decode a base64 encoded string\";\n            return (1); // failure\n        }\n        return (0); //success\n    }\n\n\n    bool\n    verify_signature(const std::string& public_key, const std::string& signature, const std::string& uuid)\n    {\n        if (public_key.empty() || signature.empty() || uuid.empty())\n        {\n            LOG(error) << \"Unable to verify the signature as one or more of the public key, signature or uuid strings were empty\";\n            return false;\n        }\n\n        auto public_rsa = create_public_RSA(public_key);\n        if (nullptr==public_rsa)\n        {\n            LOG(error) << \"Unable to create RSA from public key while validating the node.\";\n            return false;\n        }\n\n        std::vector<unsigned char> binary_signature;\n        base64_decode(signature, binary_signature);\n\n        bool authentic{false};\n        bool ret_val = RSA_verify_signature( public_rsa, binary_signature, uuid, authentic);\n\n        return ret_val & authentic;\n    }\n\n\n    std::string read_pem_file(const std::string& filename, const std::string& expected_type)\n    {\n        char* name;\n        char* headers;\n        unsigned char* data;\n        long len;\n\n        ::FILE* fp = fopen(filename.c_str(), \"r\");\n        if (!fp)\n        {\n            throw std::runtime_error(\"Failed to read pem file: \" + filename);\n        }\n\n        PEM_read(fp, &name, &headers, &data, &len);\n        ::fclose(fp);\n\n        if (std::string(name) != expected_type)\n        {\n            throw std::runtime_error(\"Expected to find a \" + expected_type + \" in \" + filename + \", but found a \" + std::string(name));\n        }\n\n        std::string result(reinterpret_cast<char const*>(data), len);\n\n        OPENSSL_free(name);\n        OPENSSL_free(data);\n        OPENSSL_free(headers);\n\n        return result;\n    }\n}\n"
  },
  {
    "path": "utils/crypto.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <string>\n\nnamespace bzn::utils::crypto\n{\n    /**\n     * base64_decode is used by verify_signature to decode the \"human readable\"\n     * signature text into it's original binary format. We could not use the\n     * base64 decoder in boost::beast::core::detail as those functions take stl\n     * strings as input and output, so binary output with embedded '\\0' are not\n     * handled correctly.\n     *\n     * @param base64_message pointer to a character buffer containing the base64 encoded string\n     * @param in/out vector of unsigned chars that will contain the decoded data\n     * @return integer value of 0 on success\n     */\n    int base64_decode(const std::string& base64_message, std::vector<unsigned char>& decoded_message);\n\n    /**\n     * verify_signature is a C++ wrapper for the C style OpenSSL signature\n     * verification code. It provides an interface that uses STL strings\n     * instead of raw pointers to buffers.\n     *\n     * @param public_key the PEM formatted public key provided by the Bluzelle rep\n     * @param signature the base 64 encocoded signature file created from the node uuid and the Bluzelle private key\n     * @param uuid the uuid of the node that is to be added to the swarm\n     * @return true if the signature is valid, false otherwise.\n     * @throws runtime_error if the public key is invalid, the signature could not be decoded or the validation\n     * failed before finishing due to some error.\n     */\n    bool verify_signature(const std::string& public_key, const std::string& signature, const std::string& uuid);\n\n    /**\n     * Read the contents of a .pem file, returning the payload as a base64 string.\n     * Any headers are ignored.\n     *\n     * @param filename path of pem file to read\n     * @param expected_type what the file is supposed to contain, such as \"PRIVATE KEY\".\n     * @throws runtime_error if the file does not indicate that it contains expected_type\n     */\n    std::string read_pem_file(const std::string& filename, const std::string& expected_type);\n}\n"
  },
  {
    "path": "utils/esr_peer_info.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <options/options.hpp>\n#include <utils/utils_interface.hpp>\n#include <boost/algorithm/hex.hpp>\n#include <boost/algorithm/string.hpp>\n#include <json/json.h>\n#include <iostream>\n#include <sstream>\n\nnamespace\n{\n    const std::string ERR_UNABLE_TO_PARSE_JSON_RESPONSE{\"Unable to parse JSON response: \"};\n    const size_t ESR_RESPONSE_LINE_LENGTH{64};\n    const size_t REQUIRED_SIZE_MULTIPLE{64};\n    const off_t PARAMETER_OFFSET{64};\n    const std::string GET_PEERS_ADDRESS{\"46e76d8b\"}; // TODO: refactor to put the 0x back\n    const std::string GET_PEER_INFO_SIGNATURE{\"0xcc8575cb\"};\n\n    void\n    trim_right_nulls(std::string& s)\n    {\n        boost::algorithm::trim_right_if(s, [](auto &c){return c=='\\0';});\n    }\n\n\n    bzn::json_message\n    str_to_json(const std::string &json_str)\n    {\n        bzn::json_message json_msg;\n        std::unique_ptr<Json::CharReader> reader{ Json::CharReaderBuilder().newCharReader() };\n        std::string errors;\n        if(!reader->parse(\n                json_str.c_str()\n                , json_str.c_str() + json_str.size()\n                , &json_msg\n                , &errors))\n        {\n            throw (std::runtime_error(ERR_UNABLE_TO_PARSE_JSON_RESPONSE + errors));\n        }\n        return json_msg;\n    }\n\n\n    bzn::json_message\n    make_params(const std::string& to_hex, const std::string& data_hex)\n    {\n        bzn::json_message params;\n        bzn::json_message param;\n        param[\"to\"] = (to_hex.substr(0,2) == \"0x\" ? \"\" : \"0x\") + to_hex;\n        param[\"data\"] = data_hex;\n        params.append(param);\n        params.append(\"latest\");\n        return params;\n    }\n\n\n    std::string\n    make_request(const std::string& to_hex, const std::string& data_hex)\n    {\n        bzn::json_message request;\n        request[\"jsonrpc\"] = \"2.0\";\n        request[\"method\"] = \"eth_call\";\n        request[\"params\"] = make_params(to_hex, data_hex);\n        request[\"id\"] = 1;\n        Json::StreamWriterBuilder wbuilder;\n        wbuilder[\"indentation\"] = \"\";\n        return Json::writeString(wbuilder, request);\n    }\n\n\n    std::string\n    hex_to_char_string(const std::string &hex)\n    {\n        std::stringstream strm;\n        boost::algorithm::unhex(hex, std::ostream_iterator<char>{strm, \"\"});\n        return strm.str();\n    }\n\n\n    // TODO: replace this with a function that uses the ABI to parse the response\n    std::vector<std::string>\n    parse_get_peers_result_to_vector(const std::string_view &result)\n    {\n        std::vector<std::string> results;\n        std::vector<std::string> lines;\n        size_t node_count{0};\n        enum states {HEADER, HEADER_SWARM_SIZE, HEADER_INFO, PEER_ID_SIZE, PEER_ID } state{HEADER};\n\n        // NOTE: I needed to add the extra null character to \"line\" so that any 64 length buffer read from the result\n        // will be correctly null terminated for the boost::algorithm::unhex function\n        char line[ESR_RESPONSE_LINE_LENGTH + 1]{0};\n        size_t index{0};\n        std::string peer_id;\n\n        std::istringstream stm(result.begin());\n\n        size_t peer_id_length{0};\n        while (stm.read(line, ESR_RESPONSE_LINE_LENGTH))\n        {\n            switch (state)\n            {\n                case HEADER:\n                {\n                    state = HEADER_SWARM_SIZE;\n                }\n                break;\n                case HEADER_SWARM_SIZE:\n                {\n                    state = HEADER_INFO;\n                    node_count = std::strtoul(line, nullptr, 16);\n                    if (node_count == 0)\n                    {\n                        LOG(error) << \"Requested swarm may not exist or has no nodes\";\n                        return results;\n                    }\n                }\n                break;\n                case HEADER_INFO:\n                {\n                    state = (index == node_count + 1 ? PEER_ID_SIZE : state) ;\n                }\n                break;\n                case PEER_ID_SIZE:\n                {\n                    // the first line of data is the size of the string\n                    peer_id_length = std::strtoul(line, nullptr, 16);\n                    if (peer_id_length)\n                    {\n                        state = PEER_ID;\n                    }\n                    else\n                    {\n                        --node_count;\n                        state = PEER_ID_SIZE;\n                    }\n                }\n                break;\n                case PEER_ID:\n                {\n                    peer_id.append(hex_to_char_string(std::string{line}));\n                    if (peer_id.size() >= peer_id_length)\n                    {\n                        trim_right_nulls(peer_id);\n                        results.emplace_back(peer_id);\n                        peer_id = \"\";\n                        state = PEER_ID_SIZE;\n                    }\n                }\n                break;\n                default:\n                {\n                    LOG(warning) << \"Failed to correctly parse peer peers from esr\";\n                    return results;\n                }\n                break;\n            }\n            ++index;\n        }\n\n        // TODO: rhn - reconsider if we need to keep node_count and this check.\n        if (results.size() != node_count)\n        {\n            LOG(warning) << \"Actual size of the peers list [\" << results.size() << \"] does not agree with the expected size [\" << node_count << \"]\";\n        }\n\n        return results;\n    }\n\n\n    // TODO: replace this with a function that uses the ABI to parse the response\n    bzn::peer_address_t\n    parse_get_peer_info_result_to_peer_address(const std::string &peer_id, const std::string_view &result)\n    {\n        size_t      text_size{0};\n        uint16_t    port{0};\n        std::string host;\n        std::string name;\n        enum {NODE_COUNT, NA_0, NA_1, NODE_PORT, NODE_HOST_SIZE, NODE_HOST, NODE_NAME_SIZE, NODE_NAME, FINISHED} state {NODE_COUNT};\n\n        // NOTE: I needed to add the extra null character to \"line\" so that any 64 length buffer read from the result\n        // will be correctly null terminated for the boost::algorithm::unhex function\n        char line[ESR_RESPONSE_LINE_LENGTH + 1]{0};\n        std::istringstream stream{result.begin()};\n        while(stream.read(line, ESR_RESPONSE_LINE_LENGTH))\n        {\n            // TODO: replace this switch/case with the strategy pattern - Rich\n            switch (state)\n            {\n                case NODE_COUNT:\n                {\n                    state = NA_0;\n                }\n                break;\n\n                case NA_0:\n                {\n                    state = NA_1;\n                }\n                break;\n\n                case NA_1:\n                {\n                    state = NODE_PORT;\n                }\n                break;\n\n                case NODE_PORT:\n                {\n                    port = std::strtoul(line, nullptr, 16);\n                    if (!port)\n                    {\n                        LOG(warning) << \"Invalid value for port:[\" << port << \"], node may not exist\";\n                    }\n                    state = NODE_HOST_SIZE;\n                }\n                break;\n\n                case NODE_HOST_SIZE:\n                {\n                    text_size = std::strtoul(line, nullptr, 16);\n                    if (!text_size)\n                    {\n                        LOG(warning) << \"Invalid value for host string length:[\" << text_size << \"]\";\n                    }\n                    state = NODE_HOST;\n                }\n                break;\n\n                case NODE_HOST:\n                {\n                    host = hex_to_char_string(line);\n                    trim_right_nulls(host);\n                    if (text_size != host.size())\n                    {\n                        LOG(warning) << \"Parsed host string size does not match expected size\";\n                    }\n                    state = NODE_NAME_SIZE;\n                }\n                break;\n\n                case NODE_NAME_SIZE:\n                {\n                    text_size = std::strtoul(line, nullptr, 16);\n                    if (!text_size)\n                    {\n                        LOG(warning) << \"Invalid value for node name string length:[\" << text_size << \"]\";\n                    }\n                    state = NODE_NAME;\n                    name.clear();\n                }\n                break;\n\n                case NODE_NAME:\n                {\n                    name.append(hex_to_char_string(line));\n                    trim_right_nulls(name);\n                    if (text_size == name.size())\n                    {\n                        state = FINISHED;\n                    }\n                }\n                break;\n\n                case FINISHED:\n                {\n                    LOG(warning) << \"Peer Info result contains too many lines\";\n                }\n                break;\n\n                default:\n                {\n                    LOG(error) << \"Failed to correctly parse peer info from esr\";\n                    return bzn::peer_address_t(host, port, name, peer_id);\n                }\n                break;\n            }\n        }\n        return bzn::peer_address_t(host, port, name, peer_id);\n    }\n\n\n    std::string\n    pad_str_to_mod_64(std::string parameter)\n    {\n        const size_t REMAINDER{parameter.size() % REQUIRED_SIZE_MULTIPLE};\n        if (REMAINDER)\n        {\n            const size_t padding_required = REQUIRED_SIZE_MULTIPLE - REMAINDER;\n            parameter.insert(parameter.size(), padding_required, '0');\n        }\n        return parameter;\n    }\n\n\n    std::string\n    size_type_to_hex(size_t i, size_t width = 8)\n    {\n        std::stringbuf buf;\n        std::ostream os(&buf);\n        os << std::setfill('0') << std::setw(width) << std::hex << (int)i;\n        return buf.str().c_str();\n    }\n\n\n    std::string\n    string_to_hex(const std::string& value)\n    {\n        std::stringstream hexstream;\n        boost::algorithm::hex(value, std::ostream_iterator<char>{hexstream, \"\"});\n        return hexstream.str();\n    }\n\n\n    // TODO: replace this with a function that uses the ABI to create the request data\n    const std::string\n    data_string_for_get_peers(const std::string &swarm_id)\n    {\n        return std::string{\"0x\"\n                + pad_str_to_mod_64(GET_PEERS_ADDRESS)\n                + pad_str_to_mod_64(\"00000020\")             // input parameter type? (no)\n                + size_type_to_hex(swarm_id.size())         // size of the swarm id (pre hexification)\n                + pad_str_to_mod_64(string_to_hex(swarm_id))// hexified swarm id\n        };\n    }\n}\n\n// TODO: replace this with a function that uses the ABI to create the request data\n// data_string_for_get_peer_info has been moved out of the anonymous namespace to make it possible to\n// unit test directly.\nnamespace bzn::utils::esr\n{\n    const std::string\n    data_string_for_get_peer_info(const std::string& swarm_id, const std::string& peer_id)\n    {\n\n        const std::string SWARM_ID_PARAMETER {\n                size_type_to_hex(swarm_id.size(), 64)           // size of variable parameter\n                + pad_str_to_mod_64(string_to_hex(swarm_id))    // swarm id parameter\n        };\n\n        const std::string PEER_ID_PARAMETER {\n                size_type_to_hex(peer_id.size(), 64)\n                + pad_str_to_mod_64(string_to_hex(peer_id))\n        };\n\n        const std::string PREAMBLE {\n                GET_PEER_INFO_SIGNATURE\n                + size_type_to_hex( PARAMETER_OFFSET, 64)\n                + size_type_to_hex( PARAMETER_OFFSET + SWARM_ID_PARAMETER.size() / 2, 64)\n        };\n\n        return std::string{\n                PREAMBLE\n                + SWARM_ID_PARAMETER\n                + PEER_ID_PARAMETER\n        };\n    }\n}\n\nusing namespace bzn;\n\nstd::vector<std::string>\nutils_interface::get_peer_ids(const bzn::uuid_t& swarm_id, const std::string& esr_address, const std::string& url) const\n{\n    const auto DATA{data_string_for_get_peers(swarm_id)};\n    const auto REQUEST{make_request( esr_address, DATA)};\n    const auto response{this->sync_req(url, REQUEST)};\n    const auto json_response{str_to_json(response)};\n    const auto result{json_response[\"result\"].asCString() + 2}; // + 2 skips the '0x'\n    return parse_get_peers_result_to_vector(result);\n}\n\n\nbzn::peer_address_t\nutils_interface::get_peer_info(const bzn::uuid_t& swarm_id, const std::string& peer_id, const std::string& esr_address, const std::string& url) const\n{\n    const auto DATA{utils::esr::data_string_for_get_peer_info(swarm_id, peer_id)};\n    const auto REQUEST{make_request( esr_address, DATA)};\n    const auto response{this->sync_req(url, REQUEST)};\n    const auto json_response{str_to_json(response)};\n    const auto result{json_response[\"result\"].asCString() + 2};\n    return parse_get_peer_info_result_to_peer_address(peer_id, result);\n}\n"
  },
  {
    "path": "utils/http_req.cpp",
    "content": "// Copyright (C) 2019 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <include/bluzelle.hpp>\n#include <utils/utils_interface.hpp>\n#include <boost/beast/core.hpp>\n#include <boost/beast/http.hpp>\n#include <boost/beast/ssl.hpp>\n#include <boost/beast/version.hpp>\n#include <boost/asio/connect.hpp>\n#include <boost/asio/ip/tcp.hpp>\n#include <boost/asio/ssl/error.hpp>\n#include <boost/asio/ssl/stream.hpp>\n#include <boost/asio/ssl/rfc2818_verification.hpp>\n#include <regex>\n#include <string>\n\n\nnamespace\n{\n    const std::regex URL_REGEX(\"(http|https)://([^/ :]+):?([^/ ]*)(/.*)?\");\n\n    const std::string CERT_DIRS[] = {\n            \"/system/etc/security/cacerts\", // Android\n            \"/usr/local/share/certs\",       // FreeBSD\n            \"/etc/pki/tls/certs\",           // Fedora/RHEL\n            \"/etc/ssl/certs\",               // Ubuntu\n            \"/etc/openssl/certs\",           // NetBSD\n            \"/var/ssl/certs\",               // AIX\n    };\n}\n\n\nnamespace bzn\n{\n    // Performs an HTTP GET or POST and returns the body of the HTTP response...\n    std::string\n    utils_interface::sync_req(const std::string& url, const std::string& post) const\n    {\n        using tcp = boost::asio::ip::tcp;\n        namespace ssl = boost::asio::ssl;\n        namespace http = boost::beast::http;\n\n        boost::asio::io_context ioc;\n        tcp::resolver resolver{ioc};\n\n        std::smatch what;\n        if (!std::regex_match(url, what, URL_REGEX))\n        {\n            LOG(error) << \"could not parse url \" << url;\n            throw std::runtime_error(\"could not parse url \" + url);\n        }\n\n        const std::string protocol{what[1]};\n        const std::string host{what[2]};\n        const std::string path{what[4]};\n        std::string port{what[3]};\n\n        // secure connection?\n        const bool secure = (protocol == \"https\");\n\n        // if no port is specified then default to 80 or 443...\n        if (port.empty())\n        {\n            port = protocol;\n        }\n\n        auto const endpoint_iterator = resolver.resolve(host, port);\n\n        LOG(info) << \"Connecting to: \" << host << \"...\";\n\n        ssl::context ctx(boost::asio::ssl::context::sslv23_client);\n        ssl::stream<tcp::socket> ssl_stream(ioc, ctx);\n        tcp::socket socket{ioc};\n\n        http::request<http::string_body> req{http::verb::get, (!path.empty()) ? path : \"/\", 11};\n        req.set(http::field::host, host);\n        req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);\n\n        // post or get?\n        if (!post.empty())\n        {\n            req.method(http::verb::post);\n            req.body() = post;\n            req.prepare_payload();\n        }\n\n        if (secure)\n        {\n            // set default paths for finding CA certificates...\n            ctx.set_default_verify_paths();\n\n            // other possible locations...\n            for(const auto& cert_path : CERT_DIRS)\n            {\n                ctx.add_verify_path(cert_path);\n            }\n\n            // Set SNI Hostname (many hosts need this to handshake successfully)\n            if (!SSL_set_tlsext_host_name(ssl_stream.native_handle(), host.c_str()))\n            {\n                boost::beast::error_code ec{static_cast<int>(::ERR_get_error()), boost::beast::net::error::get_ssl_category()};\n                throw boost::beast::system_error{ec};\n            }\n\n            boost::asio::connect(ssl_stream.next_layer(), endpoint_iterator);\n\n            ssl_stream.set_verify_mode(ssl::verify_peer);\n            ssl_stream.set_verify_callback(ssl::rfc2818_verification(host));\n\n            ssl_stream.handshake(ssl::stream_base::client);\n            http::write(ssl_stream, req);\n        }\n        else\n        {\n            boost::asio::connect(socket, endpoint_iterator);\n            http::write(socket, req);\n        }\n\n        boost::beast::flat_buffer buffer;\n        http::response<http::string_body> res;\n\n        if (secure)\n        {\n            http::read(ssl_stream, buffer, res);\n            boost::system::error_code ec;\n            ssl_stream.shutdown(ec);\n        }\n        else\n        {\n            http::read(socket, buffer, res);\n            socket.shutdown(tcp::socket::shutdown_both);\n        }\n\n        return res.body();\n    }\n\n} // namespace bzn::utils::http"
  },
  {
    "path": "utils/make_endpoint.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <include/bluzelle.hpp>\n#include <utils/make_endpoint.hpp>\n\n\nstd::optional<boost::asio::ip::tcp::endpoint>\nbzn::make_endpoint(const std::string& host, const std::string& port)\n{\n    using namespace boost::asio;\n\n    io_context ioc;\n    ip::tcp::resolver resolver{ioc};\n\n    try\n    {\n        ip::tcp::resolver::query query(ip::tcp::v4(), host, port);\n\n        auto endpoint_iterator = resolver.resolve(query);\n\n        if (!endpoint_iterator.empty())\n        {\n            return *endpoint_iterator;\n        }\n    }\n    catch(std::exception& ex)\n    {\n        LOG(error) << ex.what();\n    }\n\n    LOG(error) << \"Could not resolve: \" << host;\n\n    return std::nullopt;\n}\n\n\nstd::optional<boost::asio::ip::tcp::endpoint>\nbzn::make_endpoint(const bzn::peer_address_t& peer)\n{\n    return bzn::make_endpoint(peer.host, std::to_string(peer.port));\n}\n"
  },
  {
    "path": "utils/make_endpoint.hpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <boost/asio.hpp>\n#include <peers_beacon/peer_address.hpp>\n\nnamespace bzn\n{\n    std::optional<boost::asio::ip::tcp::endpoint>\n    make_endpoint(const bzn::peer_address_t& peer);\n\n    std::optional<boost::asio::ip::tcp::endpoint>\n    make_endpoint(const std::string& host, const std::string& port);\n}\n\n"
  },
  {
    "path": "utils/test/CMakeLists.txt",
    "content": "set(test_srcs utils_test.cpp make_endpoint_test.cpp)\nset(test_libs utils)\nset(test_deps proto)\n\nadd_gmock_test(utils)\n"
  },
  {
    "path": "utils/test/make_endpoint_test.cpp",
    "content": "// Copyright (C) 2019 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <utils/make_endpoint.hpp>\n#include <gtest/gtest.h>\n\nusing namespace::testing;\n\n\nTEST(make_endpoint, test_test_valid_host_name_returns_correct_address)\n{\n    bzn::peer_address_t peer{\"localhost\", 80, \"name\", \"uuid\"};\n\n    auto ep = bzn::make_endpoint(peer);\n\n    ASSERT_TRUE(ep.has_value());\n    EXPECT_EQ((*ep).address().to_string(), \"127.0.0.1\");\n}\n\n\nTEST(make_endpoint, test_test_invalid_host_name_returns_nothing)\n{\n    bzn::peer_address_t peer{\"localhost-asdf\", 80, \"name\", \"uuid\"};\n\n    auto ep = bzn::make_endpoint(peer);\n\n    ASSERT_FALSE(ep.has_value());\n}\n\n\nTEST(make_endpoint, test_test_dotted_v4_address_returns_address)\n{\n    bzn::peer_address_t peer{\"192.168.0.1\", 80, \"name\", \"uuid\"};\n\n    auto ep = bzn::make_endpoint(peer);\n\n    ASSERT_TRUE(ep.has_value());\n    EXPECT_EQ((*ep).address().to_string(), \"192.168.0.1\");\n}\n"
  },
  {
    "path": "utils/test/utils_test.cpp",
    "content": "// Copyright (C) 2018 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#include <mocks/mock_node_base.hpp>\n#include <mocks/mock_session_base.hpp>\n#include <mocks/mock_boost_asio_beast.hpp>\n#include <boost/beast/core/detail/base64.hpp>\n#include <utils/blacklist.hpp>\n#include <utils/crypto.hpp>\n#include <utils/utils_interface.hpp>\n#include <algorithm>\n\nusing namespace::testing;\n\nnamespace\n{\n    const char* BLACKLISTED_UUID    {\"12345678-0900-0000-0000-000000000000\"};\n    const char* NOT_BLACKLISTED_UUID{\"e81ca538-a222-4add-8cb8-065c8b65a391\"};\n\n    // NOTE - not constant as the test shuffles the list before use to get five\n    // random uuids.\n    std::vector<std::string> blacklisted_uuids\n    {\n            \"9dc2f619-2e77-49f7-9b20-5b55fd87ea44\",\n            \"51bfd541-ab3e-4f02-93c7-8c3328daccfa\",\n            \"f06ab617-7ccc-45fe-aee2-d4f5d175891b\",\n            \"507b8661-167c-433c-bc68-0f4b117c5307\",\n            \"7a80b4c1-2d99-471a-a1c3-9978759a00e3\",\n            \"f9739b52-c0c6-4b4e-8132-1f96f896f7a6\",\n            \"acf863ae-9c65-4749-8d4f-f9067966ef7a\",\n            \"694cad9f-a08b-45a8-ac40-1ef71672b570\",\n            \"f51d4e1e-f84d-47a9-9b29-645ecef856b2\",\n            \"0957e369-d794-4b51-abaf-669e50e13e4f\",\n            \"51da6250-5d12-4eea-ae2f-2968039f3445\",\n            \"8eee8cff-1bfe-4714-a418-780cc369bd83\",\n            \"af0a1a67-07a1-45ea-a529-48f5a26bd3ef\",\n            \"ddaa5bea-3380-482b-96b8-cb7e2cbdb805\",\n            \"931731eb-288d-4643-8e11-a7e999169bce\",\n            \"54723428-2f0a-48c5-9b8c-d79df82e4434\",\n            \"adc563fa-4de2-4044-b270-829289c18ba9\",\n            \"112d5c33-5c53-4b59-a177-dfc4ada7be20\",\n            \"e44a220b-f005-4d84-87c4-cd799f29df20\",\n            \"c5e09ed0-d520-4b70-8b6e-94aca1ca8eef\",\n            \"d70749b6-8032-4d96-9c9c-98a288c9963f\",\n            \"8681fe91-f5a1-41b3-bc86-c3ee9fd8cbd0\",\n            \"9db3cc1f-d778-4535-afec-342566b51291\",\n            \"22d60214-8dc8-4e98-ab71-096651694a71\",\n            \"86695947-ae33-4838-99a1-8e46ec7b58f2\",\n            \"ab0bf354-114c-437b-add7-c43c784f05e1\",\n            \"752c39f4-6c60-435f-a64e-37c953f713d3\",\n            \"3694f8a2-d1cc-46fe-86a6-471e5bebbda8\",\n            \"4b00901b-959b-4716-ba10-0bd4ec9370d4\",\n            \"90df5baa-c7eb-45f7-aaf7-7b8f5cdd43a0\",\n            \"ab7a83fc-970a-4bf5-a10d-f50b91caece6\",\n            \"78b6055c-db92-4730-89cf-dc3be293fe24\",\n            \"6ea74f15-167e-4636-a40b-17c7e80ae16c\",\n            \"2b710417-7229-4003-820d-512a71858b4a\",\n            \"059b9c82-a85e-4fe7-804c-a273359c6d2e\",\n            \"5c7181b5-2223-447c-a5c1-1b353b06f347\",\n            \"d5d8ca77-965d-4e45-b86a-d6bcd17fe5ca\",\n            \"064d6286-04b7-42a8-8390-caa3dfa8f5f1\",\n            \"d442c865-a3c2-44a3-8327-654f3c957ef3\",\n            \"94a5a516-4164-4a20-b539-67b5307122d5\",\n            \"0d1866ca-d098-4f5a-8b57-2f39a71ee6ff\",\n            \"5d14a2c9-7ea8-4110-9cda-d274b2029447\",\n            \"ffd88060-0188-4520-a2b9-b2fdc964ad2c\",\n            \"f2956275-49db-438b-a1ba-b59e834b5ded\",\n            \"afd1420e-ea14-453d-bef3-3c8aa1538668\",\n            \"8fbf7f02-7eb5-4af6-bcd8-fee9c80d0674\",\n            \"d2d87576-e1e8-4075-ab7e-c4524184ccbf\",\n            \"61013162-b24e-4d81-a94e-1f7a04541682\",\n            \"8cca1307-47b7-4187-966d-b69f37adca3d\",\n            \"621384ff-b3a3-47ec-b678-12e67f7996b4\",\n            \"1b7ec08b-293f-4d6e-ba6d-53c4e591e50c\",\n            \"e4884015-ce37-4500-9979-ccee97a074dc\",\n            \"e0f82155-5b3e-4b7a-bbbd-c7a99464cdd7\",\n            \"fea17fe7-f476-4745-adcf-5a0c30a8647f\",\n            \"22ead2c4-2515-4dd3-84a8-dec18470b865\",\n            \"13b2a577-974e-4c3a-be99-9944726a8394\",\n            \"079221c5-3f39-4600-abe6-eef2451bc3f7\",\n            \"f310f466-5a41-448a-8c24-34a483fac06e\",\n            \"8571dea6-e3ad-487f-8fd9-14e458b3d573\",\n            \"ae272542-438e-470a-a27e-5042c64f63f3\",\n            \"fca4fbba-b303-4fcc-bbe6-c217e1d7f53d\",\n            \"31bda844-9273-4a22-a4d2-021de9c77d55\",\n            \"a0f833fe-94f2-48a5-92e4-9345cc3fbdb3\",\n            \"cbe0d517-0c75-4126-9c2b-5f59a362b692\",\n            \"b9c765c6-35fd-4382-900d-8ab4099605da\",\n            \"573809ca-c33f-477c-a3c3-4e74e9c1e8ec\",\n            \"df8c6874-f53a-4a84-ad49-9bf741c6e246\",\n            \"920a0d3e-3b8e-4143-87be-c33eb0c68e9e\",\n            \"362ba25d-2a22-40c0-b02d-ad5c771313e2\",\n            \"e01a12b9-62b8-46c3-8fbe-dd1f9440afb0\",\n            \"4bf177b4-dc37-4296-a584-9000756c8232\",\n            \"39d73697-7f04-4234-a0e2-f36ee07da8bd\",\n            \"11f9dab3-0867-4ea2-9424-14c3129d5e38\",\n            \"8e981c03-f1b9-4ad9-ab5e-f8202b8a8e12\",\n            \"62fc6f91-d60b-4ec4-b1a6-5d6dd4d730c3\",\n            \"db551dd6-598f-46b1-8218-e0ea224674b9\",\n            \"acdde094-85c8-4b11-b763-8e73c946744a\",\n            \"15367d6c-b583-4508-a8d8-ecfcdbfc5e57\",\n            \"c5340634-1ef0-4782-bf48-9ca6107ba645\",\n            \"8243eee3-a6f7-475c-8a3f-377f5b47bdf7\",\n            \"4b92c0d3-a409-4779-97e2-d73aa3bc089e\",\n            \"5c916c69-18b4-4968-b943-14ad2e022c51\",\n            \"9bc37129-fcf1-47a2-80c2-bc1ba655dd4c\",\n            \"9a976ea7-677a-47fd-932d-4bf416d8ba8d\",\n            \"71276e61-2c09-4991-8082-6a4361a53ac6\",\n            \"8188585a-6524-45d5-9fce-4b9cc4af9b99\",\n            \"9f5d7454-2cf1-4dbc-9846-5c9ac4feae9d\",\n            \"e083b70b-fa91-4d0e-b0f9-f794ec899653\",\n            \"04a72608-9620-4057-94b1-4982a49af76f\",\n            \"b1a857c8-554f-444f-b289-87a1bcf3d26d\",\n            \"8abbe344-00b3-4258-85f2-684bcf5913f1\",\n            \"eaba2810-3b89-4b75-a694-482c270c098e\",\n            \"8e207267-f10f-4470-ae35-ac35cf8e116c\",\n            \"e42f025b-bb10-48ec-89fe-294ec73b7eae\",\n            \"a25cb4d6-6f90-40f3-a791-1d4128a57fd2\",\n            \"152b3892-c1d0-4c2a-b860-e15414cd3aec\",\n            \"a4c1738f-2b28-436d-ae06-2b290630a2cf\",\n            \"6fc878eb-2341-4485-93a6-5b84e68f2250\",\n            \"63291098-96fb-4b83-8427-f0dc7c921151\",\n            \"0d56fcb3-ae1e-4b3e-b794-be3270cc9d43\"\n    };\n\n    auto random_engine {std::default_random_engine {static_cast<unsigned>(std::chrono::system_clock::now().time_since_epoch().count())}};\n\n    const std::string password {\"6Y4qTvHbQcyNccKW\"};\n\n    const std::string private_pem\n    {\n            \"-----BEGIN RSA PRIVATE KEY-----\\n\"\n            \"Proc-Type: 4,ENCRYPTED\\n\"\n            \"DEK-Info: AES-256-CBC,4C0EA37BB36FBF5E9799A14A3EC78A70\\n\"\n            \"\\n\"\n            \"srl0+9zecwEzGrWkZXMexv6JaxL+O1B2N2xwXrFcDpcish/2MiRWybj1vT+U3mEq\\n\"\n            \"B5AweV7OCeDBpoqxM6cN9mYOVSmBdHxf2Ek/RGi2/o2r1nf18s4BTxupReauaJOu\\n\"\n            \"yJiNgOMcRE7a30SGwguJmNf8XkPIjitrPNLcgQv3q4GTcXV4vrnElnyuINBWrg2F\\n\"\n            \"wl/24/Pxdw4OEGik5FN1IjY1GhhnwBLn36H9FToRaj/id/vBpZ0cFIP/AbHJto2H\\n\"\n            \"OoIdvG6xIt6pXuk9WhPAOVbxeYy0Q5C1vLdH22OSTDe+3wiZpRIkllZBMjdLHl5X\\n\"\n            \"pdxmG4YwPjZIgM5jTZRBRrYDyZHroJqlJFEGnvDLuPiy7TlVA47oZGKKLsga+aFQ\\n\"\n            \"uZKJ2duANgMiM6re3WFePw6+O9YjRnhNjj70S3YM8l5cCRUFkOeLjFxGEDtjndV5\\n\"\n            \"903du5LdzPpneAbehPFMafR2T8WeKKp2b4Ulpxw+x4klDpMRL1n0ow4rRRcFsIm1\\n\"\n            \"wh/p7Mr8DvDqChelhSkksqfrXfkGg1kFRGMmS1ftQ8tcL7pZM/ZDXhpxYXzSfY7p\\n\"\n            \"ZqlWd3e9NRybT25upQOkkW5IFM8qBri0tQ+hcI0ZV7yFiCdyN0K3r+dlZCHso8BX\\n\"\n            \"4d99LWPKW7Y0vt2za6OnD/nKLfRHEUIL588eLRQskID9jhPyLlPjRGHOmDK2BF1m\\n\"\n            \"/dcuHvBWdwxPXKeDWvAGrygrMTVs0Lz9Gn2gMO6XFqVSlLhCEueggksfSjjgRvPN\\n\"\n            \"1nGIWeHHyF4LKRXNV0Fstt26H8O1I9WTBozFC7MtsdIORC3OinftbTuc7dZeb110\\n\"\n            \"NJpCLWePFT5mIzEqAKYwxkMPLGLHfH5CzJpmNFaN+4UmQiOwwNiigjFLLykjli1C\\n\"\n            \"g/3Tk32E4uADff1xzIb5+hV28Yh2I45np7YXJX5FowWoGQKL8/qCs/BhwA6rHTkw\\n\"\n            \"w7W/G/BLjwEti9jwWO4XnI9PIRm3rzRmr34J4+x2qSKYi41LajiEdk00sMxcHupx\\n\"\n            \"SteCY0IHsSL0P7DVHfkjUV/rx8GLh7ugb/TMoiS3Dvh6Tk4Dj6cW7nRSYvFALu0v\\n\"\n            \"iofcr89K/gbkyOms4rHdd1/124zMRzh3KZs4O6ZnEFgTTEVMMGYrSS6gpvKHyp6G\\n\"\n            \"CCEZHDe2mZHuOI64iEDXyX0qvCLBBrMUBu/zeQ44zf0AtI4vkROSNR9TIY59p93s\\n\"\n            \"+a51iW50gTuv9Vojd6jHzKPMqe2PrKGekFZBTpROQsUBiPepTDT00lkb+u7t4sYp\\n\"\n            \"wbWwQlvEm7JVrK7HxP8/dvz19CVs41rEM9op2AT3Pg18jG+LXZfbVDX/Yv4P8077\\n\"\n            \"IB4XMAKh/CazkTp5H3lIujcs9LKS/jtCsnSUGu5myS4rr3XH9NSYN2LUmHfHOInW\\n\"\n            \"YMHGRkNkBT7Znt/khVpwENeC0x1nT6c7V/bgQ3mV/xsvE3utKsNi78P2VOippehA\\n\"\n            \"npG41/cfUSI8yFWMQpmAezgFeLAojM0j71l0ZQqdcpvnUl8+wBnOSzEtsx7XU6of\\n\"\n            \"UXvsuDyWJkyYe9bHchyKYlstYlnmaIGQu1uzpjix5m2WHhdHHrgTsF7YJ19UU/TP\\n\"\n            \"gE5cuuMpmuRTQRCii2kh6YghsOEKF0+C/zg2wAHLuLXOZzGLBcEvxHL/0U/5s6Yg\\n\"\n            \"5HiUeW5FtnfNO8TvvVFT0odTK5lfIqqRn2td1w9Q7q7sVPgGu35P6Lb7tP31Se8N\\n\"\n            \"CjOmcnjMtFH/PV9yzq9mmhsroHDmWeF0YIl0ghdYh3fDFo6StDl7WzTNzrqQdvTn\\n\"\n            \"aetSA5odZ8m+Us7PFXWGijedwBfdvWdljQlw39vQ6voQiCZY+drcyeXEm3YAUtgD\\n\"\n            \"3m6qMiZ2D86O3SLBm2AJaVlQZH2nIQm1UJZdjZNYW5y3fvTjIBjw6Q2WfhXub5M2\\n\"\n            \"OJq40X+7AkKunKj0zmsn9TRaoRnasmxh542Fy1pwTpll9pR7DZVSC6mtMffOSKz4\\n\"\n            \"XJr3CX5j8wUMnVSuISYuW5innPoZIOQ5gKFtpdGUTpaxD7ZFxU1wyzycmFZ9ZGGJ\\n\"\n            \"9f72DfAYHFNMMM4ymh2VZ474OFmx9ewPIWxNm4svV3OiPOaAVMnw4+3Jdxp92ivb\\n\"\n            \"YK3j3vnyP7fN02CrujAR2RufIUiPOM5NKgJe6mzrOANr/i77Q3A3hiD4tAEWRRNF\\n\"\n            \"W+3SuoAqeS4AtTBv2WhQmBXh7PlsfZyjKex/VbyOdNjinvoIMirdSuluirTo0Crp\\n\"\n            \"ySZEllKFniZwo/wVJfqhrn3KRYdjO1G8ZkW67MhweHSSbZtqyvzR8OntMkWH4Kv2\\n\"\n            \"m+g2vq/OIm4ScjCUUGwm5Kd+f056ec5/78Cxre2VVDu7JHt2kVkAHDOdXvPQHWvq\\n\"\n            \"tel83ImadoOhjCZW4aV8xTzvFuRlBNdqEjlygQca5obUdMYB9KAxIUEyyZ2R2L1W\\n\"\n            \"of+b3iejYF6h30pVrez3sYdELj5vjAO3wIRlFLtSw7JQgU6m5y0koQTs3KuFQO5n\\n\"\n            \"3pFZsld6JAHsLuZ5kh3fwUAxwLaCjfOX7KiFsnBEathEVD8ATvrbDomtkJWOSfYO\\n\"\n            \"s4pKrnA1opoSJ7vPt+PsEZwLi4Yki/AqDHAXRnpdKCU1EyumgklGZXwI0scc7Dit\\n\"\n            \"MJR5MqWAF46TmsOpowB+rBXXdQi2UgNjBzFjxYa9YRf5sRwvyo0JUcMATwy75g2P\\n\"\n            \"yNp9cvNNltRXv3VE1oYxRbeJ9uG0Nf4osq+d/cFUhHVaC610oHTXPou0llpAWefJ\\n\"\n            \"lP92HmPyTwIfXtOfYt5Vbv6NOTc2m+xn1w+H8MVniQUbo7JhYs5BBUadc0VScaOA\\n\"\n            \"ScBTDWQb/wFqzMQhsaYVNpzMTYyDKxbb63poz7EbbgUb9IBSNvmnIJI6C3ItVDqn\\n\"\n            \"xWnTDQ3pk5vdGqgRE0MCrSkzQ3PEK5mlp9wUkqK5Kiq5loIrB19IwXH140dCOd1M\\n\"\n            \"vo4o5Ed85CfBl3xFQArFQm+0pQ2oQnU1NHjORHoN1MklAmtmYaFo5JEGHbxQnurt\\n\"\n            \"b+XI03vg1Bro8wuaGlSmnktZnKfTBT1FZTJIkFGViY4fFXyM9GL6scEN8nJFgBn0\\n\"\n            \"2eeaax2ZXB0ptbay79gkVVVshW02lStYtbyaMC1U/ns48DaUtHknqR72WDt9D1bC\\n\"\n            \"-----END RSA PRIVATE KEY-----\\n\"\n    };\n\n    const std::string public_pem\n    {\n            \"-----BEGIN PUBLIC KEY-----\\n\"\n            \"MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA3Delbh36s+NJCCOYi1ql\\n\"\n            \"NGp+R5EoKWtcazi+Kh/t2V4kN4QCEQdxi3nlhbHdiWWNi8puwwJYFDRdjZvEO+2H\\n\"\n            \"yEyFui4v9Rl/RoGdDQeXEeQ+QxMVvT6Ya7+unRDjlIuNmQNNe4HKlcA4fqhRqi07\\n\"\n            \"bF2b1kceuPsxIXcBnrsVVqxvSvqjiVkaSnk+HACm8fjiTwGSFE3ZhooMgxENEWrw\\n\"\n            \"Ltcr80UdWpMvCrlBCWtlxiLl8VgoPCDZ/R2iXvJaQAOwepfdFGmcPomcO9BOEJfn\\n\"\n            \"Jg4sBQNu4CqN5KRCS8CN39E705s4upFMRleU6nKHa0kSb9OsqJP/0i0fBVFLsxpX\\n\"\n            \"WbR2iLwpCy3YqJqwoS8PFz9rr4V9ESqRJlczjkRt6bfx4/fSskxsXWRl+Dlv1V/P\\n\"\n            \"Sl0zlJXMoxpPuLANxEVsnR9fT07h0XuQ58dsjbMImTL8Hmomfl3n2WK35TesAAaO\\n\"\n            \"WNa4+2LFYzKwLUL9cRv696544eo8TCi+bXEKSCmUzpLsLIeHVmeHy3CiUUq13ktE\\n\"\n            \"ykQD9vdtoyJkWJ4n5QMQVaV1k1hJ0V8EMfpV9mMEpItfQQRqDW1QG2fHbZgrUV1m\\n\"\n            \"5PdnWwf3L9nMNxja7nX0vk5QVw1r8Kl4KqP4sid4djBYz4SBLeSfimUDw/USsKik\\n\"\n            \"MwoaYGgrejBmlvZ5UiFw+xMCAwEAAQ==\\n\"\n            \"-----END PUBLIC KEY-----\"\n    };\n\n\n    // note the \\x0a appended to the end of the uuid's. Since the OpenSSL signing\n    // is done on the command line with text files, the \\x0a is the new line\n    // marker and may need to be appended for the signing to work.\n    const std::string valid_uuid        {\"81ca538-a222-4add-8cb8-065c8b65a391\\x0a\"};\n    const std::string invalid_uuid      {\"71da427-a222-4add-8cb8-065c8b65a391\\x0a\"};\n\n    const unsigned char signature_sha256[] = {\n            0x3a, 0x8f, 0x19, 0x94, 0x34, 0x1c, 0x32, 0x56, 0x45, 0xe2, 0x1a, 0xa7,\n            0x84, 0xdf, 0xf6, 0x0f, 0x3d, 0xc5, 0x61, 0xaa, 0xd9, 0x1e, 0xb1, 0x9f,\n            0xfb, 0xce, 0xe2, 0xf8, 0x95, 0x12, 0xc4, 0x1b, 0xb6, 0x18, 0xa1, 0x64,\n            0xf1, 0x26, 0x1c, 0x0e, 0xbc, 0x23, 0x73, 0x40, 0xee, 0x85, 0x40, 0xb1,\n            0xa5, 0x15, 0x50, 0xa6, 0x93, 0x24, 0xe5, 0xf8, 0xd9, 0xb4, 0x9d, 0xeb,\n            0xe8, 0x8f, 0x74, 0xeb, 0xa8, 0xdc, 0x12, 0x92, 0x4f, 0x96, 0x35, 0x35,\n            0x48, 0x2d, 0x53, 0x86, 0x9c, 0xbe, 0x01, 0x41, 0x18, 0xc7, 0x4a, 0xfa,\n            0xe3, 0x44, 0x8a, 0x47, 0x02, 0xb0, 0x98, 0x93, 0x1e, 0xea, 0x64, 0x5d,\n            0x48, 0x9e, 0xf9, 0xad, 0xc6, 0x07, 0xbb, 0x9f, 0x9e, 0xb5, 0xa8, 0xce,\n            0x59, 0x68, 0xcc, 0xb3, 0x8b, 0xd8, 0x42, 0xd7, 0x30, 0x7d, 0x51, 0x77,\n            0xa0, 0x47, 0x7d, 0xfe, 0x96, 0x63, 0x79, 0xaf, 0x31, 0xe8, 0xfb, 0xa1,\n            0x9c, 0xce, 0x74, 0xf8, 0x53, 0xe9, 0x9e, 0xf8, 0x2e, 0xe7, 0xb2, 0xfc,\n            0xbc, 0x77, 0x5e, 0x5a, 0x30, 0xaa, 0x02, 0x23, 0xf2, 0xa2, 0x64, 0x12,\n            0x2e, 0x02, 0x09, 0x3e, 0x3b, 0xcc, 0x27, 0x0e, 0x1a, 0x1d, 0x45, 0x04,\n            0xde, 0xd1, 0xd7, 0xd5, 0x63, 0x81, 0xf1, 0x70, 0xc7, 0x76, 0xfb, 0xa1,\n            0x8b, 0xd8, 0x19, 0x38, 0x3c, 0xd9, 0x59, 0xb7, 0x48, 0xf7, 0x62, 0x4d,\n            0x86, 0x82, 0xdb, 0xc2, 0xf8, 0xe6, 0x84, 0xa4, 0xde, 0x4c, 0xdf, 0x85,\n            0x6c, 0x1b, 0x5d, 0x24, 0x88, 0xc2, 0xd3, 0xe5, 0x74, 0xb0, 0xc1, 0x66,\n            0x18, 0xd2, 0x50, 0xf1, 0x62, 0x24, 0x26, 0xc7, 0x0d, 0xd2, 0x1c, 0xd1,\n            0x92, 0x67, 0x65, 0x53, 0xde, 0xb9, 0x94, 0x77, 0xb8, 0x86, 0xa9, 0x5c,\n            0x33, 0x21, 0x1d, 0x4d, 0x29, 0xd8, 0x4a, 0x70, 0xbb, 0x34, 0x81, 0xc5,\n            0x7e, 0xf2, 0x45, 0x04, 0x16, 0x22, 0xf6, 0x47, 0x00, 0x54, 0x1c, 0x24,\n            0x63, 0x20, 0x0b, 0x40, 0x3b, 0xfa, 0x89, 0x31, 0x8c, 0x48, 0x8d, 0x75,\n            0xfe, 0x77, 0x30, 0x75, 0x3c, 0xf8, 0xfc, 0x61, 0x8f, 0xa1, 0xd6, 0x94,\n            0x3c, 0x5c, 0x5f, 0xfd, 0x65, 0x47, 0x53, 0x3e, 0xab, 0x04, 0x0b, 0x53,\n            0x2a, 0xf9, 0xfc, 0x2a, 0x0e, 0xb5, 0x17, 0xa7, 0x15, 0x85, 0xc1, 0x52,\n            0x0a, 0x38, 0xb0, 0xd9, 0xb5, 0x86, 0xa5, 0xe5, 0x9c, 0x59, 0x32, 0xfe,\n            0x08, 0x66, 0xdf, 0x60, 0x2b, 0xd9, 0x36, 0x20, 0x15, 0xc8, 0xee, 0xd0,\n            0x76, 0x67, 0xe3, 0xe6, 0x1a, 0x0b, 0xbb, 0xb2, 0x86, 0xfa, 0x7c, 0x41,\n            0x2c, 0x5f, 0x2e, 0xa1, 0x49, 0x7a, 0xb7, 0x70, 0x5d, 0x2b, 0x3f, 0x43,\n            0xaa, 0x0f, 0x55, 0x7f, 0xe4, 0x15, 0xb5, 0xa5, 0x63, 0xfc, 0x23, 0x83,\n            0xd6, 0x75, 0x32, 0x91, 0x75, 0xd1, 0x57, 0x17, 0xcb, 0xa3, 0x87, 0x4d,\n            0x05, 0x2f, 0x9a, 0x56, 0xc9, 0x8e, 0x16, 0x3a, 0x69, 0x29, 0xa1, 0x2f,\n            0x99, 0xe4, 0xf9, 0x4b, 0x05, 0x8e, 0x49, 0x5a, 0xca, 0x67, 0x03, 0xee,\n            0x4e, 0x29, 0x55, 0xf6, 0x30, 0x9e, 0x84, 0x56, 0xc5, 0x64, 0x5e, 0x8c,\n            0x3f, 0x28, 0x96, 0xe6, 0x67, 0x29, 0xf6, 0xde, 0x03, 0xdb, 0xb8, 0x4c,\n            0xa3, 0x3f, 0xd2, 0x88, 0xa8, 0xc2, 0xa9, 0xd3, 0x7d, 0xdd, 0x87, 0x41,\n            0x3b, 0x81, 0x41, 0x17, 0xf7, 0x16, 0x0f, 0x95, 0x87, 0x98, 0x3e, 0xca,\n            0x69, 0xa2, 0x58, 0x9a, 0x7c, 0xed, 0xcf, 0x75, 0xbe, 0xc5, 0x2e, 0xdb,\n            0xfe, 0xa9, 0x36, 0x3d, 0xc3, 0x7e, 0xaa, 0x96, 0x44, 0x5e, 0xc7, 0xeb,\n            0x5a, 0x27, 0xb8, 0xa6, 0xb0, 0x75, 0xba, 0x61, 0x12, 0x6a, 0xf6, 0x0b,\n            0x0b, 0x5a, 0x4b, 0x86, 0x81, 0x20, 0x73, 0x48, 0xd1, 0x52, 0x5d, 0x5b,\n            0xf6, 0x61, 0xd2, 0x63, 0xb1, 0x38, 0xa6, 0xe9\n    };\n    const unsigned int signature_sha256_len = 512;\n\n    const std::string signature\n    {\n        \"Oo8ZlDQcMlZF4hqnhN/2Dz3FYarZHrGf+87i+JUSxBu2GKFk8SYcDrwjc0DuhUCx\"\n        \"pRVQppMk5fjZtJ3r6I9066jcEpJPljU1SC1Thpy+AUEYx0r640SKRwKwmJMe6mRd\"\n        \"SJ75rcYHu5+etajOWWjMs4vYQtcwfVF3oEd9/pZjea8x6PuhnM50+FPpnvgu57L8\"\n        \"vHdeWjCqAiPyomQSLgIJPjvMJw4aHUUE3tHX1WOB8XDHdvuhi9gZODzZWbdI92JN\"\n        \"hoLbwvjmhKTeTN+FbBtdJIjC0+V0sMFmGNJQ8WIkJscN0hzRkmdlU965lHe4hqlc\"\n        \"MyEdTSnYSnC7NIHFfvJFBBYi9kcAVBwkYyALQDv6iTGMSI11/ncwdTz4/GGPodaU\"\n        \"PFxf/WVHUz6rBAtTKvn8Kg61F6cVhcFSCjiw2bWGpeWcWTL+CGbfYCvZNiAVyO7Q\"\n        \"dmfj5hoLu7KG+nxBLF8uoUl6t3BdKz9Dqg9Vf+QVtaVj/COD1nUykXXRVxfLo4dN\"\n        \"BS+aVsmOFjppKaEvmeT5SwWOSVrKZwPuTilV9jCehFbFZF6MPyiW5mcp9t4D27hM\"\n        \"oz/SiKjCqdN93YdBO4FBF/cWD5WHmD7KaaJYmnztz3W+xS7b/qk2PcN+qpZEXsfr\"\n        \"Wie4prB1umESavYLC1pLhoEgc0jRUl1b9mHSY7E4puk=\"\n    };\n\n\n    const std::string temporary_public_pem\n    {\n        \"-----BEGIN PUBLIC KEY-----\\n\"\n        \"MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA3Delbh36s+NJCCOYi1ql\\n\"\n        \"NGp+R5EoKWtcazi+Kh/t2V4kN4QCEQdxi3nlhbHdiWWNi8puwwJYFDRdjZvEO+2H\\n\"\n        \"yEyFui4v9Rl/RoGdDQeXEeQ+QxMVvT6Ya7+unRDjlIuNmQNNe4HKlcA4fqhRqi07\\n\"\n        \"bF2b1kceuPsxIXcBnrsVVqxvSvqjiVkaSnk+HACm8fjiTwGSFE3ZhooMgxENEWrw\\n\"\n        \"Ltcr80UdWpMvCrlBCWtlxiLl8VgoPCDZ/R2iXvJaQAOwepfdFGmcPomcO9BOEJfn\\n\"\n        \"Jg4sBQNu4CqN5KRCS8CN39E705s4upFMRleU6nKHa0kSb9OsqJP/0i0fBVFLsxpX\\n\"\n        \"WbR2iLwpCy3YqJqwoS8PFz9rr4V9ESqRJlczjkRt6bfx4/fSskxsXWRl+Dlv1V/P\\n\"\n        \"Sl0zlJXMoxpPuLANxEVsnR9fT07h0XuQ58dsjbMImTL8Hmomfl3n2WK35TesAAaO\\n\"\n        \"WNa4+2LFYzKwLUL9cRv696544eo8TCi+bXEKSCmUzpLsLIeHVmeHy3CiUUq13ktE\\n\"\n        \"ykQD9vdtoyJkWJ4n5QMQVaV1k1hJ0V8EMfpV9mMEpItfQQRqDW1QG2fHbZgrUV1m\\n\"\n        \"5PdnWwf3L9nMNxja7nX0vk5QVw1r8Kl4KqP4sid4djBYz4SBLeSfimUDw/USsKik\\n\"\n        \"MwoaYGgrejBmlvZ5UiFw+xMCAwEAAQ==\\n\"\n        \"-----END PUBLIC KEY-----\"\n    };\n\n\n    const std::map<bzn::uuid_t, std::vector<bzn::peer_address_t>> SWARMS\n    {\n        {\n            {\"BluzelleSwarm\",\n             {\n                bzn::peer_address_t(\"209.50.61.87\", 51010, \"node_0\", \"MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEysScFkwI4d8I65aJnr8UAohqjYCYuBXgMb73Aa0SlQF62+ql4XGuTRoYZVX8L9WrzSlg3m4UY7KrIBJPYS++pA==\"),\n                bzn::peer_address_t(\"212.2.189.19\", 51010, \"node_1\", \"MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEqWDJpK28T/9wHAVLrgTQFgBToHEF9W1WNv1ot7mqyNODHyQL+m8gt3CoMSJZc2Op0pF7PuYDex87koGbKVo9KA==\"),\n                bzn::peer_address_t(\"62.134.146.33\", 51010,\"node_2\", \"MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEmuAiBMszxYT8GM9RzoBHHHmo5Y6Hs+KO+ny48iF8UtSy55LcOfj4P8v4s9TUx3VdLxtCBAKk6ZHqBcHDQrZl4Q==\"),\n                bzn::peer_address_t(\"75.96.163.85\", 51010, \"node_3\", \"MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE73T48e2Go71nvycBVHvTxKJ27qFdQBJ4Fcp6n9V9NhjrCAmfz3rn86XOMiCKzsSXc3qDr/C8LhTB5KfHhCoLKg==\"),\n                bzn::peer_address_t(\"152.44.45.81\", 51010, \"node_4\", \"MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEyCa3KWa9/jMtlZ7+mMgX2Qih6JkKE2x8l5Y3aErf7e22d77fY51zidS+9d26Fm5TPC6dOZ4M7i9BIhVsIodLtA==\"),\n                bzn::peer_address_t(\"152.44.45.82\", 51010, \"node_5\", \"MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEEERq5ucX48gQwTdtc2JFIDjySD0gA9VFppTZaXM4RuOxwuBJ3NVpPl6HjG5hDDLU6wVNCZQMTzLsvOzm9bFwJw==\"),\n                bzn::peer_address_t(\"75.96.165.79\", 51010, \"node_6\", \"MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE5ZG9N2xBiAbl2BVXmw6QCvTgpnZ58RYJ9du4C42QVAyBw5ok+7xvytZ1WBVLYfACK8SP7Q1neKNVK6UvAReVAA==\")\n             }},\n             {\"BluzelleSwarm2\",\n              {\n                 bzn::peer_address_t(\"127.0.0.1\", 51010, \"TestNodeBZ\", \"nodeuuid1\"),\n                 bzn::peer_address_t(\"127.0.0.1\", 51011, \"TestNodeBZ1\", \"nodeuuid2\"),\n                 bzn::peer_address_t(\"127.0.0.1\", 51012, \"TestNodeBZ2\", \"nodeuuid3\"),\n                 bzn::peer_address_t(\"127.0.0.1\", 51013, \"TestNodeBZ3\", \"nodeuuid4\")\n              }},\n              {\"BluzelleSwarm3\",\n               {\n                  bzn::peer_address_t(\"10.0.0.60\", 51010, \"NodeBZ1\", \"uuid1\"),\n                  bzn::peer_address_t(\"10.0.0.60\", 51011, \"NodeBZ2\", \"uuid2\"),\n                  bzn::peer_address_t(\"10.0.0.60\", 51012, \"NodeBZ3\", \"uuid3\"),\n                  bzn::peer_address_t(\"10.0.0.60\", 51013, \"NodeBZ4\", \"uuid4\"),\n                  bzn::peer_address_t(\"10.0.0.60\", 51014, \"NodeBZ5\", \"uuid5\"),\n                  bzn::peer_address_t(\"10.0.0.60\", 51015, \"NodeBZ6\", \"uuid6\"),\n                  bzn::peer_address_t(\"10.0.0.60\", 51016, \"NodeBZ7\", \"uuid7\"),\n                  bzn::peer_address_t(\"10.0.0.60\", 51017, \"NodeBZ8\", \"uuid8\"),\n                  bzn::peer_address_t(\"10.0.0.60\", 51018, \"NodeBZ9\", \"uuid9\"),\n                  bzn::peer_address_t(\"10.0.0.60\", 51019, \"NodeBZ10\", \"uuid10\")\n               }}\n        }};\n}\n\n\nTEST(util_test, test_that_is_blacklisted_member_returns_TRUE_if_uuid_IS_found_in_blacklist)\n{\n    EXPECT_TRUE(bzn::utils::blacklist::is_blacklisted(BLACKLISTED_UUID));\n\n    std::shuffle(blacklisted_uuids.begin(), blacklisted_uuids.end(), random_engine );\n\n    std::for_each(blacklisted_uuids.begin(), blacklisted_uuids.begin()+5,[](const auto& uuid) {\n        EXPECT_TRUE(bzn::utils::blacklist::is_blacklisted(uuid));\n    });\n}\n\n\nTEST(util_test, test_that_is_whitelist_member_returns_FALSE_if_uuid_is_NOT_found_in_whitelist)\n{\n    EXPECT_FALSE(bzn::utils::blacklist::is_blacklisted(NOT_BLACKLISTED_UUID));\n}\n\n\nTEST(util_test, test_that_a_poorly_formed_uuid_fails)\n{\n    EXPECT_THROW(bzn::utils::blacklist::is_blacklisted(\"0}56fcb3-ae1e-4b3e-b794-be3270cc9d43\", \"http://localhost:74858\"), std::runtime_error);\n}\n\n\nTEST(util_test, test_that_openssl_based_base64_encoding_works_correctly)\n{\n    std::vector<unsigned char> base64_decoded_output;\n    // TODO: return value for success is 0, in this case. We should standardize this across the rest of the application\n    EXPECT_EQ( 0, bzn::utils::crypto::base64_decode((char*)signature.c_str(), base64_decoded_output));\n    EXPECT_EQ( signature_sha256_len, base64_decoded_output.size());\n    EXPECT_EQ( 0, std::memcmp( signature_sha256, base64_decoded_output.data(), base64_decoded_output.size() ));\n}\n\n\nTEST(util_test, test_that_a_uuid_can_be_validated)\n{\n    EXPECT_TRUE(bzn::utils::crypto::verify_signature( public_pem, signature, valid_uuid));\n    EXPECT_FALSE(bzn::utils::crypto::verify_signature( public_pem, signature, invalid_uuid));\n}\n\n\nTEST(util_test, test_that_verifying_a_signature_with_empty_inputs_will_fail_gracefully)\n{\n    EXPECT_FALSE(bzn::utils::crypto::verify_signature( \"\", signature, valid_uuid));\n    EXPECT_FALSE(bzn::utils::crypto::verify_signature( public_pem, \"\", valid_uuid));\n    EXPECT_FALSE(bzn::utils::crypto::verify_signature( public_pem, signature, \"\"));\n}\n\n\nTEST(util_test, test_that_esr_returns_peers_list)\n{\n    bzn::utils_interface iface;\n    // Check for swarm that doesn't exist, must return empty vector.\n    {\n        const std::pair<bzn::uuid_t, size_t> BAD_SWARM{\"NonExistentBluzelleSwarm\", 0};\n        bzn::utils_interface iface;\n        const auto peer_ids = iface.get_peer_ids(BAD_SWARM.first, bzn::utils::DEFAULT_SWARM_INFO_ESR_ADDRESS, bzn::utils::ROPSTEN_URL);\n        EXPECT_EQ( BAD_SWARM.second, peer_ids.size());\n    }\n\n    for (const auto& swarm : SWARMS)\n    {\n        std::vector<bzn::uuid_t> accepted_ids(swarm.second.size());\n        std::transform(swarm.second.begin(), swarm.second.end(), accepted_ids.begin(), [](const auto &pinfo){return pinfo.uuid;});\n        const auto peer_ids = iface.get_peer_ids(swarm.first, bzn::utils::DEFAULT_SWARM_INFO_ESR_ADDRESS, bzn::utils::ROPSTEN_URL);\n        EXPECT_EQ(swarm.second.size(), peer_ids.size());\n        EXPECT_EQ(accepted_ids, peer_ids);\n    }\n}\n\n\nTEST(util_test, test_that_esr_returns_peers_list_with_deletions)\n{\n    bzn::utils_interface iface;\n    // There is a swarm in the ESR called BluzelleSwarm4.  It contins 2 nodes, there were originally 4, the 2nd and 4th\n    // node have been deleted which will leave two 0 length strings.\n    const std::string CONTRACT{\"D5B3d7C061F817ab05aF9Fab3b61EEe036e4f4fc\"};\n    const std::string SWARM_ID{\"BluzelleSwarm4\"};\n    const std::vector<bzn::uuid_t> ACCEPTED_IDS{\"MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEvsJhAghU+bWyVjiSg5VMHJKLqs2NGKGNmWTkl3zU8syKIPo+CEuXey7YAAS7pMOFErkjpMyi4FEWnG2ysuN1Pg==\", \"MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbrgU0EQ2UHRG5UFFfcDIaqfarezPvT1uRJAA++8mRc3FgK3DYeTrOdVVopCBLA+EaNiJdkLDObvRkkFny6185g==\"};\n\n    const auto peer_ids = iface.get_peer_ids( SWARM_ID, CONTRACT, bzn::utils::ROPSTEN_URL);\n\n    EXPECT_EQ(ACCEPTED_IDS.size(), peer_ids.size());\n    EXPECT_EQ(ACCEPTED_IDS, peer_ids);\n}\n\n\nTEST(util_test, test_that_esr_fails_nicely)\n{\n    bzn::utils_interface iface;\n    const std::string ESR_CONTRACT{\"3a38a7ed11431975fa4a5403a246850479e7b930\"};\n    const std::string ESR_URL{bzn::utils::ROPSTEN_URL+ \"/uvek7IebbbHoP8Bb9NkV\"};\n\n    // testing non existant node\n    const std::string SWARM_ID{\"testswarm-333333333333333333333333\"};\n    const auto peer_info = iface.get_peer_info(SWARM_ID, \"NOPE\", ESR_CONTRACT, ESR_URL);\n    EXPECT_EQ(peer_info.uuid, \"NOPE\");\n    EXPECT_TRUE(peer_info.host.empty());\n    EXPECT_EQ(peer_info.port, 0);\n    EXPECT_TRUE(peer_info.name.empty());\n}\n\n\nTEST(util_test, test_that_esr_works_with_large_swarm_id)\n{\n    bzn::utils_interface iface;\n    const std::string ESR_CONTRACT{\"3a38a7ed11431975fa4a5403a246850479e7b930\"};\n    const std::string ESR_URL{bzn::utils::ROPSTEN_URL+ \"/uvek7IebbbHoP8Bb9NkV\"};\n\n    const std::string SWARM_ID{\"testswarm-444444444444444444444444444444444444444444444444444444444444\"};\n    const auto peer_info = iface.get_peer_info(SWARM_ID, \"TestUUID1\", ESR_CONTRACT, ESR_URL);\n    EXPECT_EQ(peer_info.uuid, \"TestUUID1\");\n    EXPECT_EQ(peer_info.host, \"127.0.0.1\");\n    EXPECT_EQ(peer_info.port, 51010);\n    EXPECT_EQ(peer_info.name, \"node_1\");\n}\n\n\nTEST(util_test, test_that_esr_returns_peer_info_with_large_node_name)\n{\n    bzn::utils_interface iface;\n    const std::string ESR_CONTRACT{\"3a38a7ed11431975fa4a5403a246850479e7b930\"};\n    const std::string ESR_URL{bzn::utils::ROPSTEN_URL+ \"/uvek7IebbbHoP8Bb9NkV\"};\n\n    // testing esr get peer info parser with a node name larger than 32 characters\n    const std::string SWARM_ID{\"testswarm-333333333333333333333333\"};\n    const auto peer_info = iface.get_peer_info(SWARM_ID, \"TestUUID2\", ESR_CONTRACT, ESR_URL);\n    EXPECT_EQ(peer_info.uuid, \"TestUUID2\");\n    EXPECT_EQ(peer_info.host, \"127.0.0.1\");\n    EXPECT_EQ(peer_info.port, 51010);\n    EXPECT_EQ(peer_info.name, \"node_name111111111111111111111111111111111111111111111111111\");\n}\n\n\nTEST(util_test, test_that_live_esr_returns_peer_info)\n{\n    bzn::utils_interface iface;\n    const std::string ESR_CONTRACT{\"3a38a7ed11431975fa4a5403a246850479e7b930\"};\n    const std::string ESR_URL{bzn::utils::ROPSTEN_URL+ \"/uvek7IebbbHoP8Bb9NkV\"};\n\n    {\n        const std::string SWARM_ID{\"debug-swarm\"};\n        const std::string NODE_ID{\"nodeuuid111111111111111111111111\"};\n        const auto peer_info = iface.get_peer_info(SWARM_ID, NODE_ID, ESR_CONTRACT, ESR_URL);\n        EXPECT_EQ(peer_info.uuid, NODE_ID);\n        EXPECT_EQ(peer_info.host, \"127.0.0.1\");\n        EXPECT_EQ(peer_info.port, 51010);\n        EXPECT_EQ(peer_info.name, \"node_1\");\n    }\n\n    {\n        // testing that the ESR_CONTRACT can be given with the 0x prepended.\n        const std::string SWARM_ID{\"debug-swarm\"};\n        const std::string NODE_ID{\"nodeuuid111111111111111111111111\"};\n        const auto peer_info = iface.get_peer_info(SWARM_ID, NODE_ID, \"0x\" + ESR_CONTRACT, ESR_URL);\n        EXPECT_EQ(peer_info.uuid, NODE_ID);\n        EXPECT_EQ(peer_info.host, \"127.0.0.1\");\n        EXPECT_EQ(peer_info.port, 51010);\n        EXPECT_EQ(peer_info.name, \"node_1\");\n    }\n}\n\n\n\nnamespace bzn::utils::esr\n{\n    const std::string data_string_for_get_peer_info(const std::string &swarm_id, const std::string &peer_id);\n}\n\n\n\nTEST(util_test, test_request_data_validity)\n{\n    std::map<std::pair<std::string,std::string>,std::string> accepted_data\n    {\n        {{\"debug-swarm\",\"nodeuuid111111111111111111111111\"}, \"0xcc8575cb00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000b64656275672d737761726d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000206e6f646575756964313131313131313131313131313131313131313131313131\"},\n        {{\"debug-swarm\", \"nodeuuid1111111111111111111111111\"}, \"0xcc8575cb00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000b64656275672d737761726d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000216e6f6465757569643131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000\"},\n        {{\"debug-swarm\", \"nodeuuid111111111111111111111111111111111111111111111111111111111\"},\"0xcc8575cb00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000b64656275672d737761726d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000416e6f64657575696431313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000\"},\n        {{\"debug-swarm\",\"nodeuuid11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\"},\"0xcc8575cb00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000b64656275672d737761726d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000616e6f646575756964313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000\"},\n        {{\"debug-swarm1111111111111111111111\",\"nodeuuid111111111111111111111111\"},\"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002164656275672d737761726d313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000206e6f646575756964313131313131313131313131313131313131313131313131\"},\n        {{\"debug-swarm1111111111111111111111\",\"nodeuuid1111111111111111111111111\"},\"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002164656275672d737761726d313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000216e6f6465757569643131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000\"},\n        {{\"debug-swarm1111111111111111111111\",\"nodeuuid111111111111111111111111111111111111111111111111111111111\"},\"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002164656275672d737761726d313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000416e6f64657575696431313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000\"},\n        {{\"debug-swarm1111111111111111111111\",\"nodeuuid11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\"},\"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002164656275672d737761726d313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000616e6f646575756964313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000\"},\n        {{\"debug-swarm111111111111111111111111111111111111111111111111111111\",\"nodeuuid111111111111111111111111\"},\"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004164656275672d737761726d3131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000206e6f646575756964313131313131313131313131313131313131313131313131\"},\n        {{\"debug-swarm111111111111111111111111111111111111111111111111111111\",\"nodeuuid1111111111111111111111111\"},\"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004164656275672d737761726d3131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000216e6f6465757569643131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000\"},\n        {{\"debug-swarm111111111111111111111111111111111111111111111111111111\",\"nodeuuid111111111111111111111111111111111111111111111111111111111\"},\"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004164656275672d737761726d3131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000416e6f64657575696431313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000\"},\n        {{\"debug-swarm11111111111111111111111111111111111111111111111111111111111111111111111111111111111111\",\"nodeuuid111111111111111111111111\"},\"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000006164656275672d737761726d31313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000206e6f646575756964313131313131313131313131313131313131313131313131\"},\n        {{\"debug-swarm11111111111111111111111111111111111111111111111111111111111111111111111111111111111111\",\"nodeuuid1111111111111111111111111\"},\"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000006164656275672d737761726d31313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000216e6f6465757569643131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000\"},\n        {{\"debug-swarm11111111111111111111111111111111111111111111111111111111111111111111111111111111111111\",\"nodeuuid111111111111111111111111111111111111111111111111111111111\"},\"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000006164656275672d737761726d31313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000416e6f64657575696431313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000\"},\n        {{\"debug-swarm11111111111111111111111111111111111111111111111111111111111111111111111111111111111111\",\"nodeuuid11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\"},\"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000006164656275672d737761726d31313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000616e6f646575756964313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000\"},\n    };\n\n    for(const auto& info : accepted_data)\n    {\n        const auto& SWARM_ID{info.first.first};\n        const auto& PEER_ID{info.first.second};\n        const auto& ACCEPTED_REQUEST{info.second};\n        const auto& ACTUAL_REQUEST{bzn::utils::esr::data_string_for_get_peer_info(SWARM_ID,PEER_ID)};\n        EXPECT_EQ(ACCEPTED_REQUEST.size(), ACTUAL_REQUEST.size());\n        EXPECT_STRCASEEQ(ACCEPTED_REQUEST.c_str(), ACTUAL_REQUEST.c_str());\n    }\n}\n"
  },
  {
    "path": "utils/utils_interface.hpp",
    "content": "// Copyright (C) 2019 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n#include <utils/utils_interface_base.hpp>\n\nnamespace bzn\n{\n    class utils_interface : public utils_interface_base\n    {\n    public:\n        std::vector<std::string> get_peer_ids(const bzn::uuid_t& swarm_id, const std::string& esr_address, const std::string& url) const;\n        bzn::peer_address_t get_peer_info(const bzn::uuid_t& swarm_id, const std::string& peer_id, const std::string& esr_address, const std::string& url) const;\n\n        // Performs an HTTP GET or POST and returns the body of the HTTP response\n        std::string sync_req(const std::string& url, const std::string& post = \"\") const;\n    };\n}\n\n\n"
  },
  {
    "path": "utils/utils_interface_base.hpp",
    "content": "// Copyright (C) 2019 Bluzelle\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License, version 3,\n// as published by the Free Software Foundation.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n#include <include/bluzelle.hpp>\n#include <string>\n#include <vector>\n#include <peers_beacon/peer_address.hpp>\n\n\nnamespace bzn\n{\n    class utils_interface_base\n    {\n    public:\n        virtual std::vector<std::string> get_peer_ids(const bzn::uuid_t& swarm_id, const std::string& esr_address, const std::string& url) const = 0;\n        virtual bzn::peer_address_t get_peer_info(const bzn::uuid_t& swarm_id, const std::string& peer_id, const std::string& esr_address, const std::string& url) const = 0;\n\n        // Performs an HTTP GET or POST and returns the body of the HTTP response\n        virtual std::string sync_req(const std::string& url, const std::string& post = \"\") const = 0;\n\n        virtual ~utils_interface_base() = default;\n    };\n}\n\n"
  },
  {
    "path": "valgrind/bluzelle.supp",
    "content": "{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZZN3bzn5audit5startEvENKUlvE_clEv\n   fun:_ZSt13__invoke_implIvZN3bzn5audit5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIZN3bzn5audit5startEvEUlvE_JEENSt15__invoke_resultIT_JDpT0_EE4typeEOS4_DpOS5_\n   fun:_ZZSt9call_onceIZN3bzn5audit5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIZN3bzn5audit5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIZN3bzn5audit5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv\n   fun:open_record<const boost::log::v2s_mt_posix::attribute_set&>\n   fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZZN3bzn5audit5startEvENKUlvE_clEv\n   fun:_ZSt13__invoke_implIvZN3bzn5audit5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZZN3bzn5audit5startEvENKUlvE_clEv\n   fun:_ZSt13__invoke_implIvZN3bzn5audit5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIZN3bzn5audit5startEvEUlvE_JEENSt15__invoke_resultIT_JDpT0_EE4typeEOS4_DpOS5_\n   fun:_ZZSt9call_onceIZN3bzn5audit5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZZN3bzn5audit5startEvENKUlvE_clEv\n   fun:_ZSt13__invoke_implIvZN3bzn5audit5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIZN3bzn5audit5startEvEUlvE_JEENSt15__invoke_resultIT_JDpT0_EE4typeEOS4_DpOS5_\n   fun:_ZZSt9call_onceIZN3bzn5audit5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIZN3bzn5audit5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf6StructC1Ev\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_\n   fun:_ZN6google8protobuf8internal20InitProtobufDefaultsEv\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZNSt10_HashtableIPKcSt4pairIKS1_PFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaISE_ENSt8__detail10_Select1stEN6google8protobuf5streqENSJ_4hashIS1_EENSG_18_Mod_range_hashingENSG_20_Default_ranged_hashENSG_20_Prime_rehash_policyENSG_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZZN3bzn5audit5startEvENKUlvE_clEv\n   fun:_ZSt13__invoke_implIvZN3bzn5audit5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto12InitDefaultsEv\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn15bootstrap_peers21fetch_peers_from_fileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN42bootstrap_file_test_test_invalid_json_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv\n   fun:open_record<const boost::log::v2s_mt_posix::attribute_set&>\n   fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn15bootstrap_peers21fetch_peers_from_fileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN42bootstrap_file_test_test_invalid_json_Test8TestBodyEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn15bootstrap_peers21fetch_peers_from_fileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN42bootstrap_file_test_test_invalid_json_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn15bootstrap_peers21fetch_peers_from_fileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN42bootstrap_file_test_test_invalid_json_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn15bootstrap_peers21fetch_peers_from_fileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN42bootstrap_file_test_test_invalid_json_Test8TestBodyEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:malloc\n   fun:re_node_set_alloc\n   fun:register_state\n   fun:create_cd_newstate\n   fun:re_acquire_state_context\n   fun:create_initial_state\n   fun:re_compile_internal\n   fun:regcomp\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:malloc\n   fun:strdup\n   fun:_ZN7testing8internal5posix6StrDupEPKc\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIiE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIiEE8allocateERS0_m\n   fun:_ZNSt12_Vector_baseIiSaIiEE11_M_allocateEm\n   fun:_ZNSt6vectorIiSaIiEE17_M_realloc_insertIJiEEEvN9__gnu_cxx17__normal_iteratorIPiS1_EEDpOT_\n   fun:_ZNSt6vectorIiSaIiEE12emplace_backIJiEEEvDpOT_\n   fun:_ZNSt6vectorIiSaIiEE9push_backEOi\n   fun:_ZN7testing8TestCase11AddTestInfoEPNS_8TestInfoE\n   fun:_ZN7testing8internal12UnitTestImpl11AddTestInfoEPFvvES3_PNS_8TestInfoE\n   fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:malloc\n   fun:re_node_set_alloc\n   fun:calc_eclosure_iter\n   fun:calc_eclosure\n   fun:analyze\n   fun:re_compile_internal\n   fun:regcomp\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:malloc\n   fun:re_node_set_alloc\n   fun:calc_eclosure_iter\n   fun:calc_eclosure_iter\n   fun:calc_eclosure_iter\n   fun:calc_eclosure_iter\n   fun:calc_eclosure_iter\n   fun:calc_eclosure\n   fun:analyze\n   fun:re_compile_internal\n   fun:regcomp\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:malloc\n   fun:re_node_set_alloc\n   fun:calc_eclosure_iter\n   fun:calc_eclosure_iter\n   fun:calc_eclosure_iter\n   fun:calc_eclosure\n   fun:analyze\n   fun:re_compile_internal\n   fun:regcomp\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7testing8internal12UnitTestImplC1EPNS_8UnitTestE\n   fun:_ZN7testing8UnitTestC1Ev\n   fun:_ZN7testing8UnitTest11GetInstanceEv\n   fun:_ZN7testing8internal15GetUnitTestImplEv\n   fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7testing8internal11ThreadLocalISt6vectorINS0_9TraceInfoESaIS3_EEEC1Ev\n   fun:_ZN7testing8internal12UnitTestImplC1EPNS_8UnitTestE\n   fun:_ZN7testing8UnitTestC1Ev\n   fun:_ZN7testing8UnitTest11GetInstanceEv\n   fun:_ZN7testing8internal15GetUnitTestImplEv\n   fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIPN7testing17TestEventListenerEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIPN7testing17TestEventListenerEEE8allocateERS3_m\n   fun:_ZNSt12_Vector_baseIPN7testing17TestEventListenerESaIS2_EE11_M_allocateEm\n   fun:_ZNSt6vectorIPN7testing17TestEventListenerESaIS2_EE17_M_realloc_insertIJRKS2_EEEvN9__gnu_cxx17__normal_iteratorIPS2_S4_EEDpOT_\n   fun:_ZNSt6vectorIPN7testing17TestEventListenerESaIS2_EE9push_backERKS2_\n   fun:_ZN7testing8internal17TestEventRepeater6AppendEPNS_17TestEventListenerE\n   fun:_ZN7testing18TestEventListeners6AppendEPNS_17TestEventListenerE\n   fun:_ZN7testing18TestEventListeners23SetDefaultResultPrinterEPNS_17TestEventListenerE\n   fun:_ZN7testing8internal12UnitTestImplC1EPNS_8UnitTestE\n   fun:_ZN7testing8UnitTestC1Ev\n   fun:_ZN7testing8UnitTest11GetInstanceEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIPN7testing8TestInfoEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIPN7testing8TestInfoEEE8allocateERS3_m\n   fun:_ZNSt12_Vector_baseIPN7testing8TestInfoESaIS2_EE11_M_allocateEm\n   fun:_ZNSt6vectorIPN7testing8TestInfoESaIS2_EE17_M_realloc_insertIJRKS2_EEEvN9__gnu_cxx17__normal_iteratorIPS2_S4_EEDpOT_\n   fun:_ZNSt6vectorIPN7testing8TestInfoESaIS2_EE9push_backERKS2_\n   fun:_ZN7testing8TestCase11AddTestInfoEPNS_8TestInfoE\n   fun:_ZN7testing8internal12UnitTestImpl11AddTestInfoEPFvvES3_PNS_8TestInfoE\n   fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E\n   fun:__libc_csu_init\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIiE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIiEE8allocateERS0_m\n   fun:_ZNSt12_Vector_baseIiSaIiEE11_M_allocateEm\n   fun:_ZNSt6vectorIiSaIiEE17_M_realloc_insertIJiEEEvN9__gnu_cxx17__normal_iteratorIPiS1_EEDpOT_\n   fun:_ZNSt6vectorIiSaIiEE12emplace_backIJiEEEvDpOT_\n   fun:_ZNSt6vectorIiSaIiEE9push_backEOi\n   fun:_ZN7testing8internal12UnitTestImpl11GetTestCaseEPKcS3_PFvvES5_\n   fun:_ZN7testing8internal12UnitTestImpl11AddTestInfoEPFvvES3_PNS_8TestInfoE\n   fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7testing8internal11ThreadLocalIPNS_8SequenceEEC1Ev\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN7testing11Cardinality25DescribeActualCallCountToEiPSo\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7testing8internal12UnitTestImpl21os_stack_trace_getterEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8UnitTest3RunEv\n   fun:_Z13RUN_ALL_TESTSv\n   fun:main\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7testing1AIRKSt5tupleIJEEEENS_7MatcherIT_EEv\n   fun:_ZN7testing8internal16TypedExpectationIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEEC1EPNS0_18FunctionMockerBaseIS9_EEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJEE\n   fun:_ZN7testing8internal18FunctionMockerBaseIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJEE\n   fun:_ZN7testing8internal8MockSpecIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE18InternalExpectedAtEPKciSC_SC_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7testing1AISt8functionIFvRKN5boost6system10error_codeEEEEENS_7MatcherIT_EEv\n   fun:_ZNK7testing8internal15AnythingMatchercvNS_7MatcherIT_EEISt8functionIFvRKN5boost6system10error_codeEEEEEv\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7testing1AIRKSt5tupleIJSt8functionIFvRKN5boost6system10error_codeEEEEEEENS_7MatcherIT_EEv\n   fun:_ZN7testing8internal16TypedExpectationIFvSt8functionIFvRKN5boost6system10error_codeEEEEEC1EPNS0_18FunctionMockerBaseISA_EEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJNS_7MatcherIS9_EEEE\n   fun:_ZN7testing8internal18FunctionMockerBaseIFvSt8functionIFvRKN5boost6system10error_codeEEEEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJNS_7MatcherIS9_EEEE\n   fun:_ZN7testing8internal8MockSpecIFvSt8functionIFvRKN5boost6system10error_codeEEEEE18InternalExpectedAtEPKciSD_SD_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorImE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaImEE8allocateERS0_m\n   fun:_ZNSt13_Bvector_baseISaIbEE11_M_allocateEm\n   fun:_ZNSt6vectorIbSaIbEE13_M_initializeEm\n   fun:_ZNSt6vectorIbSaIbEEC1ERKS1_\n   fun:_ZN5boost15program_options19options_descriptionC1ERKS1_\n   fun:_ZN5boost15program_options19options_description3addERKS1_\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorImE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaImEE8allocateERS0_m\n   fun:_ZNSt13_Bvector_baseISaIbEE11_M_allocateEm\n   fun:_ZNSt6vectorIbSaIbEE13_M_insert_auxESt13_Bit_iteratorb\n   fun:_ZNSt6vectorIbSaIbEE9push_backEb\n   fun:_ZN5boost15program_options19options_description3addENS_10shared_ptrINS0_18option_descriptionEEE\n   fun:_ZN5boost15program_options19options_description3addERKS1_\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation13init_instanceEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_4core14implementationENS_10shared_ptrIS4_EEE3getEv\n   fun:_ZN5boost3log12v2s_mt_posix4core3getEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_EC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources18severity_logger_mtINS1_7trivial14severity_levelEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS5_EEEERKT_NS_11enable_if_cIXsrNS_3mpl3or_INS_10is_base_ofINS9_20tagged_argument_baseESG_EENSM_INS9_14empty_arg_listESG_EEN4mpl_5bool_ILb0EEEST_ST_EE5valueENS1_3aux12sfinae_dummyEE4typeE\n   fun:_ZN5boost3log12v2s_mt_posix7trivial6logger16construct_loggerEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE16construct_loggerEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14global_storage11get_or_initENS_9typeindex14stl_type_indexEPFNS_10shared_ptrINS3_18logger_holder_baseEEEvE\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE13init_instanceEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn5chaos17start_crash_timerEv\n   fun:_ZZN3bzn5chaos5startEvENKUlvE_clEv\n   fun:_ZSt13__invoke_implIvZN3bzn5chaos5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIZN3bzn5chaos5startEvEUlvE_JEENSt15__invoke_resultIT_JDpT0_EE4typeEOS4_DpOS5_\n   fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv\n   fun:open_record<const boost::log::v2s_mt_posix::attribute_set&>\n   fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn5chaos17start_crash_timerEv\n   fun:_ZZN3bzn5chaos5startEvENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix3aux12_GLOBAL__N_120stream_compound_poolIcE3getEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux15stream_providerIcE17allocate_compoundERNS1_6recordE\n   fun:_ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEEC1ERS8_RNS1_6recordE\n   fun:make_record_pump<boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level> >\n   fun:_ZN3bzn5chaos17start_crash_timerEv\n   fun:_ZZN3bzn5chaos5startEvENKUlvE_clEv\n   fun:_ZSt13__invoke_implIvZN3bzn5chaos5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIZN3bzn5chaos5startEvEUlvE_JEENSt15__invoke_resultIT_JDpT0_EE4typeEOS4_DpOS5_\n   fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:malloc\n   fun:re_node_set_alloc\n   fun:calc_eclosure_iter\n   fun:calc_eclosure_iter\n   fun:calc_eclosure\n   fun:analyze\n   fun:re_compile_internal\n   fun:regcomp\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:malloc\n   fun:re_node_set_init_1\n   fun:link_nfa_nodes\n   fun:preorder\n   fun:analyze\n   fun:re_compile_internal\n   fun:regcomp\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:malloc\n   fun:analyze\n   fun:re_compile_internal\n   fun:regcomp\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:malloc\n   fun:re_node_set_init_copy\n   fun:create_cd_newstate\n   fun:re_acquire_state_context\n   fun:create_initial_state\n   fun:re_compile_internal\n   fun:regcomp\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:malloc\n   fun:re_node_set_alloc\n   fun:calc_eclosure_iter\n   fun:calc_eclosure_iter\n   fun:calc_eclosure_iter\n   fun:calc_eclosure_iter\n   fun:calc_eclosure\n   fun:analyze\n   fun:re_compile_internal\n   fun:regcomp\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:malloc\n   fun:re_node_set_init_1\n   fun:re_node_set_insert\n   fun:duplicate_node_closure\n   fun:calc_eclosure_iter\n   fun:calc_eclosure\n   fun:analyze\n   fun:re_compile_internal\n   fun:regcomp\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEEC1ERKS3_\n   fun:_ZN7testing8internal12UnitTestImplC1EPNS_8UnitTestE\n   fun:_ZN7testing8UnitTestC1Ev\n   fun:_ZN7testing8UnitTest11GetInstanceEv\n   fun:_ZN7testing8internal15GetUnitTestImplEv\n   fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIPN7testing8TestCaseEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIPN7testing8TestCaseEEE8allocateERS3_m\n   fun:_ZNSt12_Vector_baseIPN7testing8TestCaseESaIS2_EE11_M_allocateEm\n   fun:_ZNSt6vectorIPN7testing8TestCaseESaIS2_EE17_M_realloc_insertIJRKS2_EEEvN9__gnu_cxx17__normal_iteratorIPS2_S4_EEDpOT_\n   fun:_ZNSt6vectorIPN7testing8TestCaseESaIS2_EE9push_backERKS2_\n   fun:_ZN7testing8internal12UnitTestImpl11GetTestCaseEPKcS3_PFvvES5_\n   fun:_ZN7testing8internal12UnitTestImpl11AddTestInfoEPFvvES3_PNS_8TestInfoE\n   fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E\n   fun:__libc_csu_init\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIN7testing8internal10linked_ptrINS2_15ExpectationBaseEEEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIN7testing8internal10linked_ptrINS1_15ExpectationBaseEEEEE8allocateERS5_m\n   fun:_ZNSt12_Vector_baseIN7testing8internal10linked_ptrINS1_15ExpectationBaseEEESaIS4_EE11_M_allocateEm\n   fun:_ZNSt6vectorIN7testing8internal10linked_ptrINS1_15ExpectationBaseEEESaIS4_EE17_M_realloc_insertIJRKS4_EEEvN9__gnu_cxx17__normal_iteratorIPS4_S6_EEDpOT_\n   fun:_ZNSt6vectorIN7testing8internal10linked_ptrINS1_15ExpectationBaseEEESaIS4_EE9push_backERKS4_\n   fun:_ZN7testing8internal18FunctionMockerBaseIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJEE\n   fun:_ZN7testing8internal8MockSpecIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE18InternalExpectedAtEPKciSC_SC_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE25DefaultValueHolderFactory13MakeNewHolderEv\n   fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE16GetOrCreateValueEv\n   fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE7pointerEv\n   fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE3getEv\n   fun:_ZN7testing8internal18FunctionMockerBaseIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJEE\n   fun:_ZN7testing8internal8MockSpecIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE18InternalExpectedAtEPKciSC_SC_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7testing7BetweenEii\n   fun:_ZN7testing7AtLeastEi\n   fun:_ZN7testing9AnyNumberEv\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNK7testing17PolymorphicActionINS_8internal12InvokeActionIZN10chaos_testC4EvEUlvE_EEEcvNS_6ActionIT_EEIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteISE_EEvEEEv\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7testing8internal16TypedExpectationIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE8WillOnceERKNS_6ActionIS9_EE\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNK7testing17PolymorphicActionINS_8internal12InvokeActionIZN10chaos_testC4EvEUlvE0_EEEcvNS_6ActionIT_EEIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteISE_EEvEEEv\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIPKvE8allocateEmS2_\n   fun:_ZNSt16allocator_traitsISaIPKvEE8allocateERS2_m\n   fun:_ZNSt12_Vector_baseIPKvSaIS1_EE11_M_allocateEm\n   fun:_ZNSt6vectorIPKvSaIS1_EE17_M_realloc_insertIJS1_EEEvN9__gnu_cxx17__normal_iteratorIPS1_S3_EEDpOT_\n   fun:_ZNSt6vectorIPKvSaIS1_EE12emplace_backIJS1_EEERS1_DpOT_\n   fun:_ZNSt6vectorIPKvSaIS1_EE9push_backEOS1_\n   fun:_ZN7testing8internal16TypedExpectationIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE8WillOnceERKNS_6ActionIS9_EE\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIN7testing8internal10linked_ptrINS2_15ExpectationBaseEEEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIN7testing8internal10linked_ptrINS1_15ExpectationBaseEEEEE8allocateERS5_m\n   fun:_ZNSt12_Vector_baseIN7testing8internal10linked_ptrINS1_15ExpectationBaseEEESaIS4_EE11_M_allocateEm\n   fun:_ZNSt6vectorIN7testing8internal10linked_ptrINS1_15ExpectationBaseEEESaIS4_EE17_M_realloc_insertIJRKS4_EEEvN9__gnu_cxx17__normal_iteratorIPS4_S6_EEDpOT_\n   fun:_ZNSt6vectorIN7testing8internal10linked_ptrINS1_15ExpectationBaseEEESaIS4_EE9push_backERKS4_\n   fun:_ZN7testing8internal18FunctionMockerBaseIFvSt8functionIFvRKN5boost6system10error_codeEEEEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJNS_7MatcherIS9_EEEE\n   fun:_ZN7testing8internal8MockSpecIFvSt8functionIFvRKN5boost6system10error_codeEEEEE18InternalExpectedAtEPKciSD_SD_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNK7testing17PolymorphicActionINS_8internal12InvokeActionIZN10chaos_testC4EvEUlT_E1_EEEcvNS_6ActionIS4_EEIFvSt8functionIFvRKN5boost6system10error_codeEEEEEEv\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNK7testing17PolymorphicActionINS_8internal12InvokeActionIZN10chaos_testC4EvEUlT_E2_EEEcvNS_6ActionIS4_EEIFvSt8functionIFvRKN5boost6system10error_codeEEEEEEv\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost15program_options29options_description_easy_initclEPKcS3_\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZSt15allocate_sharedIN3bzn7optionsESaIS1_EJEESt10shared_ptrIT_ERKT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3anyC1ItEERKT_\n   fun:_ZN5boost15program_options11typed_valueItcE13default_valueERKt\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3anyC1IbEERKT_\n   fun:_ZN5boost15program_options11typed_valueIbcE13default_valueERKb\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3anyC1ImEERKT_\n   fun:_ZN5boost15program_options11typed_valueImcE13default_valueERKm\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3anyC1IdEERKT_\n   fun:_ZN5boost15program_options11typed_valueIdcE13default_valueERKd\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3anyC1IjEERKT_\n   fun:_ZN5boost15program_options11typed_valueIjcE13default_valueERKj\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3anyC1IbEEOT_PNS_10disable_ifINS_7is_sameIRS0_S2_EEvE4typeEPNS4_INS_8is_constIS2_EEvE4typeE\n   fun:_ZN5boost15program_options8validateERNS_3anyERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EEPbi\n   fun:_ZNK5boost15program_options11typed_valueIbcE6xparseERNS_3anyERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EE\n   fun:_ZNK5boost15program_options29value_semantic_codecvt_helperIcE5parseERNS_3anyERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EEb\n   fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb\n   fun:_ZN3bzn14simple_options15combine_optionsEv\n   fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNK5boost3any6holderItE5cloneEv\n   fun:_ZN5boost3anyC1ERKS0_\n   fun:_ZN5boost15program_options14variable_valueC1ERKNS_3anyEb\n   fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb\n   fun:_ZN3bzn14simple_options15combine_optionsEv\n   fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNK5boost3any6holderIjE5cloneEv\n   fun:_ZN5boost3anyC1ERKS0_\n   fun:_ZN5boost15program_options14variable_valueC1ERKNS_3anyEb\n   fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb\n   fun:_ZN3bzn14simple_options15combine_optionsEv\n   fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:malloc\n   fun:_ZN5boost3log12v2s_mt_posix3aux19stateless_allocatorIhE8allocateEmPKv\n   fun:_ZN5boost3log12v2s_mt_posix9attribute4implnwEm\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEEC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_EC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources18severity_logger_mtINS1_7trivial14severity_levelEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS5_EEEERKT_NS_11enable_if_cIXsrNS_3mpl3or_INS_10is_base_ofINS9_20tagged_argument_baseESG_EENSM_INS9_14empty_arg_listESG_EEN4mpl_5bool_ILb0EEEST_ST_EE5valueENS1_3aux12sfinae_dummyEE4typeE\n   fun:_ZN5boost3log12v2s_mt_posix7trivial6logger16construct_loggerEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE16construct_loggerEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14global_storage11get_or_initENS_9typeindex14stl_type_indexEPFNS_10shared_ptrINS3_18logger_holder_baseEEEvE\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE13init_instanceEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_7sources3aux16logger_singletonINS1_7trivial6loggerEEENS_10shared_ptrINS5_13logger_holderINS4_18severity_logger_mtINS7_14severity_levelEEEEEEEE3getEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn5chaos17start_crash_timerEv\n   fun:_ZZN3bzn5chaos5startEvENKUlvE_clEv\n   fun:_ZSt13__invoke_implIvZN3bzn5chaos5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIZN3bzn5chaos5startEvEUlvE_JEENSt15__invoke_resultIT_JDpT0_EE4typeEOS4_DpOS5_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:malloc\n   fun:create_cd_newstate\n   fun:re_acquire_state_context\n   fun:create_initial_state\n   fun:re_compile_internal\n   fun:regcomp\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:malloc\n   fun:realloc\n   fun:register_state\n   fun:create_cd_newstate\n   fun:re_acquire_state_context\n   fun:create_initial_state\n   fun:re_compile_internal\n   fun:regcomp\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPKcEEvT_S8_St12__false_type\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPKcEEvT_S8_St12__false_type\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN3bzn5chaosC2ESt10shared_ptrINS_4asio15io_context_baseEES1_INS_12options_baseEE\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPKcEEvT_S8_St12__false_type\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN3bzn7options18parse_command_lineEiPPKc\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPKcEEvT_S8_St12__false_type\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN3bzn14simple_optionsC2Ev\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPKcEEvT_S8_St12__false_type\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_\n   fun:_ZN5boost15program_options18option_descriptionC1EPKcPKNS0_14value_semanticES3_\n   fun:_ZN5boost15program_options29options_description_easy_initclEPKcPKNS0_14value_semanticES3_\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_\n   fun:_ZN5boost15program_options19options_descriptionC1ERKS1_\n   fun:_ZN5boost15program_options19options_description3addERKS1_\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_\n   fun:_ZN5boost15program_options19options_descriptionC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjj\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_\n   fun:_ZN7testing8TestInfoC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_PKcSA_NS_8internal12CodeLocationEPKvPNSB_15TestFactoryBaseE\n   fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPKcEEvT_S8_St12__false_type\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_\n   fun:_ZN7testing8TestCaseC1EPKcS2_PFvvES4_\n   fun:_ZN7testing8internal12UnitTestImpl11GetTestCaseEPKcS3_PFvvES5_\n   fun:_ZN7testing8internal12UnitTestImpl11AddTestInfoEPFvvES3_PNS_8TestInfoE\n   fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_\n   fun:_ZN5boost3any6holderINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC1ERKS7_\n   fun:_ZN5boost3anyC1INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEERKT_\n   fun:_ZN5boost15program_options11typed_valueINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEcE13default_valueERKS7_\n   fun:_ZN3bzn14simple_options13build_optionsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPKcEEvT_S8_St12__false_type\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_\n   fun:_ZN5boost15program_options18option_descriptionC1EPKcPKNS0_14value_semanticES3_\n   fun:_ZN5boost15program_options29options_description_easy_initclEPKcS3_\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1INS_16exception_detail10clone_implINS3_10bad_alloc_EEEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructIKNS_16exception_detail10clone_baseENS2_10clone_implINS2_10bad_alloc_EEEEEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrIKNS_16exception_detail10clone_baseEEC1INS1_10clone_implINS1_10bad_alloc_EEEEEPT_\n   fun:_ZN5boost16exception_detail27get_static_exception_objectINS0_10bad_alloc_EEENS_13exception_ptrEv\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN5boost6detail16thread_data_baseD2Ev\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1INS_16exception_detail10clone_implINS3_14bad_exception_EEEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructIKNS_16exception_detail10clone_baseENS2_10clone_implINS2_14bad_exception_EEEEEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrIKNS_16exception_detail10clone_baseEEC1INS1_10clone_implINS1_14bad_exception_EEEEEPT_\n   fun:_ZN5boost16exception_detail27get_static_exception_objectINS0_14bad_exception_EEENS_13exception_ptrEv\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN5boost6detail16thread_data_baseD2Ev\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1IKNS_15program_options14value_semanticEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructIKNS_15program_options14value_semanticES4_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrIKNS_15program_options14value_semanticEEC1IS3_EEPT_\n   fun:_ZN5boost15program_options18option_descriptionC1EPKcPKNS0_14value_semanticES3_\n   fun:_ZN5boost15program_options29options_description_easy_initclEPKcS3_\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1INS_15program_options18option_descriptionEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructINS_15program_options18option_descriptionES3_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrINS_15program_options18option_descriptionEEC1IS2_EEPT_\n   fun:_ZN5boost15program_options29options_description_easy_initclEPKcS3_\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1IKNS_15program_options14value_semanticEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructIKNS_15program_options14value_semanticES4_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrIKNS_15program_options14value_semanticEEC1IS3_EEPT_\n   fun:_ZN5boost15program_options18option_descriptionC1EPKcPKNS0_14value_semanticES3_\n   fun:_ZN5boost15program_options29options_description_easy_initclEPKcPKNS0_14value_semanticES3_\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1INS_15program_options18option_descriptionEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructINS_15program_options18option_descriptionES3_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrINS_15program_options18option_descriptionEEC1IS2_EEPT_\n   fun:_ZN5boost15program_options29options_description_easy_initclEPKcPKNS0_14value_semanticES3_\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1INS_15program_options19options_descriptionEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructINS_15program_options19options_descriptionES3_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrINS_15program_options19options_descriptionEEC1IS2_EEPT_\n   fun:_ZN5boost15program_options19options_description3addERKS1_\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1INS_3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15namesEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructINS_3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15namesES7_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrINS_3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15namesEEC1IS6_EEPT_\n   fun:_ZN5boost10shared_ptrINS_3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15namesEE5resetIS6_EEvPT_\n   fun:_ZN5boost3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15names13init_instanceEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS2_23default_attribute_names12_GLOBAL__N_15namesENS_10shared_ptrIS6_EEE3getEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15names3getEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux23default_attribute_names8severityEv\n   fun:_ZN5boost3log12v2s_mt_posix5sinks3aux12default_sinkC1Ev\n   fun:_ZN5boost11make_sharedINS_3log12v2s_mt_posix5sinks3aux12default_sinkEJEEENS_6detail15sp_if_not_arrayIT_E4typeEDpOT0_\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementationC1Ev\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1INS_3log12v2s_mt_posix4coreEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructINS_3log12v2s_mt_posix4coreES4_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrINS_3log12v2s_mt_posix4coreEEC1IS3_EEPT_\n   fun:_ZN5boost10shared_ptrINS_3log12v2s_mt_posix4coreEE5resetIS3_EEvPT_\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation13init_instanceEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_4core14implementationENS_10shared_ptrIS4_EEE3getEv\n   fun:_ZN5boost3log12v2s_mt_posix4core3getEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_EC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources18severity_logger_mtINS1_7trivial14severity_levelEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS5_EEEERKT_NS_11enable_if_cIXsrNS_3mpl3or_INS_10is_base_ofINS9_20tagged_argument_baseESG_EENSM_INS9_14empty_arg_listESG_EEN4mpl_5bool_ILb0EEEST_ST_EE5valueENS1_3aux12sfinae_dummyEE4typeE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn5chaos17start_crash_timerEv\n   fun:_ZZN3bzn5chaos5startEvENKUlvE_clEv\n   fun:_ZSt13__invoke_implIvZN3bzn5chaos5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIZN3bzn5chaos5startEvEUlvE_JEENSt15__invoke_resultIT_JDpT0_EE4typeEOS4_DpOS5_\n   fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv\n   fun:open_record<const boost::log::v2s_mt_posix::attribute_set&>\n   fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn5chaos17start_crash_timerEv\n   fun:_ZZN3bzn5chaos5startEvENKUlvE_clEv\n   fun:_ZSt13__invoke_implIvZN3bzn5chaos5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIZN3bzn5chaos5startEvEUlvE_JEENSt15__invoke_resultIT_JDpT0_EE4typeEOS4_DpOS5_\n   fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPKcEEvT_S8_St12__false_type\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN3bzn5utils6crypto13base64_decodeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt6vectorIhSaIhEE\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15names13init_instanceEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS2_23default_attribute_names12_GLOBAL__N_15namesENS_10shared_ptrIS6_EEE3getEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15names3getEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux23default_attribute_names8severityEv\n   fun:_ZN5boost3log12v2s_mt_posix5sinks3aux12default_sinkC1Ev\n   fun:_ZN5boost11make_sharedINS_3log12v2s_mt_posix5sinks3aux12default_sinkEJEEENS_6detail15sp_if_not_arrayIT_E4typeEDpOT0_\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementationC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4coreC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation13init_instanceEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_4core14implementationENS_10shared_ptrIS4_EEE3getEv\n   fun:_ZN5boost3log12v2s_mt_posix4core3getEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7reserveEm\n   fun:_ZN7testing8internal20StringStreamToStringEPNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK7testing7Message9GetStringB5cxx11Ev\n   fun:_ZN7testing8internal18StreamableToStringIPcEENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKT_\n   fun:_ZN7testing8internal18InitGoogleTestImplIcEEvPiPPT_\n   fun:_ZN7testing14InitGoogleTestEPiPPc\n   fun:_ZN7testing8internal18InitGoogleMockImplIcEEvPiPPT_\n   fun:_ZN7testing14InitGoogleMockEPiPPc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_replaceEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignEPKc\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEPKc\n   fun:_ZN7testing4Mock31RegisterUseByOnCallOrExpectCallEPKvPKci\n   fun:_ZN7testing8internal18FunctionMockerBaseIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJEE\n   fun:_ZN7testing8internal8MockSpecIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE18InternalExpectedAtEPKciSC_SC_\n   fun:_ZN10chaos_testC1Ev\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_replaceEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignEPKc\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEPKc\n   fun:_ZN7testing4Mock31RegisterUseByOnCallOrExpectCallEPKvPKci\n   fun:_ZN7testing8internal18FunctionMockerBaseIFvSt8functionIFvRKN5boost6system10error_codeEEEEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJNS_7MatcherIS9_EEEE\n   fun:_ZN7testing8internal8MockSpecIFvSt8functionIFvRKN5boost6system10error_codeEEEEE18InternalExpectedAtEPKciSD_SD_\n   fun:_ZN10chaos_testC1Ev\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_assignERKS4_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignERKS4_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSERKS4_\n   fun:_ZN5boost6detail19copy_converter_implINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_E11try_convertIRKS7_EEbOT_RS7_\n   fun:_ZN5boost10conversion6detail19try_lexical_convertINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_EEbRKT0_RT_\n   fun:_ZN5boost12lexical_castINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_EET_RKT0_\n   fun:_ZN5boost15program_options11typed_valueINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEcE13default_valueERKS7_\n   fun:_ZN3bzn14simple_options13build_optionsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_replaceEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignEPKc\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEPKc\n   fun:_ZN7testing8internal14CapturedStreamC1Ei\n   fun:_ZN7testing8internal13CaptureStreamEiPKcPPNS0_14CapturedStreamE\n   fun:_ZN7testing8internal13CaptureStderrEv\n   fun:_ZN7testing8internal15NoExecDeathTest10AssumeRoleEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE8allocateERS6_m\n   fun:_ZNSt12_Vector_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE11_M_allocateEm\n   fun:_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE17_M_realloc_insertIJS5_EEEvN9__gnu_cxx17__normal_iteratorIPS5_S7_EEDpOT_\n   fun:_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE12emplace_backIJS5_EEERS5_DpOT_\n   fun:_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE9push_backEOS5_\n   fun:_ZN7testing8internal18InitGoogleTestImplIcEEvPiPPT_\n   fun:_ZN7testing14InitGoogleTestEPiPPc\n   fun:_ZN7testing8internal18InitGoogleMockImplIcEEvPiPPT_\n   fun:_ZN7testing14InitGoogleMockEPiPPc\n   fun:main\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE8allocateERS6_m\n   fun:_ZNSt12_Vector_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE11_M_allocateEm\n   fun:_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE17_M_realloc_insertIJRKS5_EEEvN9__gnu_cxx17__normal_iteratorIPS5_S7_EEDpOT_\n   fun:_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE9push_backERKS5_\n   fun:_ZN5boost15program_options18option_description9set_namesEPKc\n   fun:_ZN5boost15program_options18option_descriptionC1EPKcPKNS0_14value_semanticES3_\n   fun:_ZN5boost15program_options29options_description_easy_initclEPKcPKNS0_14value_semanticES3_\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix3aux14light_functionIFbRKNS1_19attribute_value_setEEEC1INS1_6filter14default_filterEEEOT_\n   fun:_ZN5boost3log12v2s_mt_posix6filterC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementationC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4coreC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation13init_instanceEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_4core14implementationENS_10shared_ptrIS4_EEE3getEv\n   fun:_ZN5boost3log12v2s_mt_posix4core3getEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_EC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources18severity_logger_mtINS1_7trivial14severity_levelEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS5_EEEERKT_NS_11enable_if_cIXsrNS_3mpl3or_INS_10is_base_ofINS9_20tagged_argument_baseESG_EENSM_INS9_14empty_arg_listESG_EEN4mpl_5bool_ILb0EEEST_ST_EE5valueENS1_3aux12sfinae_dummyEE4typeE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIN5boost3log12v2s_mt_posix13attribute_set4nodeEE8allocateEmPKv\n   fun:_ZN5boost3log12v2s_mt_posix14pool_allocatorINS1_13attribute_set4nodeEE8allocateEmPKv\n   fun:_ZN5boost3log12v2s_mt_posix13attribute_set14implementation6insertENS1_14attribute_nameERKNS1_9attributeE\n   fun:_ZN5boost3log12v2s_mt_posix13attribute_set6insertENS1_14attribute_nameERKNS1_9attributeE\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE22add_attribute_unlockedERKNS1_14attribute_nameERKNS1_9attributeE\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_EC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources18severity_logger_mtINS1_7trivial14severity_levelEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS5_EEEERKT_NS_11enable_if_cIXsrNS_3mpl3or_INS_10is_base_ofINS9_20tagged_argument_baseESG_EENSM_INS9_14empty_arg_listESG_EEN4mpl_5bool_ILb0EEEST_ST_EE5valueENS1_3aux12sfinae_dummyEE4typeE\n   fun:_ZN5boost3log12v2s_mt_posix7trivial6logger16construct_loggerEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE16construct_loggerEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14global_storage11get_or_initENS_9typeindex14stl_type_indexEPFNS_10shared_ptrINS3_18logger_holder_baseEEEvE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNSt14_Function_base13_Base_managerISt5_BindIFMN3bzn5chaosEFvRKN5boost6system10error_codeEESt10shared_ptrIS3_ESt12_PlaceholderILi1EEEEE8_M_cloneERSt9_Any_dataRKSI_St17integral_constantIbLb0EE\n   fun:_ZNSt14_Function_base13_Base_managerISt5_BindIFMN3bzn5chaosEFvRKN5boost6system10error_codeEESt10shared_ptrIS3_ESt12_PlaceholderILi1EEEEE10_M_managerERSt9_Any_dataRKSI_St18_Manager_operation\n   fun:_ZNSt8functionIFvRKN5boost6system10error_codeEEEC1ERKS6_\n   fun:_ZNSt8functionIFvRKN5boost6system10error_codeEEEaSERKS6_\n   fun:_ZZN10chaos_testC4EvENKUlT_E1_clISt8functionIFvRKN5boost6system10error_codeEEEEEDaS0_\n   fun:_ZN7testing8internal12InvokeHelperIvSt5tupleIJSt8functionIFvRKN5boost6system10error_codeEEEEEE6InvokeIZN10chaos_testC4EvEUlT_E1_EEvSF_RKSB_\n   fun:_ZN7testing8internal12InvokeActionIZN10chaos_testC4EvEUlT_E1_E7PerformIvSt5tupleIJSt8functionIFvRKN5boost6system10error_codeEEEEEEES3_RKT0_\n   fun:_ZN7testing17PolymorphicActionINS_8internal12InvokeActionIZN10chaos_testC4EvEUlT_E1_EEE15MonomorphicImplIFvSt8functionIFvRKN5boost6system10error_codeEEEEE7PerformERKSt5tupleIJSG_EE\n   fun:_ZNK7testing6ActionIFvSt8functionIFvRKN5boost6system10error_codeEEEEE7PerformERKSt5tupleIJS8_EE\n   fun:_ZN7testing8internal18ActionResultHolderIvE13PerformActionIFvSt8functionIFvRKN5boost6system10error_codeEEEEEEPS2_RKNS_6ActionIT_EERKNS0_8FunctionISF_E13ArgumentTupleE\n   fun:_ZNK7testing8internal18FunctionMockerBaseIFvSt8functionIFvRKN5boost6system10error_codeEEEEE20UntypedPerformActionEPKvSD_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:realloc\n   fun:re_node_set_merge\n   fun:calc_eclosure_iter\n   fun:calc_eclosure_iter\n   fun:calc_eclosure_iter\n   fun:calc_eclosure\n   fun:analyze\n   fun:re_compile_internal\n   fun:regcomp\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:realloc\n   fun:re_node_set_merge\n   fun:calc_eclosure_iter\n   fun:calc_eclosure\n   fun:analyze\n   fun:re_compile_internal\n   fun:regcomp\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3anyC1IdEEOT_PNS_10disable_ifINS_7is_sameIRS0_S2_EEvE4typeEPNS4_INS_8is_constIS2_EEvE4typeE\n   fun:_ZN5boost15program_options8validateIdcEEvRNS_3anyERKSt6vectorINSt7__cxx1112basic_stringIT0_St11char_traitsIS7_ESaIS7_EEESaISB_EEPT_l\n   fun:_ZNK5boost15program_options11typed_valueIdcE6xparseERNS_3anyERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EE\n   fun:_ZNK5boost15program_options29value_semantic_codecvt_helperIcE5parseERNS_3anyERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EEb\n   fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb\n   fun:_ZN3bzn14simple_options15combine_optionsEv\n   fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNK5boost3any6holderIdE5cloneEv\n   fun:_ZN5boost3anyC1ERKS0_\n   fun:_ZN5boost15program_options14variable_valueC1ERKNS_3anyEb\n   fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb\n   fun:_ZN3bzn14simple_options15combine_optionsEv\n   fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_\n   fun:_ZNSt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_EC1IJRS6_EJLm0EEJEJEEERSt5tupleIJDpT_EERSA_IJDpT1_EESt12_Index_tupleIJXspT0_EEESJ_IJXspT2_EEE\n   fun:_ZNSt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_EC1IJRS6_EJEEESt21piecewise_construct_tSt5tupleIJDpT_EESB_IJDpT0_EE\n   fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_EEE9constructISA_JRKSt21piecewise_construct_tSt5tupleIJRS9_EESH_IJEEEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_EEEE9constructIS9_JRKSt21piecewise_construct_tSt5tupleIJRS8_EESH_IJEEEEEvRSB_PT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7testing18TestEventListenersC1Ev\n   fun:_ZN7testing8internal12UnitTestImplC1EPNS_8UnitTestE\n   fun:_ZN7testing8UnitTestC1Ev\n   fun:_ZN7testing8UnitTest11GetInstanceEv\n   fun:_ZN7testing8internal15GetUnitTestImplEv\n   fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_assignERKS4_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignERKS4_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSERKS4_\n   fun:_ZN7testing8internal8FilePath3SetERKS1_\n   fun:_ZN7testing8internal12UnitTestImpl11AddTestInfoEPFvvES3_PNS_8TestInfoE\n   fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeIPN7testing8internal25UntypedFunctionMockerBaseEEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeIPN7testing8internal25UntypedFunctionMockerBaseEEEE8allocateERS6_m\n   fun:_ZNSt8_Rb_treeIPN7testing8internal25UntypedFunctionMockerBaseES3_St9_IdentityIS3_ESt4lessIS3_ESaIS3_EE11_M_get_nodeEv\n   fun:_ZNSt8_Rb_treeIPN7testing8internal25UntypedFunctionMockerBaseES3_St9_IdentityIS3_ESt4lessIS3_ESaIS3_EE14_M_create_nodeIJRKS3_EEEPSt13_Rb_tree_nodeIS3_EDpOT_\n   fun:_ZNKSt8_Rb_treeIPN7testing8internal25UntypedFunctionMockerBaseES3_St9_IdentityIS3_ESt4lessIS3_ESaIS3_EE11_Alloc_nodeclIRKS3_EEPSt13_Rb_tree_nodeIS3_EOT_\n   fun:_ZNSt8_Rb_treeIPN7testing8internal25UntypedFunctionMockerBaseES3_St9_IdentityIS3_ESt4lessIS3_ESaIS3_EE10_M_insert_IRKS3_NS9_11_Alloc_nodeEEESt17_Rb_tree_iteratorIS3_EPSt18_Rb_tree_node_baseSH_OT_RT0_\n   fun:_ZNSt8_Rb_treeIPN7testing8internal25UntypedFunctionMockerBaseES3_St9_IdentityIS3_ESt4lessIS3_ESaIS3_EE16_M_insert_uniqueIRKS3_EESt4pairISt17_Rb_tree_iteratorIS3_EbEOT_\n   fun:_ZNSt3setIPN7testing8internal25UntypedFunctionMockerBaseESt4lessIS3_ESaIS3_EE6insertERKS3_\n   fun:_ZN7testing4Mock8RegisterEPKvPNS_8internal25UntypedFunctionMockerBaseE\n   fun:_ZN7testing8internal25UntypedFunctionMockerBase13RegisterOwnerEPKv\n   fun:_ZN3bzn4asio19Mockio_context_base30gmock_make_unique_steady_timerEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3anyC1INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEERKT_\n   fun:_ZN5boost15program_options11typed_valueINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEcE13default_valueERKS7_\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:realloc\n   fun:re_dfa_add_node\n   fun:duplicate_node\n   fun:duplicate_node_closure\n   fun:calc_eclosure_iter\n   fun:calc_eclosure\n   fun:analyze\n   fun:re_compile_internal\n   fun:regcomp\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7testing8internal13CaptureStreamEiPKcPPNS0_14CapturedStreamE\n   fun:_ZN7testing8internal13CaptureStderrEv\n   fun:_ZN7testing8internal15NoExecDeathTest10AssumeRoleEv\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_\n   fun:_ZN5boost3any6holderINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC1ERKS7_\n   fun:_ZNK5boost3any6holderINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE5cloneEv\n   fun:_ZN5boost3anyC1ERKS0_\n   fun:_ZN5boost15program_options14variable_valueC1ERKNS_3anyEb\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKPKvN7testing8internal12CallReactionEEEE8allocateEmS4_\n   fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKPKvN7testing8internal12CallReactionEEEEE8allocateERSA_m\n   fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing8internal12CallReactionEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE11_M_get_nodeEv\n   fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing8internal12CallReactionEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE14_M_create_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESI_IJEEEEEPSt13_Rb_tree_nodeIS7_EDpOT_\n   fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing8internal12CallReactionEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE22_M_emplace_hint_uniqueIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESI_IJEEEEESt17_Rb_tree_iteratorIS7_ESt23_Rb_tree_const_iteratorIS7_EDpOT_\n   fun:_ZNSt3mapIPKvN7testing8internal12CallReactionESt4lessIS1_ESaISt4pairIKS1_S4_EEEixERS8_\n   fun:_ZN7testing12_GLOBAL__N_131SetReactionOnUninterestingCallsEPKvNS_8internal12CallReactionE\n   fun:_ZN7testing4Mock23AllowUninterestingCallsEPKv\n   fun:_ZN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEEE9constructIS6_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEEEE9constructIS5_JEEEvRS6_PT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKPKvN7testing8internal12CallReactionEEEE8allocateEmS4_\n   fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKPKvN7testing8internal12CallReactionEEEEE8allocateERSA_m\n   fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing8internal12CallReactionEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE11_M_get_nodeEv\n   fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing8internal12CallReactionEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE14_M_create_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESI_IJEEEEEPSt13_Rb_tree_nodeIS7_EDpOT_\n   fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing8internal12CallReactionEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE22_M_emplace_hint_uniqueIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESI_IJEEEEESt17_Rb_tree_iteratorIS7_ESt23_Rb_tree_const_iteratorIS7_EDpOT_\n   fun:_ZNSt3mapIPKvN7testing8internal12CallReactionESt4lessIS1_ESaISt4pairIKS1_S4_EEEixERS8_\n   fun:_ZN7testing12_GLOBAL__N_131SetReactionOnUninterestingCallsEPKvNS_8internal12CallReactionE\n   fun:_ZN7testing4Mock23AllowUninterestingCallsEPKv\n   fun:_ZN7testing8NiceMockIN3bzn4asio21Mocksteady_timer_baseEEC1Ev\n   fun:_ZSt11make_uniqueIN7testing8NiceMockIN3bzn4asio21Mocksteady_timer_baseEEEJEENSt9_MakeUniqIT_E15__single_objectEDpOT0_\n   fun:_ZN10chaos_testC1Ev\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIN5boost10shared_ptrINS1_15program_options18option_descriptionEEEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIN5boost10shared_ptrINS0_15program_options18option_descriptionEEEEE8allocateERS5_m\n   fun:_ZNSt12_Vector_baseIN5boost10shared_ptrINS0_15program_options18option_descriptionEEESaIS4_EE11_M_allocateEm\n   fun:_ZNSt12_Vector_baseIN5boost10shared_ptrINS0_15program_options18option_descriptionEEESaIS4_EE17_M_create_storageEm\n   fun:_ZNSt12_Vector_baseIN5boost10shared_ptrINS0_15program_options18option_descriptionEEESaIS4_EEC1EmRKS5_\n   fun:_ZNSt6vectorIN5boost10shared_ptrINS0_15program_options18option_descriptionEEESaIS4_EEC1ERKS6_\n   fun:_ZN5boost15program_options19options_descriptionC1ERKS1_\n   fun:_ZN5boost15program_options19options_description3addERKS1_\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:malloc\n   fun:init_dfa\n   fun:re_compile_internal\n   fun:regcomp\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7testing8internal23DefaultDeathTestFactory6CreateEPKcPKNS0_2REES3_iPPNS0_9DeathTestE\n   fun:_ZN7testing8internal9DeathTest6CreateEPKcPKNS0_2REES3_iPPS1_\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNK5boost3any6holderImE5cloneEv\n   fun:_ZN5boost3anyC1ERKS0_\n   fun:_ZN5boost15program_options14variable_valueC1ERKNS_3anyEb\n   fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb\n   fun:_ZN3bzn14simple_options15combine_optionsEv\n   fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_\n   fun:_ZN7testing8internal12CodeLocationC1ERKS1_\n   fun:_ZN7testing8TestInfoC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_PKcSA_NS_8internal12CodeLocationEPKvPNSB_15TestFactoryBaseE\n   fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE\n   fun:_Z41__static_initialization_and_destruction_0ii\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost16exception_detail27get_static_exception_objectINS0_10bad_alloc_EEENS_13exception_ptrEv\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN5boost6detail16thread_data_baseD2Ev\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost16exception_detail27get_static_exception_objectINS0_14bad_exception_EEENS_13exception_ptrEv\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN5boost6detail16thread_data_baseD2Ev\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIPNSt8__detail15_Hash_node_baseEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIPNSt8__detail15_Hash_node_baseEEE8allocateERS3_m\n   fun:_ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_ELb1EEEEE19_M_allocate_bucketsEm\n   fun:_ZNSt10_HashtableINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_S5_ESaIS8_ENSt8__detail10_Select1stESt8equal_toIS5_ESt4hashIS5_ENSA_18_Mod_range_hashingENSA_20_Default_ranged_hashENSA_20_Prime_rehash_policyENSA_17_Hashtable_traitsILb1ELb0ELb1EEEE19_M_allocate_bucketsEm\n   fun:_ZNSt10_HashtableINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_S5_ESaIS8_ENSt8__detail10_Select1stESt8equal_toIS5_ESt4hashIS5_ENSA_18_Mod_range_hashingENSA_20_Default_ranged_hashENSA_20_Prime_rehash_policyENSA_17_Hashtable_traitsILb1ELb0ELb1EEEE13_M_rehash_auxEmSt17integral_constantIbLb1EE\n   fun:_ZNSt10_HashtableINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_S5_ESaIS8_ENSt8__detail10_Select1stESt8equal_toIS5_ESt4hashIS5_ENSA_18_Mod_range_hashingENSA_20_Default_ranged_hashENSA_20_Prime_rehash_policyENSA_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm\n   fun:_ZNSt10_HashtableINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_S5_ESaIS8_ENSt8__detail10_Select1stESt8equal_toIS5_ESt4hashIS5_ENSA_18_Mod_range_hashingENSA_20_Default_ranged_hashENSA_20_Prime_rehash_policyENSA_17_Hashtable_traitsILb1ELb0ELb1EEEE21_M_insert_unique_nodeEmmPNSA_10_Hash_nodeIS8_Lb1EEE\n   fun:_ZNSt8__detail9_Map_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS6_S6_ESaIS9_ENS_10_Select1stESt8equal_toIS6_ESt4hashIS6_ENS_18_Mod_range_hashingENS_20_Default_ranged_hashENS_20_Prime_rehash_policyENS_17_Hashtable_traitsILb1ELb0ELb1EEELb1EEixERS8_\n   fun:_ZNSt13unordered_mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St4hashIS5_ESt8equal_toIS5_ESaISt4pairIKS5_S5_EEEixERSB_\n   fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_\n   fun:_ZN10chaos_testC1Ev\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKN5boost9typeindex14stl_type_indexENS3_10shared_ptrINS3_3log12v2s_mt_posix7sources3aux18logger_holder_baseEEEEEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKN5boost9typeindex14stl_type_indexENS2_10shared_ptrINS2_3log12v2s_mt_posix7sources3aux18logger_holder_baseEEEEEEE8allocateERSF_m\n   fun:_ZNSt8_Rb_treeIN5boost9typeindex14stl_type_indexESt4pairIKS2_NS0_10shared_ptrINS0_3log12v2s_mt_posix7sources3aux18logger_holder_baseEEEESt10_Select1stISC_ESt4lessIS2_ESaISC_EE11_M_get_nodeEv\n   fun:_ZNSt8_Rb_treeIN5boost9typeindex14stl_type_indexESt4pairIKS2_NS0_10shared_ptrINS0_3log12v2s_mt_posix7sources3aux18logger_holder_baseEEEESt10_Select1stISC_ESt4lessIS2_ESaISC_EE14_M_create_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS4_EESN_IJEEEEEPSt13_Rb_tree_nodeISC_EDpOT_\n   fun:_ZNSt8_Rb_treeIN5boost9typeindex14stl_type_indexESt4pairIKS2_NS0_10shared_ptrINS0_3log12v2s_mt_posix7sources3aux18logger_holder_baseEEEESt10_Select1stISC_ESt4lessIS2_ESaISC_EE22_M_emplace_hint_uniqueIJRKSt21piecewise_construct_tSt5tupleIJRS4_EESN_IJEEEEESt17_Rb_tree_iteratorISC_ESt23_Rb_tree_const_iteratorISC_EDpOT_\n   fun:_ZNSt3mapIN5boost9typeindex14stl_type_indexENS0_10shared_ptrINS0_3log12v2s_mt_posix7sources3aux18logger_holder_baseEEESt4lessIS2_ESaISt4pairIKS2_S9_EEEixERSD_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14global_storage11get_or_initENS_9typeindex14stl_type_indexEPFNS_10shared_ptrINS3_18logger_holder_baseEEEvE\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE13init_instanceEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_7sources3aux16logger_singletonINS1_7trivial6loggerEEENS_10shared_ptrINS5_13logger_holderINS4_18severity_logger_mtINS7_14severity_levelEEEEEEEE3getEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE3getEv\n   fun:_ZN5boost3log12v2s_mt_posix7trivial6logger3getEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_replaceEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_S8_S8_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignIPKcvEERS4_T_S9_\n   fun:_ZN5boost6detail27lexical_ostream_limited_srcIcSt11char_traitsIcEErsISaIcEEEbRNSt7__cxx1112basic_stringIcS3_T_EE\n   fun:_ZN5boost6detail22lexical_converter_implINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEdE11try_convertERKdRS7_\n   fun:_ZN5boost10conversion6detail19try_lexical_convertINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEdEEbRKT0_RT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_assignERKS4_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignERKS4_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSERKS4_\n   fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb\n   fun:_ZN3bzn14simple_options15combine_optionsEv\n   fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE8allocateERS6_m\n   fun:_ZNSt12_Vector_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE11_M_allocateEm\n   fun:_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE17_M_realloc_insertIJRKS5_EEEvN9__gnu_cxx17__normal_iteratorIPS5_S7_EEDpOT_\n   fun:_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE9push_backERKS5_\n   fun:_ZN5boost15program_options18option_description9set_namesEPKc\n   fun:_ZN5boost15program_options18option_descriptionC1EPKcPKNS0_14value_semanticES3_\n   fun:_ZN5boost15program_options29options_description_easy_initclEPKcS3_\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIPN5boost3log12v2s_mt_posix14attribute_name10repository4nodeEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIPN5boost3log12v2s_mt_posix14attribute_name10repository4nodeEEE8allocateERS7_m\n   fun:_ZNSt11_Deque_baseIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeESaIS5_EE15_M_allocate_mapEm\n   fun:_ZNSt11_Deque_baseIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeESaIS5_EE17_M_initialize_mapEm\n   fun:_ZNSt11_Deque_baseIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeESaIS5_EEC1Ev\n   fun:_ZNSt5dequeIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeESaIS5_EEC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix14attribute_name10repositoryC1Ev\n   fun:_ZN5boost11make_sharedINS_3log12v2s_mt_posix14attribute_name10repositoryEJEEENS_6detail15sp_if_not_arrayIT_E4typeEDpOT0_\n   fun:_ZN5boost3log12v2s_mt_posix14attribute_name10repository13init_instanceEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEv\n   fun:_ZN5boost3log12v2s_mt_posix14attribute_name18get_id_from_stringEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKPKvN5boost6detail13tss_data_nodeEEEE8allocateEmS4_\n   fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKPKvN5boost6detail13tss_data_nodeEEEEE8allocateERSA_m\n   fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N5boost6detail13tss_data_nodeEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE11_M_get_nodeEv\n   fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N5boost6detail13tss_data_nodeEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE14_M_create_nodeIJS2_IS1_S6_EEEEPSt13_Rb_tree_nodeIS7_EDpOT_\n   fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N5boost6detail13tss_data_nodeEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE17_M_emplace_uniqueIJS2_IS1_S6_EEEES2_ISt17_Rb_tree_iteratorIS7_EbEDpOT_\n   fun:_ZNSt3mapIPKvN5boost6detail13tss_data_nodeESt4lessIS1_ESaISt4pairIKS1_S4_EEE6insertIS7_IS1_S4_EEENSt9enable_ifIXsrSt16is_constructibleIS9_JT_EE5valueES7_ISt17_Rb_tree_iteratorIS9_EbEE4typeEOSG_\n   fun:_ZN5boost6detail16add_new_tss_nodeEPKvPFvPFvPvES3_ES5_S3_\n   fun:_ZN5boost6detail12set_tss_dataEPKvPFvPFvPvES3_ES5_S3_b\n   fun:_ZN5boost19thread_specific_ptrINS_3log12v2s_mt_posix4core14implementation11thread_dataEE5resetEPS5_\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKPKvN5boost6detail13tss_data_nodeEEEE8allocateEmS4_\n   fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKPKvN5boost6detail13tss_data_nodeEEEEE8allocateERSA_m\n   fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N5boost6detail13tss_data_nodeEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE11_M_get_nodeEv\n   fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N5boost6detail13tss_data_nodeEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE14_M_create_nodeIJS2_IS1_S6_EEEEPSt13_Rb_tree_nodeIS7_EDpOT_\n   fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N5boost6detail13tss_data_nodeEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE17_M_emplace_uniqueIJS2_IS1_S6_EEEES2_ISt17_Rb_tree_iteratorIS7_EbEDpOT_\n   fun:_ZNSt3mapIPKvN5boost6detail13tss_data_nodeESt4lessIS1_ESaISt4pairIKS1_S4_EEE6insertIS7_IS1_S4_EEENSt9enable_ifIXsrSt16is_constructibleIS9_JT_EE5valueES7_ISt17_Rb_tree_iteratorIS9_EbEE4typeEOSG_\n   fun:_ZN5boost6detail16add_new_tss_nodeEPKvPFvPFvPvES3_ES5_S3_\n   fun:_ZN5boost6detail12set_tss_dataEPKvPFvPFvPvES3_ES5_S3_b\n   fun:_ZN5boost19thread_specific_ptrINS_3log12v2s_mt_posix3aux12_GLOBAL__N_120stream_compound_poolIcEEE5resetEPS6_\n   fun:_ZN5boost3log12v2s_mt_posix3aux12_GLOBAL__N_120stream_compound_poolIcE3getEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux15stream_providerIcE17allocate_compoundERNS1_6recordE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:calloc\n   fun:init_dfa\n   fun:re_compile_internal\n   fun:regcomp\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_\n   fun:_ZN7testing8internal15ExpectationBaseC1EPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN7testing8internal16TypedExpectationIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEEC1EPNS0_18FunctionMockerBaseIS9_EEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJEE\n   fun:_ZN7testing8internal18FunctionMockerBaseIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJEE\n   fun:_ZN7testing8internal8MockSpecIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE18InternalExpectedAtEPKciSC_SC_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:realloc\n   fun:re_node_set_merge\n   fun:calc_eclosure_iter\n   fun:calc_eclosure_iter\n   fun:calc_eclosure\n   fun:analyze\n   fun:re_compile_internal\n   fun:regcomp\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_\n   fun:_ZNSt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_EC1IJRS6_EJLm0EEJEJEEERSt5tupleIJDpT_EERSA_IJDpT1_EESt12_Index_tupleIJXspT0_EEESJ_IJXspT2_EEE\n   fun:_ZNSt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_EC1IJRS6_EJEEESt21piecewise_construct_tSt5tupleIJDpT_EESB_IJDpT0_EE\n   fun:_ZN9__gnu_cxx13new_allocatorISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_EE9constructIS9_JRKSt21piecewise_construct_tSt5tupleIJRS8_EESF_IJEEEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_EEE9constructIS8_JRKSt21piecewise_construct_tSt5tupleIJRS7_EESF_IJEEEEEvRS9_PT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_\n   fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE9constructIS7_JRKS7_EEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEE9constructIS6_JRKS6_EEEvRS8_PT_DpOT0_\n   fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St9_IdentityIS5_ESt4lessIS5_ESaIS5_EE17_M_construct_nodeIJRKS5_EEEvPSt13_Rb_tree_nodeIS5_EDpOT_\n   fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St9_IdentityIS5_ESt4lessIS5_ESaIS5_EE14_M_create_nodeIJRKS5_EEEPSt13_Rb_tree_nodeIS5_EDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorINSt8__detail10_Hash_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES9_ELb1EEEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaINSt8__detail10_Hash_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_ELb1EEEEE8allocateERSC_m\n   fun:_ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_ELb1EEEEE16_M_allocate_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS9_EESI_IJEEEEEPSB_DpOT_\n   fun:_ZNSt8__detail9_Map_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS6_S6_ESaIS9_ENS_10_Select1stESt8equal_toIS6_ESt4hashIS6_ENS_18_Mod_range_hashingENS_20_Default_ranged_hashENS_20_Prime_rehash_policyENS_17_Hashtable_traitsILb1ELb0ELb1EEELb1EEixERS8_\n   fun:_ZNSt13unordered_mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St4hashIS5_ESt8equal_toIS5_ESaISt4pairIKS5_S5_EEEixERSB_\n   fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeIPN7testing8internal25UntypedFunctionMockerBaseEEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeIPN7testing8internal25UntypedFunctionMockerBaseEEEE8allocateERS6_m\n   fun:_ZNSt8_Rb_treeIPN7testing8internal25UntypedFunctionMockerBaseES3_St9_IdentityIS3_ESt4lessIS3_ESaIS3_EE11_M_get_nodeEv\n   fun:_ZNSt8_Rb_treeIPN7testing8internal25UntypedFunctionMockerBaseES3_St9_IdentityIS3_ESt4lessIS3_ESaIS3_EE14_M_create_nodeIJRKS3_EEEPSt13_Rb_tree_nodeIS3_EDpOT_\n   fun:_ZNKSt8_Rb_treeIPN7testing8internal25UntypedFunctionMockerBaseES3_St9_IdentityIS3_ESt4lessIS3_ESaIS3_EE11_Alloc_nodeclIRKS3_EEPSt13_Rb_tree_nodeIS3_EOT_\n   fun:_ZNSt8_Rb_treeIPN7testing8internal25UntypedFunctionMockerBaseES3_St9_IdentityIS3_ESt4lessIS3_ESaIS3_EE10_M_insert_IRKS3_NS9_11_Alloc_nodeEEESt17_Rb_tree_iteratorIS3_EPSt18_Rb_tree_node_baseSH_OT_RT0_\n   fun:_ZNSt8_Rb_treeIPN7testing8internal25UntypedFunctionMockerBaseES3_St9_IdentityIS3_ESt4lessIS3_ESaIS3_EE16_M_insert_uniqueIRKS3_EESt4pairISt17_Rb_tree_iteratorIS3_EbEOT_\n   fun:_ZNSt3setIPN7testing8internal25UntypedFunctionMockerBaseESt4lessIS3_ESaIS3_EE6insertERKS3_\n   fun:_ZN7testing4Mock8RegisterEPKvPNS_8internal25UntypedFunctionMockerBaseE\n   fun:_ZN7testing8internal25UntypedFunctionMockerBase13RegisterOwnerEPKv\n   fun:_ZN3bzn4asio21Mocksteady_timer_base16gmock_async_waitERKN7testing7MatcherISt8functionIFvRKN5boost6system10error_codeEEEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:calloc\n   fun:create_cd_newstate\n   fun:re_acquire_state_context\n   fun:create_initial_state\n   fun:re_compile_internal\n   fun:regcomp\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1IPNS_3log12v2s_mt_posix5sinks3aux12default_sinkENS0_13sp_ms_deleterIS7_EEEET_NS0_14sp_inplace_tagIT0_EE\n   fun:_ZN5boost10shared_ptrINS_3log12v2s_mt_posix5sinks3aux12default_sinkEEC1IS5_NS_6detail14sp_inplace_tagINS8_13sp_ms_deleterIS5_EEEEEEPT_T0_\n   fun:_ZN5boost11make_sharedINS_3log12v2s_mt_posix5sinks3aux12default_sinkEJEEENS_6detail15sp_if_not_arrayIT_E4typeEDpOT0_\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementationC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4coreC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation13init_instanceEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_4core14implementationENS_10shared_ptrIS4_EEE3getEv\n   fun:_ZN5boost3log12v2s_mt_posix4core3getEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_EC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_\n   fun:_ZN7testing8internal15ExpectationBaseC1EPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN7testing8internal16TypedExpectationIFvSt8functionIFvRKN5boost6system10error_codeEEEEEC1EPNS0_18FunctionMockerBaseISA_EEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJNS_7MatcherIS9_EEEE\n   fun:_ZN7testing8internal18FunctionMockerBaseIFvSt8functionIFvRKN5boost6system10error_codeEEEEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJNS_7MatcherIS9_EEEE\n   fun:_ZN7testing8internal8MockSpecIFvSt8functionIFvRKN5boost6system10error_codeEEEEE18InternalExpectedAtEPKciSD_SD_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost15program_options29options_description_easy_initclEPKcPKNS0_14value_semanticES3_\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZSt15allocate_sharedIN3bzn7optionsESaIS1_EJEESt10shared_ptrIT_ERKT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost15program_options19options_description3addERKS1_\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZSt15allocate_sharedIN3bzn7optionsESaIS1_EJEESt10shared_ptrIT_ERKT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIN5boost10shared_ptrINS1_15program_options19options_descriptionEEEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIN5boost10shared_ptrINS0_15program_options19options_descriptionEEEEE8allocateERS5_m\n   fun:_ZNSt12_Vector_baseIN5boost10shared_ptrINS0_15program_options19options_descriptionEEESaIS4_EE11_M_allocateEm\n   fun:_ZNSt6vectorIN5boost10shared_ptrINS0_15program_options19options_descriptionEEESaIS4_EE17_M_realloc_insertIJRKS4_EEEvN9__gnu_cxx17__normal_iteratorIPS4_S6_EEDpOT_\n   fun:_ZNSt6vectorIN5boost10shared_ptrINS0_15program_options19options_descriptionEEESaIS4_EE9push_backERKS4_\n   fun:_ZN5boost15program_options19options_description3addERKS1_\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix4coreC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation13init_instanceEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_4core14implementationENS_10shared_ptrIS4_EEE3getEv\n   fun:_ZN5boost3log12v2s_mt_posix4core3getEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_EC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources18severity_logger_mtINS1_7trivial14severity_levelEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS5_EEEERKT_NS_11enable_if_cIXsrNS_3mpl3or_INS_10is_base_ofINS9_20tagged_argument_baseESG_EENSM_INS9_14empty_arg_listESG_EEN4mpl_5bool_ILb0EEEST_ST_EE5valueENS1_3aux12sfinae_dummyEE4typeE\n   fun:_ZN5boost3log12v2s_mt_posix7trivial6logger16construct_loggerEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE16construct_loggerEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14global_storage11get_or_initENS_9typeindex14stl_type_indexEPFNS_10shared_ptrINS3_18logger_holder_baseEEEvE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNK5boost3any6holderIbE5cloneEv\n   fun:_ZN5boost3anyC1ERKS0_\n   fun:_ZN5boost15program_options14variable_valueC1ERKNS_3anyEb\n   fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb\n   fun:_ZN3bzn14simple_options15combine_optionsEv\n   fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8UnitTest3RunEv\n   fun:_Z13RUN_ALL_TESTSv\n   fun:main\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1IPNS_3log12v2s_mt_posix7sources3aux13logger_holderINS5_18severity_logger_mtINS4_7trivial14severity_levelEEEEENS0_13sp_ms_deleterISC_EEEET_NS0_14sp_inplace_tagIT0_EE\n   fun:_ZN5boost10shared_ptrINS_3log12v2s_mt_posix7sources3aux13logger_holderINS3_18severity_logger_mtINS2_7trivial14severity_levelEEEEEEC1ISA_NS_6detail14sp_inplace_tagINSD_13sp_ms_deleterISA_EEEEEEPT_T0_\n   fun:_ZN5boost11make_sharedINS_3log12v2s_mt_posix7sources3aux13logger_holderINS3_18severity_logger_mtINS2_7trivial14severity_levelEEEEEJPKcjS9_EEENS_6detail15sp_if_not_arrayIT_E4typeEDpOT0_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE16construct_loggerEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14global_storage11get_or_initENS_9typeindex14stl_type_indexEPFNS_10shared_ptrINS3_18logger_holder_baseEEEvE\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE13init_instanceEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_7sources3aux16logger_singletonINS1_7trivial6loggerEEENS_10shared_ptrINS5_13logger_holderINS4_18severity_logger_mtINS7_14severity_levelEEEEEEEE3getEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE3getEv\n   fun:_ZN5boost3log12v2s_mt_posix7trivial6logger3getEv\n   fun:_ZN3bzn5chaos17start_crash_timerEv\n   fun:_ZZN3bzn5chaos5startEvENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKPKvN7testing12_GLOBAL__N_115MockObjectStateEEEE8allocateEmS4_\n   fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKPKvN7testing12_GLOBAL__N_115MockObjectStateEEEEE8allocateERSA_m\n   fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing12_GLOBAL__N_115MockObjectStateEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE11_M_get_nodeEv\n   fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing12_GLOBAL__N_115MockObjectStateEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE14_M_create_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESI_IJEEEEEPSt13_Rb_tree_nodeIS7_EDpOT_\n   fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing12_GLOBAL__N_115MockObjectStateEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE22_M_emplace_hint_uniqueIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESI_IJEEEEESt17_Rb_tree_iteratorIS7_ESt23_Rb_tree_const_iteratorIS7_EDpOT_\n   fun:_ZNSt3mapIPKvN7testing12_GLOBAL__N_115MockObjectStateESt4lessIS1_ESaISt4pairIKS1_S4_EEEixERS8_\n   fun:_ZN7testing4Mock8RegisterEPKvPNS_8internal25UntypedFunctionMockerBaseE\n   fun:_ZN7testing8internal25UntypedFunctionMockerBase13RegisterOwnerEPKv\n   fun:_ZN3bzn4asio19Mockio_context_base30gmock_make_unique_steady_timerEv\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKPKvN7testing12_GLOBAL__N_115MockObjectStateEEEE8allocateEmS4_\n   fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKPKvN7testing12_GLOBAL__N_115MockObjectStateEEEEE8allocateERSA_m\n   fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing12_GLOBAL__N_115MockObjectStateEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE11_M_get_nodeEv\n   fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing12_GLOBAL__N_115MockObjectStateEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE14_M_create_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESI_IJEEEEEPSt13_Rb_tree_nodeIS7_EDpOT_\n   fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing12_GLOBAL__N_115MockObjectStateEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE22_M_emplace_hint_uniqueIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESI_IJEEEEESt17_Rb_tree_iteratorIS7_ESt23_Rb_tree_const_iteratorIS7_EDpOT_\n   fun:_ZNSt3mapIPKvN7testing12_GLOBAL__N_115MockObjectStateESt4lessIS1_ESaISt4pairIKS1_S4_EEEixERS8_\n   fun:_ZN7testing4Mock8RegisterEPKvPNS_8internal25UntypedFunctionMockerBaseE\n   fun:_ZN7testing8internal25UntypedFunctionMockerBase13RegisterOwnerEPKv\n   fun:_ZN3bzn4asio21Mocksteady_timer_base16gmock_async_waitERKN7testing7MatcherISt8functionIFvRKN5boost6system10error_codeEEEEE\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost15program_options5valueINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEPNS0_11typed_valueIT_cEEPS9_\n   fun:_ZN5boost15program_options5valueINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEPNS0_11typed_valueIT_cEEv\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost15program_options5valueItEEPNS0_11typed_valueIT_cEEPS3_\n   fun:_ZN5boost15program_options5valueItEEPNS0_11typed_valueIT_cEEv\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost15program_options5valueIbEEPNS0_11typed_valueIT_cEEPS3_\n   fun:_ZN5boost15program_options5valueIbEEPNS0_11typed_valueIT_cEEv\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost15program_options5valueImEEPNS0_11typed_valueIT_cEEPS3_\n   fun:_ZN5boost15program_options5valueImEEPNS0_11typed_valueIT_cEEv\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost15program_options5valueIdEEPNS0_11typed_valueIT_cEEPS3_\n   fun:_ZN5boost15program_options5valueIdEEPNS0_11typed_valueIT_cEEv\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost15program_options5valueIjEEPNS0_11typed_valueIT_cEEPS3_\n   fun:_ZN5boost15program_options5valueIjEEPNS0_11typed_valueIT_cEEv\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1IPNS_3log12v2s_mt_posix14attribute_name10repositoryENS0_13sp_ms_deleterIS6_EEEET_NS0_14sp_inplace_tagIT0_EE\n   fun:_ZN5boost10shared_ptrINS_3log12v2s_mt_posix14attribute_name10repositoryEEC1IS4_NS_6detail14sp_inplace_tagINS7_13sp_ms_deleterIS4_EEEEEEPT_T0_\n   fun:_ZN5boost11make_sharedINS_3log12v2s_mt_posix14attribute_name10repositoryEJEEENS_6detail15sp_if_not_arrayIT_E4typeEDpOT0_\n   fun:_ZN5boost3log12v2s_mt_posix14attribute_name10repository13init_instanceEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEv\n   fun:_ZN5boost3log12v2s_mt_posix14attribute_name18get_id_from_stringEPKc\n   fun:_ZN5boost3log12v2s_mt_posix14attribute_nameC1EPKc\n   fun:_ZN5boost3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15namesC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15names13init_instanceEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS2_23default_attribute_names12_GLOBAL__N_15namesENS_10shared_ptrIS6_EEE3getEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15names3getEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEE8allocateERS8_m\n   fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St9_IdentityIS5_ESt4lessIS5_ESaIS5_EE11_M_get_nodeEv\n   fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St9_IdentityIS5_ESt4lessIS5_ESaIS5_EE14_M_create_nodeIJRKS5_EEEPSt13_Rb_tree_nodeIS5_EDpOT_\n   fun:_ZNKSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St9_IdentityIS5_ESt4lessIS5_ESaIS5_EE11_Alloc_nodeclIRKS5_EEPSt13_Rb_tree_nodeIS5_EOT_\n   fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St9_IdentityIS5_ESt4lessIS5_ESaIS5_EE10_M_insert_IRKS5_NSB_11_Alloc_nodeEEESt17_Rb_tree_iteratorIS5_EPSt18_Rb_tree_node_baseSJ_OT_RT0_\n   fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St9_IdentityIS5_ESt4lessIS5_ESaIS5_EE17_M_insert_unique_IRKS5_NSB_11_Alloc_nodeEEESt17_Rb_tree_iteratorIS5_ESt23_Rb_tree_const_iteratorIS5_EOT_RT0_\n   fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St9_IdentityIS5_ESt4lessIS5_ESaIS5_EE16_M_insert_uniqueISt23_Rb_tree_const_iteratorIS5_EEEvT_SF_\n   fun:_ZNSt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS5_ESaIS5_EE6insertISt23_Rb_tree_const_iteratorIS5_EEEvT_SD_\n   fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb\n   fun:_ZN3bzn14simple_options15combine_optionsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:malloc\n   fun:realloc\n   fun:re_compile_internal\n   fun:regcomp\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKcmEEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKcmEEEE8allocateERS5_m\n   fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE11_M_get_nodeEv\n   fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE14_M_create_nodeIJRKS2_EEEPSt13_Rb_tree_nodeIS2_EDpOT_\n   fun:_ZNKSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE11_Alloc_nodeclIRKS2_EEPSt13_Rb_tree_nodeIS2_EOT_\n   fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE10_M_insert_IRKS2_NS8_11_Alloc_nodeEEESt17_Rb_tree_iteratorIS2_EPSt18_Rb_tree_node_baseSG_OT_RT0_\n   fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE17_M_insert_unique_IRKS2_NS8_11_Alloc_nodeEEESt17_Rb_tree_iteratorIS2_ESt23_Rb_tree_const_iteratorIS2_EOT_RT0_\n   fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE16_M_insert_uniqueIPKS2_EEvT_SC_\n   fun:_ZNSt3mapIcmSt4lessIcESaISt4pairIKcmEEEC1ESt16initializer_listIS4_ERKS1_RKS5_\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKcmEEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKcmEEEE8allocateERS5_m\n   fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE11_M_get_nodeEv\n   fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE14_M_create_nodeIJRKS2_EEEPSt13_Rb_tree_nodeIS2_EDpOT_\n   fun:_ZNKSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE11_Alloc_nodeclIRKS2_EEPSt13_Rb_tree_nodeIS2_EOT_\n   fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE10_M_insert_IRKS2_NS8_11_Alloc_nodeEEESt17_Rb_tree_iteratorIS2_EPSt18_Rb_tree_node_baseSG_OT_RT0_\n   fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE17_M_insert_unique_IRKS2_NS8_11_Alloc_nodeEEESt17_Rb_tree_iteratorIS2_ESt23_Rb_tree_const_iteratorIS2_EOT_RT0_\n   fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE16_M_insert_uniqueIPKS2_EEvT_SC_\n   fun:_ZNSt3mapIcmSt4lessIcESaISt4pairIKcmEEEC1ESt16initializer_listIS4_ERKS1_RKS5_\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN3bzn5chaosC2ESt10shared_ptrINS_4asio15io_context_baseEES1_INS_12options_baseEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKcmEEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKcmEEEE8allocateERS5_m\n   fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE11_M_get_nodeEv\n   fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE14_M_create_nodeIJRKS2_EEEPSt13_Rb_tree_nodeIS2_EDpOT_\n   fun:_ZNKSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE11_Alloc_nodeclIRKS2_EEPSt13_Rb_tree_nodeIS2_EOT_\n   fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE10_M_insert_IRKS2_NS8_11_Alloc_nodeEEESt17_Rb_tree_iteratorIS2_EPSt18_Rb_tree_node_baseSG_OT_RT0_\n   fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE17_M_insert_unique_IRKS2_NS8_11_Alloc_nodeEEESt17_Rb_tree_iteratorIS2_ESt23_Rb_tree_const_iteratorIS2_EOT_RT0_\n   fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE16_M_insert_uniqueIPKS2_EEvT_SC_\n   fun:_ZNSt3mapIcmSt4lessIcESaISt4pairIKcmEEEC1ESt16initializer_listIS4_ERKS1_RKS5_\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN3bzn7options18parse_command_lineEiPPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7testing8internal12UnitTestImpl11GetTestCaseEPKcS3_PFvvES5_\n   fun:_ZN7testing8internal12UnitTestImpl11AddTestInfoEPFvvES3_PNS_8TestInfoE\n   fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7testing4TestC1Ev\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:malloc\n   fun:regcomp\n   fun:_ZN7testing8internal2RE4InitEPKc\n   fun:_ZN7testing8internal2REC1EPKc\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7testing8internal18FunctionMockerBaseIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJEE\n   fun:_ZN7testing8internal8MockSpecIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE18InternalExpectedAtEPKciSC_SC_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN5boost15program_options14variable_valueEEEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN5boost15program_options14variable_valueEEEEE8allocateERSE_m\n   fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_N5boost15program_options14variable_valueEESt10_Select1stISB_ESt4lessIS5_ESaISB_EE11_M_get_nodeEv\n   fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_N5boost15program_options14variable_valueEESt10_Select1stISB_ESt4lessIS5_ESaISB_EE14_M_create_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS7_EESM_IJEEEEEPSt13_Rb_tree_nodeISB_EDpOT_\n   fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_N5boost15program_options14variable_valueEESt10_Select1stISB_ESt4lessIS5_ESaISB_EE22_M_emplace_hint_uniqueIJRKSt21piecewise_construct_tSt5tupleIJRS7_EESM_IJEEEEESt17_Rb_tree_iteratorISB_ESt23_Rb_tree_const_iteratorISB_EDpOT_\n   fun:_ZNSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN5boost15program_options14variable_valueESt4lessIS5_ESaISt4pairIKS5_S8_EEEixERSC_\n   fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb\n   fun:_ZN3bzn14simple_options15combine_optionsEv\n   fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7testing8internal18FunctionMockerBaseIFvSt8functionIFvRKN5boost6system10error_codeEEEEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJNS_7MatcherIS9_EEEE\n   fun:_ZN7testing8internal8MockSpecIFvSt8functionIFvRKN5boost6system10error_codeEEEEE18InternalExpectedAtEPKciSD_SD_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn5chaos17start_crash_timerEv\n   fun:_ZZN3bzn5chaos5startEvENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNK5boost3any6holderINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE5cloneEv\n   fun:_ZN5boost3anyC1ERKS0_\n   fun:_ZN5boost15program_options14variable_valueC1ERKNS_3anyEb\n   fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb\n   fun:_ZN3bzn14simple_options15combine_optionsEv\n   fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_\n   fun:_ZNSt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN5boost15program_options14variable_valueEEC1IJRS6_EJLm0EEJEJEEERSt5tupleIJDpT_EERSD_IJDpT1_EESt12_Index_tupleIJXspT0_EEESM_IJXspT2_EEE\n   fun:_ZNSt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN5boost15program_options14variable_valueEEC1IJRS6_EJEEESt21piecewise_construct_tSt5tupleIJDpT_EESE_IJDpT0_EE\n   fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN5boost15program_options14variable_valueEEEE9constructISD_JRKSt21piecewise_construct_tSt5tupleIJRS9_EESK_IJEEEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN5boost15program_options14variable_valueEEEEE9constructISC_JRKSt21piecewise_construct_tSt5tupleIJRS8_EESK_IJEEEEEvRSE_PT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix13attribute_setC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementationC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4coreC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation13init_instanceEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_4core14implementationENS_10shared_ptrIS4_EEE3getEv\n   fun:_ZN5boost3log12v2s_mt_posix4core3getEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_EC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources18severity_logger_mtINS1_7trivial14severity_levelEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS5_EEEERKT_NS_11enable_if_cIXsrNS_3mpl3or_INS_10is_base_ofINS9_20tagged_argument_baseESG_EENSM_INS9_14empty_arg_listESG_EEN4mpl_5bool_ILb0EEEST_ST_EE5valueENS1_3aux12sfinae_dummyEE4typeE\n   fun:_ZN5boost3log12v2s_mt_posix7trivial6logger16construct_loggerEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix13attribute_setC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_EC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources18severity_logger_mtINS1_7trivial14severity_levelEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS5_EEEERKT_NS_11enable_if_cIXsrNS_3mpl3or_INS_10is_base_ofINS9_20tagged_argument_baseESG_EENSM_INS9_14empty_arg_listESG_EEN4mpl_5bool_ILb0EEEST_ST_EE5valueENS1_3aux12sfinae_dummyEE4typeE\n   fun:_ZN5boost3log12v2s_mt_posix7trivial6logger16construct_loggerEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE16construct_loggerEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14global_storage11get_or_initENS_9typeindex14stl_type_indexEPFNS_10shared_ptrINS3_18logger_holder_baseEEEvE\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE13init_instanceEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_7sources3aux16logger_singletonINS1_7trivial6loggerEEENS_10shared_ptrINS5_13logger_holderINS4_18severity_logger_mtINS7_14severity_levelEEEEEEEE3getEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE3getEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix13attribute_setC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv\n   fun:open_record<const boost::log::v2s_mt_posix::attribute_set&>\n   fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn5chaos17start_crash_timerEv\n   fun:_ZZN3bzn5chaos5startEvENKUlvE_clEv\n   fun:_ZSt13__invoke_implIvZN3bzn5chaos5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_EEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_EEEE8allocateERSB_m\n   fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_S5_ESt10_Select1stIS8_ESt4lessIS5_ESaIS8_EE11_M_get_nodeEv\n   fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_S5_ESt10_Select1stIS8_ESt4lessIS5_ESaIS8_EE14_M_create_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS7_EESJ_IJEEEEEPSt13_Rb_tree_nodeIS8_EDpOT_\n   fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_S5_ESt10_Select1stIS8_ESt4lessIS5_ESaIS8_EE22_M_emplace_hint_uniqueIJRKSt21piecewise_construct_tSt5tupleIJRS7_EESJ_IJEEEEESt17_Rb_tree_iteratorIS8_ESt23_Rb_tree_const_iteratorIS8_EDpOT_\n   fun:_ZNSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St4lessIS5_ESaISt4pairIKS5_S5_EEEixERS9_\n   fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb\n   fun:_ZN3bzn14simple_options15combine_optionsEv\n   fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZSt11make_uniqueIN7testing8NiceMockIN3bzn4asio21Mocksteady_timer_baseEEEJEENSt9_MakeUniqIT_E15__single_objectEDpOT0_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix3aux15stream_providerIcE17allocate_compoundERNS1_6recordE\n   fun:_ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEEC1ERS8_RNS1_6recordE\n   fun:make_record_pump<boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level> >\n   fun:_ZN3bzn5chaos17start_crash_timerEv\n   fun:_ZZN3bzn5chaos5startEvENKUlvE_clEv\n   fun:_ZSt13__invoke_implIvZN3bzn5chaos5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIZN3bzn5chaos5startEvEUlvE_JEENSt15__invoke_resultIT_JDpT0_EE4typeEOS4_DpOS5_\n   fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_\n   fun:_ZN9__gnu_cxx13new_allocatorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE9constructIS6_JRKS6_EEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE9constructIS5_JRKS5_EEEvRS6_PT_DpOT0_\n   fun:_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE17_M_realloc_insertIJRKS5_EEEvN9__gnu_cxx17__normal_iteratorIPS5_S7_EEDpOT_\n   fun:_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE9push_backERKS5_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7testing8UnitTestC1Ev\n   fun:_ZN7testing8UnitTest11GetInstanceEv\n   fun:_ZN7testing8internal15GetUnitTestImplEv\n   fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeEEE8allocateERS6_m\n   fun:_ZNSt11_Deque_baseIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeESaIS5_EE16_M_allocate_nodeEv\n   fun:_ZNSt11_Deque_baseIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeESaIS5_EE15_M_create_nodesEPPS5_S9_\n   fun:_ZNSt11_Deque_baseIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeESaIS5_EE17_M_initialize_mapEm\n   fun:_ZNSt11_Deque_baseIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeESaIS5_EEC1Ev\n   fun:_ZNSt5dequeIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeESaIS5_EEC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix14attribute_name10repositoryC1Ev\n   fun:_ZN5boost11make_sharedINS_3log12v2s_mt_posix14attribute_name10repositoryEJEEENS_6detail15sp_if_not_arrayIT_E4typeEDpOT0_\n   fun:_ZN5boost3log12v2s_mt_posix14attribute_name10repository13init_instanceEv\n   fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorISt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS3_ELNS_12_Lock_policyE2EEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaISt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS2_ELN9__gnu_cxx12_Lock_policyE2EEEE8allocateERS7_m\n   fun:_ZSt18__allocate_guardedISaISt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS2_ELN9__gnu_cxx12_Lock_policyE2EEEESt15__allocated_ptrIT_ERS9_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZSt15allocate_sharedIN3bzn7optionsESaIS1_EJEESt10shared_ptrIT_ERKT0_DpOT1_\n   fun:_ZSt11make_sharedIN3bzn7optionsEJEESt10shared_ptrIT_EDpOT0_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorISt23_Sp_counted_ptr_inplaceIN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEESaIS7_ELNS_12_Lock_policyE2EEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaISt23_Sp_counted_ptr_inplaceIN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEESaIS6_ELN9__gnu_cxx12_Lock_policyE2EEEE8allocateERSB_m\n   fun:_ZSt18__allocate_guardedISaISt23_Sp_counted_ptr_inplaceIN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEESaIS6_ELN9__gnu_cxx12_Lock_policyE2EEEESt15__allocated_ptrIT_ERSD_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEESaIS9_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS5_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEEEC1ISaIS5_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZSt15allocate_sharedIN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEESaIS5_EJEESt10shared_ptrIT_ERKT0_DpOT1_\n   fun:_ZSt11make_sharedIN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEEJEESt10shared_ptrIT_EDpOT0_\n   fun:_ZN10chaos_testC1Ev\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev\n   fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIN5boost10shared_ptrINS1_15program_options18option_descriptionEEEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIN5boost10shared_ptrINS0_15program_options18option_descriptionEEEEE8allocateERS5_m\n   fun:_ZNSt12_Vector_baseIN5boost10shared_ptrINS0_15program_options18option_descriptionEEESaIS4_EE11_M_allocateEm\n   fun:_ZNSt6vectorIN5boost10shared_ptrINS0_15program_options18option_descriptionEEESaIS4_EE17_M_realloc_insertIJRKS4_EEEvN9__gnu_cxx17__normal_iteratorIPS4_S6_EEDpOT_\n   fun:_ZNSt6vectorIN5boost10shared_ptrINS0_15program_options18option_descriptionEEESaIS4_EE9push_backERKS4_\n   fun:_ZN5boost15program_options19options_description3addENS_10shared_ptrINS0_18option_descriptionEEE\n   fun:_ZN5boost15program_options19options_description3addERKS1_\n   fun:_ZN3bzn14simple_options13build_optionsEv\n   fun:_ZN3bzn14simple_optionsC1Ev\n   fun:_ZN3bzn7optionsC1Ev\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:calloc\n   fun:__new_exitfn\n   fun:__internal_atexit\n   fun:__cxa_atexit\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:calloc\n   fun:__new_exitfn\n   fun:__internal_atexit\n   fun:__cxa_atexit\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN3bzn5chaosC2ESt10shared_ptrINS_4asio15io_context_baseEES1_INS_12options_baseEE\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:calloc\n   fun:__new_exitfn\n   fun:__internal_atexit\n   fun:__cxa_atexit\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN3bzn7options18parse_command_lineEiPPKc\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:calloc\n   fun:__new_exitfn\n   fun:__internal_atexit\n   fun:__cxa_atexit\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN3bzn14simple_optionsC2Ev\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:calloc\n   fun:__new_exitfn\n   fun:__internal_atexit\n   fun:__cxa_atexit\n   fun:_Z41__static_initialization_and_destruction_0ii\n   fun:_GLOBAL__sub_I__ZN7testing8internal17kStackTraceMarkerE\n   fun:__libc_csu_init\n   fun:(below main)\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorISt23_Sp_counted_ptr_inplaceIN3bzn5chaosESaIS3_ELNS_12_Lock_policyE2EEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaISt23_Sp_counted_ptr_inplaceIN3bzn5chaosESaIS2_ELN9__gnu_cxx12_Lock_policyE2EEEE8allocateERS7_m\n   fun:_ZSt18__allocate_guardedISaISt23_Sp_counted_ptr_inplaceIN3bzn5chaosESaIS2_ELN9__gnu_cxx12_Lock_policyE2EEEESt15__allocated_ptrIT_ERS9_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn5chaosESaIS5_EJRSt10shared_ptrINS4_4asio19Mockio_context_baseEERS7_INS4_7optionsEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN3bzn5chaosELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJRSt10shared_ptrINS0_4asio19Mockio_context_baseEERS7_INS0_7optionsEEEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN3bzn5chaosEEC1ISaIS1_EJRS_INS0_4asio19Mockio_context_baseEERS_INS0_7optionsEEEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZSt15allocate_sharedIN3bzn5chaosESaIS1_EJRSt10shared_ptrINS0_4asio19Mockio_context_baseEERS3_INS0_7optionsEEEES3_IT_ERKT0_DpOT1_\n   fun:_ZSt11make_sharedIN3bzn5chaosEJRSt10shared_ptrINS0_4asio19Mockio_context_baseEERS2_INS0_7optionsEEEES2_IT_EDpOT0_\n   fun:_ZN10chaos_test11build_chaosEv\n   fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn4crud14handle_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERK12database_msgSt10shared_ptrINS_12session_baseEE\n   fun:_ZN48crud_test_that_create_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv\n   fun:open_record<const boost::log::v2s_mt_posix::attribute_set&>\n   fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn4crud14handle_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERK12database_msgSt10shared_ptrINS_12session_baseEE\n   fun:_ZN48crud_test_that_create_sends_proper_response_Test8TestBodyEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn4crud14handle_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERK12database_msgSt10shared_ptrINS_12session_baseEE\n   fun:_ZN48crud_test_that_create_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn4crud14handle_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERK12database_msgSt10shared_ptrINS_12session_baseEE\n   fun:_ZN48crud_test_that_create_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create7set_keyEPKc\n   fun:_ZN46crud_test_that_read_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create9set_valueEPKc\n   fun:_ZN46crud_test_that_read_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create7set_keyEPKc\n   fun:_ZN63crud_test_that_point_of_contact_read_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create9set_valueEPKc\n   fun:_ZN63crud_test_that_point_of_contact_read_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create7set_keyEPKc\n   fun:_ZN48crud_test_that_update_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create9set_valueEPKc\n   fun:_ZN48crud_test_that_update_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_update7set_keyEPKc\n   fun:_ZN48crud_test_that_update_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_update9set_valueEPKc\n   fun:_ZN48crud_test_that_update_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create7set_keyEPKc\n   fun:_ZN65crud_test_that_point_of_contact_update_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create9set_valueEPKc\n   fun:_ZN65crud_test_that_point_of_contact_update_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_update7set_keyEPKc\n   fun:_ZN65crud_test_that_point_of_contact_update_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_update9set_valueEPKc\n   fun:_ZN65crud_test_that_point_of_contact_update_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create7set_keyEPKc\n   fun:_ZN48crud_test_that_delete_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create9set_valueEPKc\n   fun:_ZN48crud_test_that_delete_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create7set_keyEPKc\n   fun:_ZN65crud_test_that_point_of_contact_delete_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create9set_valueEPKc\n   fun:_ZN65crud_test_that_point_of_contact_delete_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create7set_keyEPKc\n   fun:_ZN45crud_test_that_has_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create9set_valueEPKc\n   fun:_ZN45crud_test_that_has_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create7set_keyEPKc\n   fun:_ZN62crud_test_that_point_of_contact_has_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create9set_valueEPKc\n   fun:_ZN62crud_test_that_point_of_contact_has_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create7set_keyEPKc\n   fun:_ZN46crud_test_that_keys_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create9set_valueEPKc\n   fun:_ZN46crud_test_that_keys_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create7set_keyEPKc\n   fun:_ZN63crud_test_that_point_of_contact_keys_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create9set_valueEPKc\n   fun:_ZN63crud_test_that_point_of_contact_keys_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create7set_keyEPKc\n   fun:_ZN46crud_test_that_size_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create9set_valueEPKc\n   fun:_ZN46crud_test_that_size_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create7set_keyEPKc\n   fun:_ZN63crud_test_that_point_of_contact_size_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_\n   fun:_ZN15database_create9set_valueEPKc\n   fun:_ZN63crud_test_that_point_of_contact_size_sends_proper_response_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf6StructC1Ev\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_\n   fun:_ZN6google8protobuf8internal20InitProtobufDefaultsEv\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZNSt10_HashtableIPKcSt4pairIKS1_PFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaISE_ENSt8__detail10_Select1stEN6google8protobuf5streqENSJ_4hashIS1_EENSG_18_Mod_range_hashingENSG_20_Default_ranged_hashENSG_20_Prime_rehash_policyENSG_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn4crud14handle_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERK12database_msgSt10shared_ptrINS_12session_baseEE\n   fun:_ZN48crud_test_that_create_sends_proper_response_Test8TestBodyEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_\n   fun:_ZN6google8protobuf8internal24OnShutdownDestroyMessageEPKv\n   fun:_ZN25protobuf_database_2eprotoL28InitDefaultsdatabase_requestEv\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN6google8protobuf8internal7InitSCCEPNS1_11SCCInfoBaseE\n   fun:_ZN25protobuf_database_2eproto12InitDefaultsEv\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn6cryptoC1ESt10shared_ptrINS_12options_baseEES1_INS_12monitor_baseEE\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn6cryptoEE9constructIS2_JRSt10shared_ptrINS1_12options_baseEERS5_INS1_12mock_monitorEEEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn6cryptoEEE9constructIS1_JRSt10shared_ptrINS0_12options_baseEERS5_INS0_12mock_monitorEEEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn6cryptoESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRSt10shared_ptrINS0_12options_baseEERS7_INS0_12mock_monitorEEEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn6cryptoESaIS5_EJRSt10shared_ptrINS4_12options_baseEERS7_INS4_12mock_monitorEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN3bzn6cryptoELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJRSt10shared_ptrINS0_12options_baseEERS7_INS0_12mock_monitorEEEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN3bzn6cryptoEEC1ISaIS1_EJRS_INS0_12options_baseEERS_INS0_12mock_monitorEEEEESt19_Sp_make_shared_tagRKT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv\n   fun:open_record<const boost::log::v2s_mt_posix::attribute_set&>\n   fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn6cryptoC1ESt10shared_ptrINS_12options_baseEES1_INS_12monitor_baseEE\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn6cryptoEE9constructIS2_JRSt10shared_ptrINS1_12options_baseEERS5_INS1_12mock_monitorEEEEEvPT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn6cryptoC1ESt10shared_ptrINS_12options_baseEES1_INS_12monitor_baseEE\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn6cryptoEE9constructIS2_JRSt10shared_ptrINS1_12options_baseEERS5_INS1_12mock_monitorEEEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn6cryptoEEE9constructIS1_JRSt10shared_ptrINS0_12options_baseEERS5_INS0_12mock_monitorEEEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn6cryptoESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRSt10shared_ptrINS0_12options_baseEERS7_INS0_12mock_monitorEEEEES2_DpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn6cryptoC1ESt10shared_ptrINS_12options_baseEES1_INS_12monitor_baseEE\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn6cryptoEE9constructIS2_JRSt10shared_ptrINS1_12options_baseEERS5_INS1_12mock_monitorEEEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn6cryptoEEE9constructIS1_JRSt10shared_ptrINS0_12options_baseEERS5_INS0_12mock_monitorEEEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn6cryptoESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRSt10shared_ptrINS0_12options_baseEERS7_INS0_12mock_monitorEEEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn6cryptoESaIS5_EJRSt10shared_ptrINS4_12options_baseEERS7_INS4_12mock_monitorEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf6StructC1Ev\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_\n   fun:_ZN6google8protobuf8internal20InitProtobufDefaultsEv\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZNSt10_HashtableIPKcSt4pairIKS1_PFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaISE_ENSt8__detail10_Select1stEN6google8protobuf5streqENSJ_4hashIS1_EENSG_18_Mod_range_hashingENSG_20_Default_ranged_hashENSG_20_Prime_rehash_policyENSG_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn6cryptoC1ESt10shared_ptrINS_12options_baseEES1_INS_12monitor_baseEE\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn6cryptoEE9constructIS2_JRSt10shared_ptrINS1_12options_baseEERS5_INS1_12mock_monitorEEEEEvPT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto12InitDefaultsEv\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN12_GLOBAL__N_113get_api_tokenERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN3bzn68ethereum_test_that_there_is_a_token_balance_for_a_valid_address_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv\n   fun:open_record<const boost::log::v2s_mt_posix::attribute_set&>\n   fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN12_GLOBAL__N_113get_api_tokenERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN3bzn68ethereum_test_that_there_is_a_token_balance_for_a_valid_address_Test8TestBodyEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN12_GLOBAL__N_113get_api_tokenERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN3bzn68ethereum_test_that_there_is_a_token_balance_for_a_valid_address_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN12_GLOBAL__N_113get_api_tokenERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN3bzn68ethereum_test_that_there_is_a_token_balance_for_a_valid_address_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN12_GLOBAL__N_113get_api_tokenERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN3bzn68ethereum_test_that_there_is_a_token_balance_for_a_valid_address_Test8TestBodyEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn7monitorC1ESt10shared_ptrINS_12options_baseEES1_INS_4asio15io_context_baseEES1_INS_17system_clock_baseEE\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7monitorEE9constructIS2_JRSt10shared_ptrINS1_17mock_options_baseEERS5_INS1_4asio19Mockio_context_baseEERS5_INS1_17mock_system_clockEEEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7monitorEEE9constructIS1_JRSt10shared_ptrINS0_17mock_options_baseEERS5_INS0_4asio19Mockio_context_baseEERS5_INS0_17mock_system_clockEEEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7monitorESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRSt10shared_ptrINS0_17mock_options_baseEERS7_INS0_4asio19Mockio_context_baseEERS7_INS0_17mock_system_clockEEEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7monitorESaIS5_EJRSt10shared_ptrINS4_17mock_options_baseEERS7_INS4_4asio19Mockio_context_baseEERS7_INS4_17mock_system_clockEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN3bzn7monitorELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJRSt10shared_ptrINS0_17mock_options_baseEERS7_INS0_4asio19Mockio_context_baseEERS7_INS0_17mock_system_clockEEEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN3bzn7monitorEEC1ISaIS1_EJRS_INS0_17mock_options_baseEERS_INS0_4asio19Mockio_context_baseEERS_INS0_17mock_system_clockEEEEESt19_Sp_make_shared_tagRKT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv\n   fun:open_record<const boost::log::v2s_mt_posix::attribute_set&>\n   fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn7monitorC1ESt10shared_ptrINS_12options_baseEES1_INS_4asio15io_context_baseEES1_INS_17system_clock_baseEE\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7monitorEE9constructIS2_JRSt10shared_ptrINS1_17mock_options_baseEERS5_INS1_4asio19Mockio_context_baseEERS5_INS1_17mock_system_clockEEEEEvPT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn7monitorC1ESt10shared_ptrINS_12options_baseEES1_INS_4asio15io_context_baseEES1_INS_17system_clock_baseEE\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7monitorEE9constructIS2_JRSt10shared_ptrINS1_17mock_options_baseEERS5_INS1_4asio19Mockio_context_baseEERS5_INS1_17mock_system_clockEEEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7monitorEEE9constructIS1_JRSt10shared_ptrINS0_17mock_options_baseEERS5_INS0_4asio19Mockio_context_baseEERS5_INS0_17mock_system_clockEEEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7monitorESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRSt10shared_ptrINS0_17mock_options_baseEERS7_INS0_4asio19Mockio_context_baseEERS7_INS0_17mock_system_clockEEEEES2_DpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn7monitorC1ESt10shared_ptrINS_12options_baseEES1_INS_4asio15io_context_baseEES1_INS_17system_clock_baseEE\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7monitorEE9constructIS2_JRSt10shared_ptrINS1_17mock_options_baseEERS5_INS1_4asio19Mockio_context_baseEERS5_INS1_17mock_system_clockEEEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn7monitorEEE9constructIS1_JRSt10shared_ptrINS0_17mock_options_baseEERS5_INS0_4asio19Mockio_context_baseEERS5_INS0_17mock_system_clockEEEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7monitorESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRSt10shared_ptrINS0_17mock_options_baseEERS7_INS0_4asio19Mockio_context_baseEERS7_INS0_17mock_system_clockEEEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7monitorESaIS5_EJRSt10shared_ptrINS4_17mock_options_baseEERS7_INS4_4asio19Mockio_context_baseEERS7_INS4_17mock_system_clockEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn7monitorC1ESt10shared_ptrINS_12options_baseEES1_INS_4asio15io_context_baseEES1_INS_17system_clock_baseEE\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7monitorEE9constructIS2_JRSt10shared_ptrINS1_17mock_options_baseEERS5_INS1_4asio19Mockio_context_baseEERS5_INS1_17mock_system_clockEEEEEvPT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_ZN3bzn4asio13smart_mock_io17yield_until_clearEv\n   fun:_ZN3bzn4asio13smart_mock_io22do_incoming_connectionEm\n   fun:_ZN3bzn47node_test2_test_accept_incoming_connection_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8UnitTest3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_ZN3bzn4asio13smart_mock_io17yield_until_clearEv\n   fun:_ZN3bzn47node_test2_test_accept_incoming_connection_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8UnitTest3RunEv\n   fun:_Z13RUN_ALL_TESTSv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_ZN3bzn4asio13smart_mock_io8shutdownEv\n   fun:_ZN10node_test2D1Ev\n   fun:_ZN3bzn47node_test2_test_accept_incoming_connection_TestD1Ev\n   fun:_ZN3bzn47node_test2_test_accept_incoming_connection_TestD0Ev\n   fun:_ZN7testing4Test11DeleteSelf_Ev\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_ZN3bzn4asio13smart_mock_io17yield_until_clearEv\n   fun:_ZN3bzn40node_test2_test_make_new_connection_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8UnitTest3RunEv\n   fun:_Z13RUN_ALL_TESTSv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_ZN3bzn4asio13smart_mock_io8shutdownEv\n   fun:_ZN10node_test2D1Ev\n   fun:_ZN3bzn40node_test2_test_make_new_connection_TestD1Ev\n   fun:_ZN3bzn40node_test2_test_make_new_connection_TestD0Ev\n   fun:_ZN7testing4Test11DeleteSelf_Ev\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_ZN3bzn4asio13smart_mock_io17yield_until_clearEv\n   fun:_ZN3bzn37node_test2_test_reuse_connection_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8UnitTest3RunEv\n   fun:_Z13RUN_ALL_TESTSv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_ZN3bzn4asio13smart_mock_io8shutdownEv\n   fun:_ZN10node_test2D1Ev\n   fun:_ZN3bzn37node_test2_test_reuse_connection_TestD1Ev\n   fun:_ZN3bzn37node_test2_test_reuse_connection_TestD0Ev\n   fun:_ZN7testing4Test11DeleteSelf_Ev\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_ZN3bzn4asio13smart_mock_io17yield_until_clearEv\n   fun:_ZN3bzn38node_test2_new_session_for_new_ep_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8UnitTest3RunEv\n   fun:_Z13RUN_ALL_TESTSv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_ZN3bzn4asio13smart_mock_io8shutdownEv\n   fun:_ZN10node_test2D1Ev\n   fun:_ZN3bzn38node_test2_new_session_for_new_ep_TestD1Ev\n   fun:_ZN3bzn38node_test2_new_session_for_new_ep_TestD0Ev\n   fun:_ZN7testing4Test11DeleteSelf_Ev\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_ZN3bzn4asio13smart_mock_io17yield_until_clearEv\n   fun:_ZN3bzn41node_test2_test_replace_dead_session_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8UnitTest3RunEv\n   fun:_Z13RUN_ALL_TESTSv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_ZN3bzn4asio13smart_mock_io8shutdownEv\n   fun:_ZN10node_test2D1Ev\n   fun:_ZN3bzn41node_test2_test_replace_dead_session_TestD1Ev\n   fun:_ZN3bzn41node_test2_test_replace_dead_session_TestD0Ev\n   fun:_ZN7testing4Test11DeleteSelf_Ev\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_ZN3bzn4asio13smart_mock_io8shutdownEv\n   fun:_ZN13session_test2D1Ev\n   fun:_ZN3bzn63session_test2_session_sets_swarm_id_when_sending_a_message_TestD1Ev\n   fun:_ZN3bzn63session_test2_session_sets_swarm_id_when_sending_a_message_TestD0Ev\n   fun:_ZN7testing4Test11DeleteSelf_Ev\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_ZN3bzn4asio13smart_mock_io8shutdownEv\n   fun:_ZN13session_test2D1Ev\n   fun:_ZN3bzn60session_test2_message_queued_before_handshake_gets_sent_TestD1Ev\n   fun:_ZN3bzn60session_test2_message_queued_before_handshake_gets_sent_TestD0Ev\n   fun:_ZN7testing4Test11DeleteSelf_Ev\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_ZN3bzn4asio13smart_mock_io8shutdownEv\n   fun:_ZN13session_test2D1Ev\n   fun:_ZN3bzn46session_test2_idle_timeout_closes_session_TestD1Ev\n   fun:_ZN3bzn46session_test2_idle_timeout_closes_session_TestD0Ev\n   fun:_ZN7testing4Test11DeleteSelf_Ev\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_ZN3bzn4asio13smart_mock_io8shutdownEv\n   fun:_ZN3bzn56session_test2_no_idle_timeout_when_connect_rejected_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8UnitTest3RunEv\n   fun:_Z13RUN_ALL_TESTSv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_ZN3bzn4asio13smart_mock_io8shutdownEv\n   fun:_ZN13session_test2D1Ev\n   fun:_ZN3bzn56session_test2_no_idle_timeout_when_connect_rejected_TestD1Ev\n   fun:_ZN3bzn56session_test2_no_idle_timeout_when_connect_rejected_TestD0Ev\n   fun:_ZN7testing4Test11DeleteSelf_Ev\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_ZN3bzn4asio13smart_mock_io17yield_until_clearEv\n   fun:_ZN3bzn71session_test2_additional_shutdown_handlers_can_be_added_to_session_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8UnitTest3RunEv\n   fun:_Z13RUN_ALL_TESTSv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_ZN3bzn4asio13smart_mock_io8shutdownEv\n   fun:_ZN3bzn71session_test2_additional_shutdown_handlers_can_be_added_to_session_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8UnitTest3RunEv\n   fun:_Z13RUN_ALL_TESTSv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_ZN3bzn4asio13smart_mock_io8shutdownEv\n   fun:_ZN13session_test2D1Ev\n   fun:_ZN3bzn71session_test2_additional_shutdown_handlers_can_be_added_to_session_TestD1Ev\n   fun:_ZN3bzn71session_test2_additional_shutdown_handlers_can_be_added_to_session_TestD0Ev\n   fun:_ZN7testing4Test11DeleteSelf_Ev\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n   fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables19AllocateOnceDynamicEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn4node20register_for_messageEN12bzn_envelope11PayloadCaseESt8functionIFvRKS1_St10shared_ptrINS_12session_baseEEEE\n   fun:_ZN3bzn69node_test_that_registering_message_handler_can_only_be_done_once_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv\n   fun:open_record<const boost::log::v2s_mt_posix::attribute_set&>\n   fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn4node20register_for_messageEN12bzn_envelope11PayloadCaseESt8functionIFvRKS1_St10shared_ptrINS_12session_baseEEEE\n   fun:_ZN3bzn69node_test_that_registering_message_handler_can_only_be_done_once_Test8TestBodyEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNSt6vectorIPN6google8protobuf20FileDescriptorTablesESaIS3_EE17_M_realloc_insertIJRKS3_EEEvN9__gnu_cxx17__normal_iteratorIPS3_S5_EEDpOT_\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables7AddFileEPKNS0_14FileDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf15UnknownFieldSet16default_instanceEv\n   fun:_ZNK6google8protobuf10TextFormat7Printer5PrintERKNS0_7MessageEPNS2_13TextGeneratorE\n   fun:_ZNK6google8protobuf10TextFormat7Printer5PrintERKNS0_7MessageEPNS0_2io20ZeroCopyOutputStreamE\n   fun:_ZNK6google8protobuf10TextFormat7Printer13PrintToStringERKNS0_7MessageEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf7Message16ShortDebugStringB5cxx11Ev\n   fun:_ZN3bzn4node21priv_protobuf_handlerERK12bzn_envelopeSt10shared_ptrINS_12session_baseEE\n   fun:_ZN3bzn55node_test_that_wrongly_signed_messages_are_dropped_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn4node20register_for_messageEN12bzn_envelope11PayloadCaseESt8functionIFvRKS1_St10shared_ptrINS_12session_baseEEEE\n   fun:_ZN3bzn69node_test_that_registering_message_handler_can_only_be_done_once_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNSt6vectorISt4pairIPKN6google8protobuf8MetadataES5_ESaIS6_EE17_M_realloc_insertIJS6_EEEvN9__gnu_cxx17__normal_iteratorIPS6_S8_EEDpOT_\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn4node20register_for_messageEN12bzn_envelope11PayloadCaseESt8functionIFvRKS1_St10shared_ptrINS_12session_baseEEEE\n   fun:_ZN3bzn69node_test_that_registering_message_handler_can_only_be_done_once_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm\n   fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNSt6vectorIN6google8protobuf14DescriptorPool6Tables10CheckPointESaIS4_EE17_M_realloc_insertIJS4_EEEvN9__gnu_cxx17__normal_iteratorIPS4_S6_EEDpOT_\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AddCheckpointEv\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables7AddFileEPKNS0_14FileDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPoolC1EPNS0_18DescriptorDatabaseEPNS1_14ErrorCollectorE\n   fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6TablesC1Ev\n   fun:_ZN6google8protobuf14DescriptorPoolC1EPNS0_18DescriptorDatabaseEPNS1_14ErrorCollectorE\n   fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf6StructC1Ev\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_\n   fun:_ZN6google8protobuf8internal20InitProtobufDefaultsEv\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE25DefaultValueHolderFactory13MakeNewHolderEv\n   fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE16GetOrCreateValueEv\n   fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE7pointerEv\n   fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE3getEv\n   fun:_ZN7testing8internal18FunctionMockerBaseIFvSt8functionIFvRKN5boost6system10error_codeEEEEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJNS_7MatcherIS9_EEEE\n   fun:_ZN7testing8internal8MockSpecIFvSt8functionIFvRKN5boost6system10error_codeEEEEE18InternalExpectedAtEPKciSD_SD_\n   fun:_ZZN3bzn4asio13smart_mock_ioC4EvENKUlRT_E5_clIN5boost4asio19basic_stream_socketINS7_2ip3tcpENS7_8executorEEEEEDaS3_\n   fun:_ZN7testing8internal12InvokeHelperISt10unique_ptrIN3bzn5beast21websocket_stream_baseESt14default_deleteIS5_EESt5tupleIJRN5boost4asio19basic_stream_socketINSB_2ip3tcpENSB_8executorEEEEEE6InvokeIZNS3_4asio13smart_mock_ioC4EvEUlRT_E5_EES8_SN_RKSI_\n   fun:_ZN7testing8internal12InvokeActionIZN3bzn4asio13smart_mock_ioC4EvEUlRT_E5_E7PerformISt10unique_ptrINS2_5beast21websocket_stream_baseESt14default_deleteISC_EESt5tupleIJRN5boost4asio19basic_stream_socketINSI_2ip3tcpENSI_8executorEEEEEEES5_RKT0_\n   fun:_ZN7testing17PolymorphicActionINS_8internal12InvokeActionIZN3bzn4asio13smart_mock_ioC4EvEUlRT_E5_EEE15MonomorphicImplIFSt10unique_ptrINS3_5beast21websocket_stream_baseESt14default_deleteISE_EERN5boost4asio19basic_stream_socketINSJ_2ip3tcpENSJ_8executorEEEEE7PerformERKSt5tupleIJSP_EE\n   fun:_ZNK7testing6ActionIFSt10unique_ptrIN3bzn5beast21websocket_stream_baseESt14default_deleteIS4_EERN5boost4asio19basic_stream_socketINS9_2ip3tcpENS9_8executorEEEEE7PerformERKSt5tupleIJSF_EE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: definite\n   fun:_Znwm\n   fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE25DefaultValueHolderFactory13MakeNewHolderEv\n   fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE16GetOrCreateValueEv\n   fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE7pointerEv\n   fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE3getEv\n   fun:_ZN7testing8internal18FunctionMockerBaseIFRN5boost4asio19basic_stream_socketINS3_2ip3tcpENS3_8executorEEEvEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJEE\n   fun:_ZN7testing8internal8MockSpecIFRN5boost4asio19basic_stream_socketINS3_2ip3tcpENS3_8executorEEEvEE18InternalExpectedAtEPKciSD_SD_\n   fun:_ZZN3bzn4asio13smart_mock_ioC4EvENKUlvE3_clEv\n   fun:_ZN7testing8internal12InvokeHelperISt10unique_ptrIN3bzn4asio15tcp_socket_baseESt14default_deleteIS5_EESt5tupleIJEEE6InvokeIZNS4_13smart_mock_ioC4EvEUlvE3_EES8_T_RKSA_\n   fun:_ZN7testing8internal12InvokeActionIZN3bzn4asio13smart_mock_ioC4EvEUlvE3_E7PerformISt10unique_ptrINS3_15tcp_socket_baseESt14default_deleteIS9_EESt5tupleIJEEEET_RKT0_\n   fun:_ZN7testing17PolymorphicActionINS_8internal12InvokeActionIZN3bzn4asio13smart_mock_ioC4EvEUlvE3_EEE15MonomorphicImplIFSt10unique_ptrINS4_15tcp_socket_baseESt14default_deleteISB_EEvEE7PerformERKSt5tupleIJEE\n   fun:_ZNK7testing6ActionIFSt10unique_ptrIN3bzn4asio15tcp_socket_baseESt14default_deleteIS4_EEvEE7PerformERKSt5tupleIJEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZNSt10_HashtableIPKcSt4pairIKS1_PFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaISE_ENSt8__detail10_Select1stEN6google8protobuf5streqENSJ_4hashIS1_EENSG_18_Mod_range_hashingENSG_20_Default_ranged_hashENSG_20_Prime_rehash_policyENSG_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZNSt10_HashtableIPKcSt4pairIKS1_N6google8protobuf6SymbolEESaIS7_ENSt8__detail10_Select1stENS5_5streqENS5_4hashIS1_EENS9_18_Mod_range_hashingENS9_20_Default_ranged_hashENS9_20_Prime_rehash_policyENS9_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn4node20register_for_messageEN12bzn_envelope11PayloadCaseESt8functionIFvRKS1_St10shared_ptrINS_12session_baseEEEE\n   fun:_ZN3bzn69node_test_that_registering_message_handler_can_only_be_done_once_Test8TestBodyEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_\n   fun:_ZN6google8protobuf8internal24OnShutdownDestroyMessageEPKv\n   fun:_ZN25protobuf_database_2eprotoL28InitDefaultsdatabase_requestEv\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN6google8protobuf8internal7InitSCCEPNS1_11SCCInfoBaseE\n   fun:_ZN25protobuf_database_2eproto12InitDefaultsEv\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables19AllocateOnceDynamicEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn25pbft_persistent_operationC1EmmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_12storage_baseEEm\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn25pbft_persistent_operationEE9constructIS2_JRmS5_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS1_12storage_baseEEmEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn25pbft_persistent_operationEEE9constructIS1_JRmS5_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS0_12storage_baseEEmEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn25pbft_persistent_operationESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRmS7_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS0_12storage_baseEEmEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn25pbft_persistent_operationESaIS5_EJRmS7_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS4_12storage_baseEEmEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN3bzn25pbft_persistent_operationELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJRmS7_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS0_12storage_baseEEmEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN3bzn25pbft_persistent_operationEEC1ISaIS1_EJRmS5_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS_INS0_12storage_baseEEmEEESt19_Sp_make_shared_tagRKT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv\n   fun:open_record<const boost::log::v2s_mt_posix::attribute_set&>\n   fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn25pbft_persistent_operationC1EmmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_12storage_baseEEm\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn25pbft_persistent_operationEE9constructIS2_JRmS5_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS1_12storage_baseEEmEEEvPT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNSt6vectorIPN6google8protobuf20FileDescriptorTablesESaIS3_EE17_M_realloc_insertIJRKS3_EEEvN9__gnu_cxx17__normal_iteratorIPS3_S5_EEDpOT_\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables7AddFileEPKNS0_14FileDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn25pbft_persistent_operationC1EmmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_12storage_baseEEm\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn25pbft_persistent_operationEE9constructIS2_JRmS5_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS1_12storage_baseEEmEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn25pbft_persistent_operationEEE9constructIS1_JRmS5_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS0_12storage_baseEEmEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn25pbft_persistent_operationESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRmS7_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS0_12storage_baseEEmEEES2_DpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNSt6vectorISt4pairIPKN6google8protobuf8MetadataES5_ESaIS6_EE17_M_realloc_insertIJS6_EEEvN9__gnu_cxx17__normal_iteratorIPS6_S8_EEDpOT_\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn25pbft_persistent_operationC1EmmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_12storage_baseEEm\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn25pbft_persistent_operationEE9constructIS2_JRmS5_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS1_12storage_baseEEmEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn25pbft_persistent_operationEEE9constructIS1_JRmS5_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS0_12storage_baseEEmEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn25pbft_persistent_operationESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRmS7_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS0_12storage_baseEEmEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn25pbft_persistent_operationESaIS5_EJRmS7_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS4_12storage_baseEEmEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNSt6vectorIN6google8protobuf14DescriptorPool6Tables10CheckPointESaIS4_EE17_M_realloc_insertIJS4_EEEvN9__gnu_cxx17__normal_iteratorIPS4_S6_EEDpOT_\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AddCheckpointEv\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables7AddFileEPKNS0_14FileDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables19AllocateOnceDynamicEv\n   fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPoolC1EPNS0_18DescriptorDatabaseEPNS1_14ErrorCollectorE\n   fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6TablesC1Ev\n   fun:_ZN6google8protobuf14DescriptorPoolC1EPNS0_18DescriptorDatabaseEPNS1_14ErrorCollectorE\n   fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf6StructC1Ev\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_\n   fun:_ZN6google8protobuf8internal20InitProtobufDefaultsEv\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZNSt10_HashtableIPKcSt4pairIKS1_PFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaISE_ENSt8__detail10_Select1stEN6google8protobuf5streqENSJ_4hashIS1_EENSG_18_Mod_range_hashingENSG_20_Default_ranged_hashENSG_20_Prime_rehash_policyENSG_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTables20AddEnumValueByNumberEPKNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE14_M_replace_auxEmmmc\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn25pbft_persistent_operationC1EmmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_12storage_baseEEm\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn25pbft_persistent_operationEE9constructIS2_JRmS5_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS1_12storage_baseEEmEEEvPT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTables20AddEnumValueByNumberEPKNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZNSt10_HashtableIPKcSt4pairIKS1_N6google8protobuf6SymbolEESaIS7_ENSt8__detail10_Select1stENS5_5streqENS5_4hashIS1_EENS9_18_Mod_range_hashingENS9_20_Default_ranged_hashENS9_20_Prime_rehash_policyENS9_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_\n   fun:_ZN6google8protobuf8internal24OnShutdownDestroyMessageEPKv\n   fun:_ZN25protobuf_database_2eprotoL28InitDefaultsdatabase_requestEv\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN6google8protobuf8internal7InitSCCEPNS1_11SCCInfoBaseE\n   fun:_ZN25protobuf_database_2eproto12InitDefaultsEv\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables19AllocateOnceDynamicEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables19AllocateOnceDynamicEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n   fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv\n   fun:__pthread_once_slow\n   fun:_ZSt9call_onceIRPFvPKN6google8protobuf15FieldDescriptorEEJRS4_EEvRSt9once_flagOT_DpOT0_\n   fun:_ZNK6google8protobuf8internal26GeneratedMessageReflection6HasBitERKNS0_7MessageEPKNS0_15FieldDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables19AllocateOnceDynamicEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn6cryptoC1ESt10shared_ptrINS_12options_baseEES1_INS_12monitor_baseEE\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn6cryptoEE9constructIS2_JRSt10shared_ptrINS1_12options_baseEERS5_INS1_12mock_monitorEEEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn6cryptoEEE9constructIS1_JRSt10shared_ptrINS0_12options_baseEERS5_INS0_12mock_monitorEEEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn6cryptoESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRSt10shared_ptrINS0_12options_baseEERS7_INS0_12mock_monitorEEEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn6cryptoESaIS5_EJRSt10shared_ptrINS4_12options_baseEERS7_INS4_12mock_monitorEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n   fun:_ZNSt12__shared_ptrIN3bzn6cryptoELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJRSt10shared_ptrINS0_12options_baseEERS7_INS0_12mock_monitorEEEEESt19_Sp_make_shared_tagRKT_DpOT0_\n   fun:_ZNSt10shared_ptrIN3bzn6cryptoEEC1ISaIS1_EJRS_INS0_12options_baseEERS_INS0_12mock_monitorEEEEESt19_Sp_make_shared_tagRKT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv\n   fun:open_record<const boost::log::v2s_mt_posix::attribute_set&>\n   fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn6cryptoC1ESt10shared_ptrINS_12options_baseEES1_INS_12monitor_baseEE\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn6cryptoEE9constructIS2_JRSt10shared_ptrINS1_12options_baseEERS5_INS1_12mock_monitorEEEEEvPT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables7AddFileEPKNS0_14FileDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf15UnknownFieldSet16default_instanceEv\n   fun:_ZNK6google8protobuf10TextFormat7Printer5PrintERKNS0_7MessageEPNS2_13TextGeneratorE\n   fun:_ZNK6google8protobuf10TextFormat7Printer10PrintFieldERKNS0_7MessageEPKNS0_10ReflectionEPKNS0_15FieldDescriptorEPNS2_13TextGeneratorE\n   fun:_ZNK6google8protobuf10TextFormat7Printer5PrintERKNS0_7MessageEPNS2_13TextGeneratorE\n   fun:_ZNK6google8protobuf10TextFormat7Printer5PrintERKNS0_7MessageEPNS0_2io20ZeroCopyOutputStreamE\n   fun:_ZNK6google8protobuf10TextFormat7Printer13PrintToStringERKNS0_7MessageEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf7Message16ShortDebugStringB5cxx11Ev\n   fun:_ZN3bzn4pbft14handle_messageERK8pbft_msgRK12bzn_envelope\n   fun:_ZN3bzn4test47pbft_test_test_preprepare_triggers_prepare_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNSt6vectorIPN6google8protobuf7MessageESaIS3_EE17_M_realloc_insertIJS3_EEEvN9__gnu_cxx17__normal_iteratorIPS3_S5_EEDpOT_\n   fun:_ZN6google8protobuf17DescriptorBuilder15AllocateOptionsINS0_15FieldDescriptorEEEvRKNT_11OptionsTypeEPS4_i\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn6cryptoC1ESt10shared_ptrINS_12options_baseEES1_INS_12monitor_baseEE\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn6cryptoEE9constructIS2_JRSt10shared_ptrINS1_12options_baseEERS5_INS1_12mock_monitorEEEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn6cryptoEEE9constructIS1_JRSt10shared_ptrINS0_12options_baseEERS5_INS0_12mock_monitorEEEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn6cryptoESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRSt10shared_ptrINS0_12options_baseEERS7_INS0_12mock_monitorEEEEES2_DpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn6cryptoC1ESt10shared_ptrINS_12options_baseEES1_INS_12monitor_baseEE\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn6cryptoEE9constructIS2_JRSt10shared_ptrINS1_12options_baseEERS5_INS1_12mock_monitorEEEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn6cryptoEEE9constructIS1_JRSt10shared_ptrINS0_12options_baseEERS5_INS0_12mock_monitorEEEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn6cryptoESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRSt10shared_ptrINS0_12options_baseEERS7_INS0_12mock_monitorEEEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn6cryptoESaIS5_EJRSt10shared_ptrINS4_12options_baseEERS7_INS4_12mock_monitorEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorINSt8__detail10_Hash_nodeISt4pairIKjPFvPvEELb0EEEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaINSt8__detail10_Hash_nodeISt4pairIKjPFvPvEELb0EEEEE8allocateERS9_m\n   fun:_ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeISt4pairIKjPFvPvEELb0EEEEE16_M_allocate_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESF_IJEEEEEPS8_DpOT_\n   fun:_ZNSt8__detail9_Map_baseIjSt4pairIKjPFvPvEESaIS6_ENS_10_Select1stESt8equal_toIjESt4hashIjENS_18_Mod_range_hashingENS_20_Default_ranged_hashENS_20_Prime_rehash_policyENS_17_Hashtable_traitsILb0ELb0ELb1EEELb1EEixERS2_\n   fun:_ZNSt13unordered_mapIjPFvPvESt4hashIjESt8equal_toIjESaISt4pairIKjS2_EEEixERS8_\n   fun:_ZN7rocksdb14ThreadLocalPtr10StaticMeta10SetHandlerEjPFvPvE\n   fun:_ZN7rocksdb14ThreadLocalPtrC1EPFvPvE\n   fun:_ZN7rocksdb16ColumnFamilyDataC1EjRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_7VersionEPNS_5CacheEPNS_18WriteBufferManagerERKNS_19ColumnFamilyOptionsERKNS_18ImmutableDBOptionsERKNS_10EnvOptionsEPNS_15ColumnFamilySetE\n   fun:_ZN7rocksdb15ColumnFamilySetC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS_18ImmutableDBOptionsERKNS_10EnvOptionsEPNS_5CacheEPNS_18WriteBufferManagerEPNS_15WriteControllerE\n   fun:_ZN7rocksdb10VersionSetC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS_18ImmutableDBOptionsERKNS_10EnvOptionsEPNS_5CacheEPNS_18WriteBufferManagerEPNS_15WriteControllerE\n   fun:_ZN7rocksdb6DBImplC1ERKNS_9DBOptionsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIPNSt8__detail15_Hash_node_baseEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIPNSt8__detail15_Hash_node_baseEEE8allocateERS3_m\n   fun:_ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeISt4pairIKjPFvPvEELb0EEEEE19_M_allocate_bucketsEm\n   fun:_ZNSt10_HashtableIjSt4pairIKjPFvPvEESaIS5_ENSt8__detail10_Select1stESt8equal_toIjESt4hashIjENS7_18_Mod_range_hashingENS7_20_Default_ranged_hashENS7_20_Prime_rehash_policyENS7_17_Hashtable_traitsILb0ELb0ELb1EEEE19_M_allocate_bucketsEm\n   fun:_ZNSt10_HashtableIjSt4pairIKjPFvPvEESaIS5_ENSt8__detail10_Select1stESt8equal_toIjESt4hashIjENS7_18_Mod_range_hashingENS7_20_Default_ranged_hashENS7_20_Prime_rehash_policyENS7_17_Hashtable_traitsILb0ELb0ELb1EEEE13_M_rehash_auxEmSt17integral_constantIbLb1EE\n   fun:_ZNSt10_HashtableIjSt4pairIKjPFvPvEESaIS5_ENSt8__detail10_Select1stESt8equal_toIjESt4hashIjENS7_18_Mod_range_hashingENS7_20_Default_ranged_hashENS7_20_Prime_rehash_policyENS7_17_Hashtable_traitsILb0ELb0ELb1EEEE9_M_rehashEmRKm\n   fun:_ZNSt10_HashtableIjSt4pairIKjPFvPvEESaIS5_ENSt8__detail10_Select1stESt8equal_toIjESt4hashIjENS7_18_Mod_range_hashingENS7_20_Default_ranged_hashENS7_20_Prime_rehash_policyENS7_17_Hashtable_traitsILb0ELb0ELb1EEEE21_M_insert_unique_nodeEmmPNS7_10_Hash_nodeIS5_Lb0EEE\n   fun:_ZNSt8__detail9_Map_baseIjSt4pairIKjPFvPvEESaIS6_ENS_10_Select1stESt8equal_toIjESt4hashIjENS_18_Mod_range_hashingENS_20_Default_ranged_hashENS_20_Prime_rehash_policyENS_17_Hashtable_traitsILb0ELb0ELb1EEELb1EEixERS2_\n   fun:_ZNSt13unordered_mapIjPFvPvESt4hashIjESt8equal_toIjESaISt4pairIKjS2_EEEixERS8_\n   fun:_ZN7rocksdb14ThreadLocalPtr10StaticMeta10SetHandlerEjPFvPvE\n   fun:_ZN7rocksdb14ThreadLocalPtrC1EPFvPvE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorINSt8__detail10_Hash_nodeISt4pairIKjPFvPvEELb0EEEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaINSt8__detail10_Hash_nodeISt4pairIKjPFvPvEELb0EEEEE8allocateERS9_m\n   fun:_ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeISt4pairIKjPFvPvEELb0EEEEE16_M_allocate_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESF_IJEEEEEPS8_DpOT_\n   fun:_ZNSt8__detail9_Map_baseIjSt4pairIKjPFvPvEESaIS6_ENS_10_Select1stESt8equal_toIjESt4hashIjENS_18_Mod_range_hashingENS_20_Default_ranged_hashENS_20_Prime_rehash_policyENS_17_Hashtable_traitsILb0ELb0ELb1EEELb1EEixERS2_\n   fun:_ZNSt13unordered_mapIjPFvPvESt4hashIjESt8equal_toIjESaISt4pairIKjS2_EEEixERS8_\n   fun:_ZN7rocksdb14ThreadLocalPtr10StaticMeta10SetHandlerEjPFvPvE\n   fun:_ZN7rocksdb14ThreadLocalPtrC1EPFvPvE\n   fun:_ZN7rocksdb16ColumnFamilyDataC1EjRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_7VersionEPNS_5CacheEPNS_18WriteBufferManagerERKNS_19ColumnFamilyOptionsERKNS_18ImmutableDBOptionsERKNS_10EnvOptionsEPNS_15ColumnFamilySetE\n   fun:_ZN7rocksdb15ColumnFamilySet18CreateColumnFamilyERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjPNS_7VersionERKNS_19ColumnFamilyOptionsE\n   fun:_ZN7rocksdb10VersionSet18CreateColumnFamilyERKNS_19ColumnFamilyOptionsEPNS_11VersionEditE\n   fun:_ZN7rocksdb10VersionSet7RecoverERKSt6vectorINS_22ColumnFamilyDescriptorESaIS2_EEb\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm\n   fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm\n   fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNSt6vectorIN6google8protobuf14DescriptorPool6Tables10CheckPointESaIS4_EE17_M_realloc_insertIJS4_EEEvN9__gnu_cxx17__normal_iteratorIPS4_S6_EEDpOT_\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AddCheckpointEv\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables7AddFileEPKNS0_14FileDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n   fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv\n   fun:__pthread_once_slow\n   fun:_ZSt9call_onceIRPFvPKN6google8protobuf15FieldDescriptorEEJRS4_EEvRSt9once_flagOT_DpOT0_\n   fun:_ZNK6google8protobuf8internal26GeneratedMessageReflection6HasBitERKNS0_7MessageEPKNS0_15FieldDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables7AddFileEPKNS0_14FileDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n   fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv\n   fun:__pthread_once_slow\n   fun:_ZSt9call_onceIRPFvPKN6google8protobuf15FieldDescriptorEEJRS4_EEvRSt9once_flagOT_DpOT0_\n   fun:_ZNK6google8protobuf8internal26GeneratedMessageReflection6HasBitERKNS0_7MessageEPKNS0_15FieldDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n   fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv\n   fun:__pthread_once_slow\n   fun:_ZSt9call_onceIRPFvPKN6google8protobuf15FieldDescriptorEEJRS4_EEvRSt9once_flagOT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n   fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNSt6vectorIPN6google8protobuf20FileDescriptorTablesESaIS3_EE17_M_realloc_insertIJRKS3_EEEvN9__gnu_cxx17__normal_iteratorIPS3_S5_EEDpOT_\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables7AddFileEPKNS0_14FileDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables19AllocateOnceDynamicEv\n   fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE14_M_replace_auxEmmmc\n   fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPoolC1EPNS0_18DescriptorDatabaseEPNS1_14ErrorCollectorE\n   fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6TablesC1Ev\n   fun:_ZN6google8protobuf14DescriptorPoolC1EPNS0_18DescriptorDatabaseEPNS1_14ErrorCollectorE\n   fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n   fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n   fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n   fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n   fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf6StructC1Ev\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n   fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv\n   fun:__pthread_once_slow\n   fun:_ZSt9call_onceIRPFvPKN6google8protobuf15FieldDescriptorEEJRS4_EEvRSt9once_flagOT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n   fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n   fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE14_M_replace_auxEmmmc\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_\n   fun:_ZN6google8protobuf8internal20InitProtobufDefaultsEv\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNSt6vectorISt4pairIPKN6google8protobuf8MetadataES5_ESaIS6_EE17_M_realloc_insertIJS6_EEEvN9__gnu_cxx17__normal_iteratorIPS6_S8_EEDpOT_\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n   fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf17DescriptorBuilder15AllocateOptionsINS0_15FieldDescriptorEEEvRKNT_11OptionsTypeEPS4_i\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIPNSt8__detail15_Hash_node_baseEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIPNSt8__detail15_Hash_node_baseEEE8allocateERS3_m\n   fun:_ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeIPN7rocksdb16ThreadStatusDataELb0EEEEE19_M_allocate_bucketsEm\n   fun:_ZNSt10_HashtableIPN7rocksdb16ThreadStatusDataES2_SaIS2_ENSt8__detail9_IdentityESt8equal_toIS2_ESt4hashIS2_ENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb1ELb1EEEE19_M_allocate_bucketsEm\n   fun:_ZNSt10_HashtableIPN7rocksdb16ThreadStatusDataES2_SaIS2_ENSt8__detail9_IdentityESt8equal_toIS2_ESt4hashIS2_ENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb1ELb1EEEE13_M_rehash_auxEmSt17integral_constantIbLb1EE\n   fun:_ZNSt10_HashtableIPN7rocksdb16ThreadStatusDataES2_SaIS2_ENSt8__detail9_IdentityESt8equal_toIS2_ESt4hashIS2_ENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb1ELb1EEEE9_M_rehashEmRKm\n   fun:_ZNSt10_HashtableIPN7rocksdb16ThreadStatusDataES2_SaIS2_ENSt8__detail9_IdentityESt8equal_toIS2_ESt4hashIS2_ENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb1ELb1EEEE21_M_insert_unique_nodeEmmPNS4_10_Hash_nodeIS2_Lb0EEE\n   fun:_ZNSt10_HashtableIPN7rocksdb16ThreadStatusDataES2_SaIS2_ENSt8__detail9_IdentityESt8equal_toIS2_ESt4hashIS2_ENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb1ELb1EEEE9_M_insertIRKS2_NS4_10_AllocNodeISaINS4_10_Hash_nodeIS2_Lb0EEEEEEEESt4pairINS4_14_Node_iteratorIS2_Lb1ELb0EEEbEOT_RKT0_St17integral_constantIbLb1EE\n   fun:_ZNSt8__detail12_Insert_baseIPN7rocksdb16ThreadStatusDataES3_SaIS3_ENS_9_IdentityESt8equal_toIS3_ESt4hashIS3_ENS_18_Mod_range_hashingENS_20_Default_ranged_hashENS_20_Prime_rehash_policyENS_17_Hashtable_traitsILb0ELb1ELb1EEEE6insertERKS3_\n   fun:_ZNSt13unordered_setIPN7rocksdb16ThreadStatusDataESt4hashIS2_ESt8equal_toIS2_ESaIS2_EE6insertERKS2_\n   fun:_ZN7rocksdb19ThreadStatusUpdater14RegisterThreadENS_12ThreadStatus10ThreadTypeEm\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n   fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv\n   fun:__pthread_once_slow\n   fun:_ZSt9call_onceIRPFvPKN6google8protobuf15FieldDescriptorEEJRS4_EEvRSt9once_flagOT_DpOT0_\n   fun:_ZNK6google8protobuf8internal26GeneratedMessageReflection6HasBitERKNS0_7MessageEPKNS0_15FieldDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTables20AddEnumValueByNumberEPKNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZNSt10_HashtableIPKcSt4pairIKS1_PFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaISE_ENSt8__detail10_Select1stEN6google8protobuf5streqENSJ_4hashIS1_EENSG_18_Mod_range_hashingENSG_20_Default_ranged_hashENSG_20_Prime_rehash_policyENSG_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTables20AddEnumValueByNumberEPKNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7rocksdb12_GLOBAL__N_125CreateThreadStatusUpdaterEv\n   fun:_ZN7rocksdb12_GLOBAL__N_18PosixEnvC1Ev\n   fun:_ZN7rocksdb3Env7DefaultEv\n   fun:_ZN7rocksdb9DBOptionsC1Ev\n   fun:_ZN7rocksdb7OptionsC1Ev\n   fun:_ZN3bzn15rocksdb_storage4openEv\n   fun:_ZN3bzn15rocksdb_storageC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_S8_\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn15rocksdb_storageEE9constructIS2_JRA3_KcRA6_S5_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn15rocksdb_storageEEE9constructIS1_JRA3_KcRA6_S5_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn15rocksdb_storageESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRA3_KcRA6_S7_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn15rocksdb_storageESaIS5_EJRA3_KcRA6_S7_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7rocksdb14ThreadLocalPtr8InstanceEv\n   fun:_ZN7rocksdb14ThreadLocalPtr14InitSingletonsEv\n   fun:_ZN7rocksdb3Env7DefaultEv\n   fun:_ZN7rocksdb9DBOptionsC1Ev\n   fun:_ZN7rocksdb7OptionsC1Ev\n   fun:_ZN3bzn15rocksdb_storage4openEv\n   fun:_ZN3bzn15rocksdb_storageC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_S8_\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn15rocksdb_storageEE9constructIS2_JRA3_KcRA6_S5_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn15rocksdb_storageEEE9constructIS1_JRA3_KcRA6_S5_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn15rocksdb_storageESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRA3_KcRA6_S7_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn15rocksdb_storageESaIS5_EJRA3_KcRA6_S7_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn6cryptoC1ESt10shared_ptrINS_12options_baseEES1_INS_12monitor_baseEE\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn6cryptoEE9constructIS2_JRSt10shared_ptrINS1_12options_baseEERS5_INS1_12mock_monitorEEEEEvPT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n   fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n   fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv\n   fun:__pthread_once_slow\n   fun:_ZSt9call_onceIRPFvPKN6google8protobuf15FieldDescriptorEEJRS4_EEvRSt9once_flagOT_DpOT0_\n   fun:_ZNK6google8protobuf8internal26GeneratedMessageReflection6HasBitERKNS0_7MessageEPKNS0_15FieldDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTables20AddEnumValueByNumberEPKNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n   fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n   fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n   fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZNSt10_HashtableIPKcSt4pairIKS1_N6google8protobuf6SymbolEESaIS7_ENSt8__detail10_Select1stENS5_5streqENS5_4hashIS1_EENS9_18_Mod_range_hashingENS9_20_Default_ranged_hashENS9_20_Prime_rehash_policyENS9_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_\n   fun:_ZN6google8protobuf8internal24OnShutdownDestroyMessageEPKv\n   fun:_ZN25protobuf_database_2eprotoL28InitDefaultsdatabase_requestEv\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN6google8protobuf8internal7InitSCCEPNS1_11SCCInfoBaseE\n   fun:_ZN25protobuf_database_2eproto12InitDefaultsEv\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE14_M_replace_auxEmmmc\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables19AllocateOnceDynamicEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn6status29handle_status_request_messageERK12bzn_envelopeSt10shared_ptrINS_12session_baseEE\n   fun:_ZSt13__invoke_implIvRMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEERS5_IS1_EJS4_S7_EET_St21__invoke_memfun_derefOT0_OT1_DpOT2_\n   fun:_ZSt8__invokeIRMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEEJRS5_IS1_ES4_S7_EENSt15__invoke_resultIT_JDpT0_EE4typeEOSE_DpOSF_\n   fun:_ZNSt5_BindIFMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEES5_IS1_ESt12_PlaceholderILi1EESB_ILi2EEEE6__callIvJS4_OS7_EJLm0ELm1ELm2EEEET_OSt5tupleIJDpT0_EESt12_Index_tupleIJXspT1_EEE\n   fun:_ZNSt5_BindIFMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEES5_IS1_ESt12_PlaceholderILi1EESB_ILi2EEEEclIJS4_S7_EvEET0_DpOT_\n   fun:_ZNSt17_Function_handlerIFvRK12bzn_envelopeSt10shared_ptrIN3bzn12session_baseEEESt5_BindIFMNS4_6statusEFvS2_S6_ES3_IS9_ESt12_PlaceholderILi1EESD_ILi2EEEEE9_M_invokeERKSt9_Any_dataS2_OS6_\n   fun:_ZNKSt8functionIFvRK12bzn_envelopeSt10shared_ptrIN3bzn12session_baseEEEEclES2_S6_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv\n   fun:open_record<const boost::log::v2s_mt_posix::attribute_set&>\n   fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn6status29handle_status_request_messageERK12bzn_envelopeSt10shared_ptrINS_12session_baseEE\n   fun:_ZSt13__invoke_implIvRMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEERS5_IS1_EJS4_S7_EET_St21__invoke_memfun_derefOT0_OT1_DpOT2_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNSt6vectorIPN6google8protobuf20FileDescriptorTablesESaIS3_EE17_M_realloc_insertIJRKS3_EEEvN9__gnu_cxx17__normal_iteratorIPS3_S5_EEDpOT_\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables7AddFileEPKNS0_14FileDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf15UnknownFieldSet16default_instanceEv\n   fun:_ZNK6google8protobuf10TextFormat7Printer5PrintERKNS0_7MessageEPNS2_13TextGeneratorE\n   fun:_ZNK6google8protobuf10TextFormat7Printer5PrintERKNS0_7MessageEPNS0_2io20ZeroCopyOutputStreamE\n   fun:_ZNK6google8protobuf10TextFormat7Printer13PrintToStringERKNS0_7MessageEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf7Message11DebugStringB5cxx11Ev\n   fun:_ZN3bzn6status29handle_status_request_messageERK12bzn_envelopeSt10shared_ptrINS_12session_baseEE\n   fun:_ZSt13__invoke_implIvRMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEERS5_IS1_EJS4_S7_EET_St21__invoke_memfun_derefOT0_OT1_DpOT2_\n   fun:_ZSt8__invokeIRMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEEJRS5_IS1_ES4_S7_EENSt15__invoke_resultIT_JDpT0_EE4typeEOSE_DpOSF_\n   fun:_ZNSt5_BindIFMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEES5_IS1_ESt12_PlaceholderILi1EESB_ILi2EEEE6__callIvJS4_OS7_EJLm0ELm1ELm2EEEET_OSt5tupleIJDpT0_EESt12_Index_tupleIJXspT1_EEE\n   fun:_ZNSt5_BindIFMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEES5_IS1_ESt12_PlaceholderILi1EESB_ILi2EEEEclIJS4_S7_EvEET0_DpOT_\n   fun:_ZNSt17_Function_handlerIFvRK12bzn_envelopeSt10shared_ptrIN3bzn12session_baseEEESt5_BindIFMNS4_6statusEFvS2_S6_ES3_IS9_ESt12_PlaceholderILi1EESD_ILi2EEEEE9_M_invokeERKSt9_Any_dataS2_OS6_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn6status29handle_status_request_messageERK12bzn_envelopeSt10shared_ptrINS_12session_baseEE\n   fun:_ZSt13__invoke_implIvRMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEERS5_IS1_EJS4_S7_EET_St21__invoke_memfun_derefOT0_OT1_DpOT2_\n   fun:_ZSt8__invokeIRMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEEJRS5_IS1_ES4_S7_EENSt15__invoke_resultIT_JDpT0_EE4typeEOSE_DpOSF_\n   fun:_ZNSt5_BindIFMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEES5_IS1_ESt12_PlaceholderILi1EESB_ILi2EEEE6__callIvJS4_OS7_EJLm0ELm1ELm2EEEET_OSt5tupleIJDpT0_EESt12_Index_tupleIJXspT1_EEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNSt6vectorISt4pairIPKN6google8protobuf8MetadataES5_ESaIS6_EE17_M_realloc_insertIJS6_EEEvN9__gnu_cxx17__normal_iteratorIPS6_S8_EEDpOT_\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn6status29handle_status_request_messageERK12bzn_envelopeSt10shared_ptrINS_12session_baseEE\n   fun:_ZSt13__invoke_implIvRMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEERS5_IS1_EJS4_S7_EET_St21__invoke_memfun_derefOT0_OT1_DpOT2_\n   fun:_ZSt8__invokeIRMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEEJRS5_IS1_ES4_S7_EENSt15__invoke_resultIT_JDpT0_EE4typeEOSE_DpOSF_\n   fun:_ZNSt5_BindIFMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEES5_IS1_ESt12_PlaceholderILi1EESB_ILi2EEEE6__callIvJS4_OS7_EJLm0ELm1ELm2EEEET_OSt5tupleIJDpT0_EESt12_Index_tupleIJXspT1_EEE\n   fun:_ZNSt5_BindIFMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEES5_IS1_ESt12_PlaceholderILi1EESB_ILi2EEEEclIJS4_S7_EvEET0_DpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN23protobuf_status_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZNSt6vectorIN6google8protobuf14DescriptorPool6Tables10CheckPointESaIS4_EE17_M_realloc_insertIJS4_EEEvN9__gnu_cxx17__normal_iteratorIPS4_S6_EEDpOT_\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AddCheckpointEv\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables7AddFileEPKNS0_14FileDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPoolC1EPNS0_18DescriptorDatabaseEPNS1_14ErrorCollectorE\n   fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6TablesC1Ev\n   fun:_ZN6google8protobuf14DescriptorPoolC1EPNS0_18DescriptorDatabaseEPNS1_14ErrorCollectorE\n   fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf6StructC1Ev\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_\n   fun:_ZN6google8protobuf8internal20InitProtobufDefaultsEv\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN23protobuf_status_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZNSt10_HashtableIPKcSt4pairIKS1_N6google8protobuf6SymbolEESaIS7_ENSt8__detail10_Select1stENS5_5streqENS5_4hashIS1_EENS9_18_Mod_range_hashingENS9_20_Default_ranged_hashENS9_20_Prime_rehash_policyENS9_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE14_M_replace_auxEmmmc\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN23protobuf_status_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZNSt10_HashtableIPKcSt4pairIKS1_PFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaISE_ENSt8__detail10_Select1stEN6google8protobuf5streqENSJ_4hashIS1_EENSG_18_Mod_range_hashingENSG_20_Default_ranged_hashENSG_20_Prime_rehash_policyENSG_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE\n   fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE\n   fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn6status29handle_status_request_messageERK12bzn_envelopeSt10shared_ptrINS_12session_baseEE\n   fun:_ZSt13__invoke_implIvRMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEERS5_IS1_EJS4_S7_EET_St21__invoke_memfun_derefOT0_OT1_DpOT2_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi\n   fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_\n   fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE\n   fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE\n   fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE\n   fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto12InitDefaultsEv\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn11mem_storage13load_snapshotERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN30storageTest_test_snapshot_TestIN3bzn11mem_storageEE8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv\n   fun:open_record<const boost::log::v2s_mt_posix::attribute_set&>\n   fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn11mem_storage13load_snapshotERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN30storageTest_test_snapshot_TestIN3bzn11mem_storageEE8TestBodyEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn11mem_storage13load_snapshotERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN30storageTest_test_snapshot_TestIN3bzn11mem_storageEE8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn11mem_storage13load_snapshotERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN30storageTest_test_snapshot_TestIN3bzn11mem_storageEE8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n   fun:_ZL14__gthread_oncePiPFvvE\n   fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_\n   fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf6StructC1Ev\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorINSt8__detail10_Hash_nodeISt4pairIKjPFvPvEELb0EEEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaINSt8__detail10_Hash_nodeISt4pairIKjPFvPvEELb0EEEEE8allocateERS9_m\n   fun:_ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeISt4pairIKjPFvPvEELb0EEEEE16_M_allocate_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESF_IJEEEEEPS8_DpOT_\n   fun:_ZNSt8__detail9_Map_baseIjSt4pairIKjPFvPvEESaIS6_ENS_10_Select1stESt8equal_toIjESt4hashIjENS_18_Mod_range_hashingENS_20_Default_ranged_hashENS_20_Prime_rehash_policyENS_17_Hashtable_traitsILb0ELb0ELb1EEELb1EEixERS2_\n   fun:_ZNSt13unordered_mapIjPFvPvESt4hashIjESt8equal_toIjESaISt4pairIKjS2_EEEixERS8_\n   fun:_ZN7rocksdb14ThreadLocalPtr10StaticMeta10SetHandlerEjPFvPvE\n   fun:_ZN7rocksdb14ThreadLocalPtrC1EPFvPvE\n   fun:_ZN7rocksdb16ColumnFamilyDataC1EjRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_7VersionEPNS_5CacheEPNS_18WriteBufferManagerERKNS_19ColumnFamilyOptionsERKNS_18ImmutableDBOptionsERKNS_10EnvOptionsEPNS_15ColumnFamilySetE\n   fun:_ZN7rocksdb15ColumnFamilySetC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS_18ImmutableDBOptionsERKNS_10EnvOptionsEPNS_5CacheEPNS_18WriteBufferManagerEPNS_15WriteControllerE\n   fun:_ZN7rocksdb10VersionSetC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS_18ImmutableDBOptionsERKNS_10EnvOptionsEPNS_5CacheEPNS_18WriteBufferManagerEPNS_15WriteControllerE\n   fun:_ZN7rocksdb6DBImplC1ERKNS_9DBOptionsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorINSt8__detail10_Hash_nodeISt4pairIKjPFvPvEELb0EEEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaINSt8__detail10_Hash_nodeISt4pairIKjPFvPvEELb0EEEEE8allocateERS9_m\n   fun:_ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeISt4pairIKjPFvPvEELb0EEEEE16_M_allocate_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESF_IJEEEEEPS8_DpOT_\n   fun:_ZNSt8__detail9_Map_baseIjSt4pairIKjPFvPvEESaIS6_ENS_10_Select1stESt8equal_toIjESt4hashIjENS_18_Mod_range_hashingENS_20_Default_ranged_hashENS_20_Prime_rehash_policyENS_17_Hashtable_traitsILb0ELb0ELb1EEELb1EEixERS2_\n   fun:_ZNSt13unordered_mapIjPFvPvESt4hashIjESt8equal_toIjESaISt4pairIKjS2_EEEixERS8_\n   fun:_ZN7rocksdb14ThreadLocalPtr10StaticMeta10SetHandlerEjPFvPvE\n   fun:_ZN7rocksdb14ThreadLocalPtrC1EPFvPvE\n   fun:_ZN7rocksdb16ColumnFamilyDataC1EjRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_7VersionEPNS_5CacheEPNS_18WriteBufferManagerERKNS_19ColumnFamilyOptionsERKNS_18ImmutableDBOptionsERKNS_10EnvOptionsEPNS_15ColumnFamilySetE\n   fun:_ZN7rocksdb15ColumnFamilySet18CreateColumnFamilyERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjPNS_7VersionERKNS_19ColumnFamilyOptionsE\n   fun:_ZN7rocksdb10VersionSet18CreateColumnFamilyERKNS_19ColumnFamilyOptionsEPNS_11VersionEditE\n   fun:_ZN7rocksdb10VersionSet7RecoverERKSt6vectorINS_22ColumnFamilyDescriptorESaIS2_EEb\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIPNSt8__detail15_Hash_node_baseEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIPNSt8__detail15_Hash_node_baseEEE8allocateERS3_m\n   fun:_ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeISt4pairIKjPFvPvEELb0EEEEE19_M_allocate_bucketsEm\n   fun:_ZNSt10_HashtableIjSt4pairIKjPFvPvEESaIS5_ENSt8__detail10_Select1stESt8equal_toIjESt4hashIjENS7_18_Mod_range_hashingENS7_20_Default_ranged_hashENS7_20_Prime_rehash_policyENS7_17_Hashtable_traitsILb0ELb0ELb1EEEE19_M_allocate_bucketsEm\n   fun:_ZNSt10_HashtableIjSt4pairIKjPFvPvEESaIS5_ENSt8__detail10_Select1stESt8equal_toIjESt4hashIjENS7_18_Mod_range_hashingENS7_20_Default_ranged_hashENS7_20_Prime_rehash_policyENS7_17_Hashtable_traitsILb0ELb0ELb1EEEE13_M_rehash_auxEmSt17integral_constantIbLb1EE\n   fun:_ZNSt10_HashtableIjSt4pairIKjPFvPvEESaIS5_ENSt8__detail10_Select1stESt8equal_toIjESt4hashIjENS7_18_Mod_range_hashingENS7_20_Default_ranged_hashENS7_20_Prime_rehash_policyENS7_17_Hashtable_traitsILb0ELb0ELb1EEEE9_M_rehashEmRKm\n   fun:_ZNSt10_HashtableIjSt4pairIKjPFvPvEESaIS5_ENSt8__detail10_Select1stESt8equal_toIjESt4hashIjENS7_18_Mod_range_hashingENS7_20_Default_ranged_hashENS7_20_Prime_rehash_policyENS7_17_Hashtable_traitsILb0ELb0ELb1EEEE21_M_insert_unique_nodeEmmPNS7_10_Hash_nodeIS5_Lb0EEE\n   fun:_ZNSt8__detail9_Map_baseIjSt4pairIKjPFvPvEESaIS6_ENS_10_Select1stESt8equal_toIjESt4hashIjENS_18_Mod_range_hashingENS_20_Default_ranged_hashENS_20_Prime_rehash_policyENS_17_Hashtable_traitsILb0ELb0ELb1EEELb1EEixERS2_\n   fun:_ZNSt13unordered_mapIjPFvPvESt4hashIjESt8equal_toIjESaISt4pairIKjS2_EEEixERS8_\n   fun:_ZN7rocksdb14ThreadLocalPtr10StaticMeta10SetHandlerEjPFvPvE\n   fun:_ZN7rocksdb14ThreadLocalPtrC1EPFvPvE\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_\n   fun:_ZN6google8protobuf8internal20InitProtobufDefaultsEv\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIPNSt8__detail15_Hash_node_baseEE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIPNSt8__detail15_Hash_node_baseEEE8allocateERS3_m\n   fun:_ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeIPN7rocksdb16ThreadStatusDataELb0EEEEE19_M_allocate_bucketsEm\n   fun:_ZNSt10_HashtableIPN7rocksdb16ThreadStatusDataES2_SaIS2_ENSt8__detail9_IdentityESt8equal_toIS2_ESt4hashIS2_ENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb1ELb1EEEE19_M_allocate_bucketsEm\n   fun:_ZNSt10_HashtableIPN7rocksdb16ThreadStatusDataES2_SaIS2_ENSt8__detail9_IdentityESt8equal_toIS2_ESt4hashIS2_ENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb1ELb1EEEE13_M_rehash_auxEmSt17integral_constantIbLb1EE\n   fun:_ZNSt10_HashtableIPN7rocksdb16ThreadStatusDataES2_SaIS2_ENSt8__detail9_IdentityESt8equal_toIS2_ESt4hashIS2_ENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb1ELb1EEEE9_M_rehashEmRKm\n   fun:_ZNSt10_HashtableIPN7rocksdb16ThreadStatusDataES2_SaIS2_ENSt8__detail9_IdentityESt8equal_toIS2_ESt4hashIS2_ENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb1ELb1EEEE21_M_insert_unique_nodeEmmPNS4_10_Hash_nodeIS2_Lb0EEE\n   fun:_ZNSt10_HashtableIPN7rocksdb16ThreadStatusDataES2_SaIS2_ENSt8__detail9_IdentityESt8equal_toIS2_ESt4hashIS2_ENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb1ELb1EEEE9_M_insertIRKS2_NS4_10_AllocNodeISaINS4_10_Hash_nodeIS2_Lb0EEEEEEEESt4pairINS4_14_Node_iteratorIS2_Lb1ELb0EEEbEOT_RKT0_St17integral_constantIbLb1EE\n   fun:_ZNSt8__detail12_Insert_baseIPN7rocksdb16ThreadStatusDataES3_SaIS3_ENS_9_IdentityESt8equal_toIS3_ESt4hashIS3_ENS_18_Mod_range_hashingENS_20_Default_ranged_hashENS_20_Prime_rehash_policyENS_17_Hashtable_traitsILb0ELb1ELb1EEEE6insertERKS3_\n   fun:_ZNSt13unordered_setIPN7rocksdb16ThreadStatusDataESt4hashIS2_ESt8equal_toIS2_ESaIS2_EE6insertERKS2_\n   fun:_ZN7rocksdb19ThreadStatusUpdater14RegisterThreadENS_12ThreadStatus10ThreadTypeEm\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZNSt10_HashtableIPKcSt4pairIKS1_PFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaISE_ENSt8__detail10_Select1stEN6google8protobuf5streqENSJ_4hashIS1_EENSG_18_Mod_range_hashingENSG_20_Default_ranged_hashENSG_20_Prime_rehash_policyENSG_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7rocksdb12_GLOBAL__N_125CreateThreadStatusUpdaterEv\n   fun:_ZN7rocksdb12_GLOBAL__N_18PosixEnvC1Ev\n   fun:_ZN7rocksdb3Env7DefaultEv\n   fun:_ZN7rocksdb9DBOptionsC1Ev\n   fun:_ZN7rocksdb7OptionsC1Ev\n   fun:_ZN3bzn15rocksdb_storage4openEv\n   fun:_ZN3bzn15rocksdb_storageC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_S8_\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn15rocksdb_storageEE9constructIS2_JRA3_KcRA6_S5_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn15rocksdb_storageEEE9constructIS1_JRA3_KcRA6_S5_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn15rocksdb_storageESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRA3_KcRA6_S7_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn15rocksdb_storageESaIS5_EJRA3_KcRA6_S7_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN7rocksdb14ThreadLocalPtr8InstanceEv\n   fun:_ZN7rocksdb14ThreadLocalPtr14InitSingletonsEv\n   fun:_ZN7rocksdb3Env7DefaultEv\n   fun:_ZN7rocksdb9DBOptionsC1Ev\n   fun:_ZN7rocksdb7OptionsC1Ev\n   fun:_ZN3bzn15rocksdb_storage4openEv\n   fun:_ZN3bzn15rocksdb_storageC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_S8_\n   fun:_ZN9__gnu_cxx13new_allocatorIN3bzn15rocksdb_storageEE9constructIS2_JRA3_KcRA6_S5_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEvPT_DpOT0_\n   fun:_ZNSt16allocator_traitsISaIN3bzn15rocksdb_storageEEE9constructIS1_JRA3_KcRA6_S5_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEvRS2_PT_DpOT0_\n   fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn15rocksdb_storageESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRA3_KcRA6_S7_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEES2_DpOT_\n   fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn15rocksdb_storageESaIS5_EJRA3_KcRA6_S7_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn11mem_storage13load_snapshotERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n   fun:_ZN30storageTest_test_snapshot_TestIN3bzn11mem_storageEE8TestBodyEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv\n   fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m\n   fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv\n   fun:__pthread_once_slow\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:call_init\n   fun:_dl_init\n   obj:/lib/x86_64-linux-gnu/ld-2.27.so\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_\n   fun:_ZN6google8protobuf8internal24OnShutdownDestroyMessageEPKv\n   fun:_ZN25protobuf_database_2eprotoL28InitDefaultsdatabase_requestEv\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE\n   fun:_ZN6google8protobuf8internal7InitSCCEPNS1_11SCCInfoBaseE\n   fun:_ZN25protobuf_database_2eproto12InitDefaultsEv\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_\n   fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_\n   fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi\n   fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi\n   fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv\n   fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_\n   fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv\n   fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn5utils6crypto16verify_signatureERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES9_S9_\n   fun:_ZN85util_test_test_that_verifying_a_signature_with_empty_inputs_will_fail_gracefully_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n   fun:_ZN7testing8TestInfo3RunEv\n   fun:_ZN7testing8TestCase3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv\n   fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv\n   fun:open_record<const boost::log::v2s_mt_posix::attribute_set&>\n   fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE\n   fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn5utils6crypto16verify_signatureERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES9_S9_\n   fun:_ZN85util_test_test_that_verifying_a_signature_with_empty_inputs_will_fail_gracefully_Test8TestBodyEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn5utils6crypto16verify_signatureERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES9_S9_\n   fun:_ZN85util_test_test_that_verifying_a_signature_with_empty_inputs_will_fail_gracefully_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn5utils6crypto16verify_signatureERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES9_S9_\n   fun:_ZN85util_test_test_that_verifying_a_signature_with_empty_inputs_will_fail_gracefully_Test8TestBodyEv\n   fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc\n   fun:_ZN7testing4Test3RunEv\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_\n   fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_\n   fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n}\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:_Znwm\n   fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v\n   fun:_ZN5boost6detail25make_external_thread_dataEv\n   fun:_ZN5boost6detail31get_or_make_current_thread_dataEv\n   fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE\n   fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv\n   fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_\n   fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_\n   fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_\n   fun:_ZN3bzn5utils6crypto16verify_signatureERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES9_S9_\n   fun:_ZN85util_test_test_that_verifying_a_signature_with_empty_inputs_will_fail_gracefully_Test8TestBodyEv\n}\n"
  },
  {
    "path": "valgrind/create_suppressions.sh",
    "content": "#!/bin/bash\n\n# $ cd <build_dir>/output\n# $ <source_dir>/valgrind/create_suppressions.sh\n# $ cp bluzelle.supp <source_dir>/valgrind/\n\necho \"Clearing stale valgrind logs & suppression files...\"\n\nrm -f *_tests_valgrind.log *.supp\nrm -f bluzelle.supp\n\nSCRIPT_DIR=\"$( cd \"$( dirname \"$0\" )\" && pwd )\"\n\nfor utest in *_tests\ndo\n\tif valgrind --leak-check=full --show-reachable=yes --error-limit=no --gen-suppressions=all --log-file=${utest}_valgrind.log ./$utest; then\n\t\techo \"Creating suppression file for ${utest}...\"\n\t\tcat ./${utest}_valgrind.log | $SCRIPT_DIR/parse_valgrind_suppressions.sh > ./${utest}.supp\n\t\tcat ./${utest}.supp >> bluzelle.supp\n\telse\n\t\techo \"${utest} exited with an error!!!\"\n\t\texit 1\n\tfi\ndone\n\necho \"Done!\"\n"
  },
  {
    "path": "valgrind/parse_valgrind_suppressions.sh",
    "content": "#! /usr/bin/awk -f\n# A script to extract the actual suppression info from the output of (for example) valgrind --leak-check=full --show-reachable=yes --error-limit=no --gen-suppressions=all ./minimal\n# The desired bits are between ^{ and ^} (including the braces themselves).\n# The combined output should either be appended to /usr/lib/valgrind/default.supp, or placed in a .supp of its own\n# If the latter, either tell valgrind about it each time with --suppressions=<filename>, or add that line to ~/.valgrindrc\n\n# NB This script uses the |& operator, which I believe is gawk-specific. In case of failure, check that you're using gawk rather than some other awk\n\n# The script looks for suppressions. When it finds one it stores it temporarily in an array,\n# and also feeds it line by line to the external app 'md5sum' which generates a unique checksum for it.\n# The checksum is used as an index in a different array. If an item with that index already exists the suppression must be a duplicate and is discarded.\n\nBEGIN { suppression=0; md5sum = \"md5sum\" }\n  # If the line begins with '{', it's the start of a supression; so set the var and initialise things\n  /^{/  {\n           suppression=1;  i=0; next \n        }\n  # If the line begins with '}' its the end of a suppression\n  /^}/  {\n          if (suppression)\n           { suppression=0;\n             close(md5sum, \"to\")  # We've finished sending data to md5sum, so close that part of the pipe\n             ProcessInput()       # Do the slightly-complicated stuff in functions\n             delete supparray     # We don't want subsequent suppressions to append to it!\n           }\n     }\n  # Otherwise, it's a normal line. If we're inside a supression, store it, and pipe it to md5sum. Otherwise it's cruft, so ignore it\n     { if (suppression)\n         { \n            supparray[++i] = $0\n            print |& md5sum\n         }\n     }\n\n\n function ProcessInput()\n {\n    # Pipe the result from md5sum, then close it     \n    md5sum |& getline result\n    close(md5sum)\n    # gawk can't cope with enormous ints like $result would be, so stringify it first by prefixing a definite string\n    resultstring = \"prefix\"result\n\n    if (! (resultstring in chksum_array) )\n      { chksum_array[resultstring] = 0;  # This checksum hasn't been seen before, so add it to the array\n        OutputSuppression()              # and output the contents of the suppression\n      }\n }\n\n function OutputSuppression()\n {\n  # A suppression is surrounded by '{' and '}'. Its data was stored line by line in the array  \n  print \"{\"  \n  for (n=1; n <= i; ++n)\n    { print supparray[n] }\n  print \"}\" \n }\n \n"
  }
]